diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 225c16b9..034bee8b 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -13,3 +13,4 @@ Alex Chau Benjamin Franz Rebecka Gulliksson Rahul Ravikumar +Henning Nielsen Lund diff --git a/library/java/net/openid/appauth/browser/BrowserBlacklist.java b/library/java/net/openid/appauth/browser/BrowserBlacklist.java index d796dc52..ad2ce094 100644 --- a/library/java/net/openid/appauth/browser/BrowserBlacklist.java +++ b/library/java/net/openid/appauth/browser/BrowserBlacklist.java @@ -31,7 +31,8 @@ * * // blacklist Firefox * new BrowserBlacklist( - * VersionedBrowserMatcher.FIREFOX_BROWSER); + * VersionedBrowserMatcher.FIREFOX_BROWSER, + * VersionedBrowserMatcher.FIREFOX_CUSTOM_TAB); * * // blacklist Dolphin Browser * new BrowserBlacklist( diff --git a/library/java/net/openid/appauth/browser/BrowserSelector.java b/library/java/net/openid/appauth/browser/BrowserSelector.java index bdc63dd6..e5b9bdb1 100644 --- a/library/java/net/openid/appauth/browser/BrowserSelector.java +++ b/library/java/net/openid/appauth/browser/BrowserSelector.java @@ -76,11 +76,17 @@ public final class BrowserSelector { public static List getAllBrowsers(Context context) { PackageManager pm = context.getPackageManager(); List browsers = new ArrayList<>(); + String defaultBrowserPackage = null; int queryFlag = PackageManager.GET_RESOLVED_FILTER; if (VERSION.SDK_INT >= VERSION_CODES.M) { queryFlag |= PackageManager.MATCH_ALL; } + ResolveInfo resolvedDefaultActivity = + pm.resolveActivity(BROWSER_INTENT, 0); + if (resolvedDefaultActivity != null) { + defaultBrowserPackage = resolvedDefaultActivity.activityInfo.packageName; + } List resolvedActivityList = pm.queryIntentActivities(BROWSER_INTENT, queryFlag); @@ -91,15 +97,29 @@ public static List getAllBrowsers(Context context) { } try { + int defaultBrowserIndex = 0; PackageInfo packageInfo = pm.getPackageInfo( info.activityInfo.packageName, PackageManager.GET_SIGNATURES); if (hasWarmupService(pm, info.activityInfo.packageName)) { - browsers.add(new BrowserDescriptor(packageInfo, true)); + BrowserDescriptor customTabBrowserDescriptor = + new BrowserDescriptor(packageInfo, true); + if (info.activityInfo.packageName.equals(defaultBrowserPackage)) { + browsers.add(defaultBrowserIndex, customTabBrowserDescriptor); + defaultBrowserIndex++; + } else { + browsers.add(customTabBrowserDescriptor); + } } - browsers.add(new BrowserDescriptor(packageInfo, false)); + BrowserDescriptor fullBrowserDescriptor = + new BrowserDescriptor(packageInfo, false); + if (info.activityInfo.packageName.equals(defaultBrowserPackage)) { + browsers.add(defaultBrowserIndex, fullBrowserDescriptor); + } else { + browsers.add(fullBrowserDescriptor); + } } catch (NameNotFoundException e) { // a descriptor cannot be generated without the package info } diff --git a/library/java/net/openid/appauth/browser/Browsers.java b/library/java/net/openid/appauth/browser/Browsers.java index bcf28d61..c0acab34 100644 --- a/library/java/net/openid/appauth/browser/Browsers.java +++ b/library/java/net/openid/appauth/browser/Browsers.java @@ -62,7 +62,7 @@ public static BrowserDescriptor standaloneBrowser(@NonNull String version) { } /** - * Creates a browser descriptor fot the specified version of Chrome, when used as + * Creates a browser descriptor for the specified version of Chrome, when used as * a custom tab. */ public static BrowserDescriptor customTab(@NonNull String version) { @@ -97,6 +97,12 @@ public static final class Firefox { public static final Set SIGNATURE_SET = Collections.singleton(SIGNATURE_HASH); + /** + * The version in which Custom Tabs were introduced in Firefox. + */ + public static final DelimitedVersion MINIMUM_VERSION_FOR_CUSTOM_TAB = + DelimitedVersion.parse("57"); + /** * Creates a browser descriptor for the specified version of Firefox, when used * as a standalone browser. @@ -105,6 +111,14 @@ public static BrowserDescriptor standaloneBrowser(@NonNull String version) { return new BrowserDescriptor(PACKAGE_NAME, SIGNATURE_SET, version, false); } + /** + * Creates a browser descriptor for the specified version of Firefox, when used as + * a custom tab. + */ + public static BrowserDescriptor customTab(@NonNull String version) { + return new BrowserDescriptor(PACKAGE_NAME, SIGNATURE_SET, version, true); + } + private Firefox() { // no need to construct this class } diff --git a/library/java/net/openid/appauth/browser/VersionedBrowserMatcher.java b/library/java/net/openid/appauth/browser/VersionedBrowserMatcher.java index 85deeaed..5386c327 100644 --- a/library/java/net/openid/appauth/browser/VersionedBrowserMatcher.java +++ b/library/java/net/openid/appauth/browser/VersionedBrowserMatcher.java @@ -43,6 +43,15 @@ public class VersionedBrowserMatcher implements BrowserMatcher { false, VersionRange.ANY_VERSION); + /** + * Matches any version of Firefox for use as a custom tab. + */ + public static final VersionedBrowserMatcher FIREFOX_CUSTOM_TAB = new VersionedBrowserMatcher( + Browsers.Firefox.PACKAGE_NAME, + Browsers.Firefox.SIGNATURE_SET, + true, + VersionRange.atLeast(Browsers.Firefox.MINIMUM_VERSION_FOR_CUSTOM_TAB)); + /** * Matches any version of Mozilla Firefox. */ diff --git a/library/javatests/net/openid/appauth/browser/BrowserWhitelistTest.java b/library/javatests/net/openid/appauth/browser/BrowserWhitelistTest.java index b95a0d6a..7e3a988a 100644 --- a/library/javatests/net/openid/appauth/browser/BrowserWhitelistTest.java +++ b/library/javatests/net/openid/appauth/browser/BrowserWhitelistTest.java @@ -31,6 +31,7 @@ public void testMatches_emptyWhitelist() { BrowserWhitelist whitelist = new BrowserWhitelist(); assertThat(whitelist.matches(Browsers.Chrome.customTab("46"))).isFalse(); assertThat(whitelist.matches(Browsers.Firefox.standaloneBrowser("10"))).isFalse(); + assertThat(whitelist.matches(Browsers.Firefox.customTab("57"))).isFalse(); assertThat(whitelist.matches(Browsers.SBrowser.standaloneBrowser("11"))).isFalse(); } @@ -40,6 +41,7 @@ public void testMatches_chromeBrowserOnly() { assertThat(whitelist.matches(Browsers.Chrome.standaloneBrowser("46"))).isTrue(); assertThat(whitelist.matches(Browsers.Chrome.customTab("46"))).isFalse(); assertThat(whitelist.matches(Browsers.Firefox.standaloneBrowser("10"))).isFalse(); + assertThat(whitelist.matches(Browsers.Firefox.customTab("57"))).isFalse(); } @Test @@ -50,17 +52,21 @@ public void testMatches_chromeCustomTabOrBrowser() { assertThat(whitelist.matches(Browsers.Chrome.standaloneBrowser("46"))).isTrue(); assertThat(whitelist.matches(Browsers.Chrome.customTab("46"))).isTrue(); assertThat(whitelist.matches(Browsers.Firefox.standaloneBrowser("10"))).isFalse(); + assertThat(whitelist.matches(Browsers.Firefox.customTab("57"))).isFalse(); } @Test public void testMatches_firefoxOrSamsung() { BrowserWhitelist whitelist = new BrowserWhitelist( VersionedBrowserMatcher.FIREFOX_BROWSER, + VersionedBrowserMatcher.FIREFOX_CUSTOM_TAB, VersionedBrowserMatcher.SAMSUNG_BROWSER, VersionedBrowserMatcher.SAMSUNG_CUSTOM_TAB); assertThat(whitelist.matches(Browsers.Chrome.standaloneBrowser("46"))).isFalse(); assertThat(whitelist.matches(Browsers.Chrome.customTab("46"))).isFalse(); assertThat(whitelist.matches(Browsers.Firefox.standaloneBrowser("10"))).isTrue(); + assertThat(whitelist.matches(Browsers.Firefox.customTab("56"))).isFalse(); + assertThat(whitelist.matches(Browsers.Firefox.customTab("57"))).isTrue(); assertThat(whitelist.matches(Browsers.SBrowser.standaloneBrowser("10"))).isTrue(); assertThat(whitelist.matches(Browsers.SBrowser.customTab("10"))).isTrue(); }