Commit e658361d authored by Lijin Shen's avatar Lijin Shen Committed by Commit Bot

No promo for default browser promo if no web browser acitivy exists

PackageManagerUtils#resolveDefaultWebBrowserActivity can return null.
The utils should return no in this case.

Bug: 1131772
Change-Id: I7421d250e01ca8149e284e474c5c8852a79b3668
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2436393
Commit-Queue: Lijin Shen <lazzzis@google.com>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarPavel Yatsuk <pavely@chromium.org>
Cr-Commit-Position: refs/heads/master@{#813352}
parent 635cbc1a
...@@ -154,6 +154,10 @@ public class DefaultBrowserPromoDeps { ...@@ -154,6 +154,10 @@ public class DefaultBrowserPromoDeps {
return false; return false;
} }
ResolveInfo getDefaultWebBrowserActivityResolveInfo() {
return PackageManagerUtils.resolveDefaultWebBrowserActivity();
}
int getSDKInt() { int getSDKInt() {
return Build.VERSION.SDK_INT; return Build.VERSION.SDK_INT;
} }
......
...@@ -13,7 +13,6 @@ import android.os.Build; ...@@ -13,7 +13,6 @@ import android.os.Build;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.PackageManagerUtils;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
...@@ -54,11 +53,6 @@ public class DefaultBrowserPromoUtils { ...@@ -54,11 +53,6 @@ public class DefaultBrowserPromoUtils {
private static final String DISAMBIGUATION_SHEET_PROMOED_KEY_PREFIX = private static final String DISAMBIGUATION_SHEET_PROMOED_KEY_PREFIX =
"disambiguation_sheet_promoed."; "disambiguation_sheet_promoed.";
static final String CHROME_STABLE_PACKAGE_NAME = "com.android.chrome";
// TODO(crbug.com/1090103): move to some util class for reuse.
static final String[] CHROME_PACKAGE_NAMES = {CHROME_STABLE_PACKAGE_NAME, "org.chromium.chrome",
"com.chrome.canary", "com.chrome.beta", "com.chrome.dev"};
/** /**
* Determine whether a promo dialog should be displayed or not. And prepare related logic to * Determine whether a promo dialog should be displayed or not. And prepare related logic to
...@@ -118,7 +112,11 @@ public class DefaultBrowserPromoUtils { ...@@ -118,7 +112,11 @@ public class DefaultBrowserPromoUtils {
return DefaultBrowserPromoAction.NO_ACTION; return DefaultBrowserPromoAction.NO_ACTION;
} }
ResolveInfo info = PackageManagerUtils.resolveDefaultWebBrowserActivity(); ResolveInfo info = deps.getDefaultWebBrowserActivityResolveInfo();
if (info == null) {
return DefaultBrowserPromoAction.NO_ACTION;
}
int state = deps.getCurrentDefaultBrowserState(info); int state = deps.getCurrentDefaultBrowserState(info);
int action = DefaultBrowserPromoAction.NO_ACTION; int action = DefaultBrowserPromoAction.NO_ACTION;
if (state == DefaultBrowserState.CHROME_DEFAULT) { if (state == DefaultBrowserState.CHROME_DEFAULT) {
......
...@@ -78,7 +78,7 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -78,7 +78,7 @@ public class DefaultBrowserPromoUtilsTest {
Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()); Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager());
DefaultBrowserPromoDeps deps = DefaultBrowserPromoDeps.getInstance(); DefaultBrowserPromoDeps deps = DefaultBrowserPromoDeps.getInstance();
infoList.add(createResolveInfo(DefaultBrowserPromoUtils.CHROME_STABLE_PACKAGE_NAME, 1)); infoList.add(createResolveInfo(DefaultBrowserPromoDeps.CHROME_STABLE_PACKAGE_NAME, 1));
packageManager.addResolveInfoForIntent( packageManager.addResolveInfoForIntent(
PackageManagerUtils.getQueryInstalledBrowsersIntent(), infoList); PackageManagerUtils.getQueryInstalledBrowsersIntent(), infoList);
Assert.assertFalse("Chrome stable should not be counted as a pre-stable channel", Assert.assertFalse("Chrome stable should not be counted as a pre-stable channel",
...@@ -90,8 +90,8 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -90,8 +90,8 @@ public class DefaultBrowserPromoUtilsTest {
Assert.assertFalse("A random package should not be counted as a pre-stable channel", Assert.assertFalse("A random package should not be counted as a pre-stable channel",
deps.isChromePreStableInstalled()); deps.isChromePreStableInstalled());
for (String name : DefaultBrowserPromoUtils.CHROME_PACKAGE_NAMES) { for (String name : DefaultBrowserPromoDeps.CHROME_PACKAGE_NAMES) {
if (name.equals(DefaultBrowserPromoUtils.CHROME_STABLE_PACKAGE_NAME)) continue; if (name.equals(DefaultBrowserPromoDeps.CHROME_STABLE_PACKAGE_NAME)) continue;
List<ResolveInfo> list = new ArrayList<>(infoList); List<ResolveInfo> list = new ArrayList<>(infoList);
list.add(createResolveInfo(name, 1)); list.add(createResolveInfo(name, 1));
packageManager.addResolveInfoForIntent( packageManager.addResolveInfoForIntent(
...@@ -104,7 +104,7 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -104,7 +104,7 @@ public class DefaultBrowserPromoUtilsTest {
@Test @Test
public void testIsCurrentDefaultBrowserChrome() { public void testIsCurrentDefaultBrowserChrome() {
DefaultBrowserPromoDeps deps = DefaultBrowserPromoDeps.getInstance(); DefaultBrowserPromoDeps deps = DefaultBrowserPromoDeps.getInstance();
for (String name : DefaultBrowserPromoUtils.CHROME_PACKAGE_NAMES) { for (String name : DefaultBrowserPromoDeps.CHROME_PACKAGE_NAMES) {
Assert.assertTrue(name + " should be considered as a chrome channel", Assert.assertTrue(name + " should be considered as a chrome channel",
deps.isCurrentDefaultBrowserChrome(createResolveInfo(name, 1))); deps.isCurrentDefaultBrowserChrome(createResolveInfo(name, 1)));
} }
...@@ -138,8 +138,8 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -138,8 +138,8 @@ public class DefaultBrowserPromoUtilsTest {
setDepsMockWithDefaultValues(); setDepsMockWithDefaultValues();
when(mDeps.getSDKInt()).thenReturn(Build.VERSION_CODES.Q); when(mDeps.getSDKInt()).thenReturn(Build.VERSION_CODES.Q);
when(mDeps.isRoleAvailable(any())).thenReturn(true); when(mDeps.isRoleAvailable(any())).thenReturn(true);
when(mDeps.getCurrentDefaultBrowserState(any())) when(mDeps.getDefaultWebBrowserActivityResolveInfo())
.thenReturn(DefaultBrowserState.OTHER_DEFAULT); .thenReturn(createResolveInfo("android", 1));
Assert.assertEquals( Assert.assertEquals(
"Should promo role manager when there is another default browser on Q+.", "Should promo role manager when there is another default browser on Q+.",
DefaultBrowserPromoAction.ROLE_MANAGER, DefaultBrowserPromoAction.ROLE_MANAGER,
...@@ -150,8 +150,8 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -150,8 +150,8 @@ public class DefaultBrowserPromoUtilsTest {
@Test @Test
public void testPromo_P_otherDefaultSystemSettings() { public void testPromo_P_otherDefaultSystemSettings() {
setDepsMockWithDefaultValues(); setDepsMockWithDefaultValues();
when(mDeps.getCurrentDefaultBrowserState(any())) when(mDeps.getDefaultWebBrowserActivityResolveInfo())
.thenReturn(DefaultBrowserState.OTHER_DEFAULT); .thenReturn(createResolveInfo("android", 1));
when(mDeps.promoActionOnP()).thenReturn(DefaultBrowserPromoAction.SYSTEM_SETTINGS); when(mDeps.promoActionOnP()).thenReturn(DefaultBrowserPromoAction.SYSTEM_SETTINGS);
Assert.assertEquals( Assert.assertEquals(
"Should promo system settings when there is another default browser on P-.", "Should promo system settings when there is another default browser on P-.",
...@@ -162,7 +162,6 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -162,7 +162,6 @@ public class DefaultBrowserPromoUtilsTest {
@Test @Test
public void testNoPromo_P_noDefaultNoSystemSettings() { public void testNoPromo_P_noDefaultNoSystemSettings() {
setDepsMockWithDefaultValues(); setDepsMockWithDefaultValues();
when(mDeps.getCurrentDefaultBrowserState(any())).thenReturn(DefaultBrowserState.NO_DEFAULT);
when(mDeps.promoActionOnP()).thenReturn(DefaultBrowserPromoAction.SYSTEM_SETTINGS); when(mDeps.promoActionOnP()).thenReturn(DefaultBrowserPromoAction.SYSTEM_SETTINGS);
when(mDeps.doesManageDefaultAppsSettingsActivityExist()).thenReturn(false); when(mDeps.doesManageDefaultAppsSettingsActivityExist()).thenReturn(false);
Assert.assertEquals( Assert.assertEquals(
...@@ -174,7 +173,6 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -174,7 +173,6 @@ public class DefaultBrowserPromoUtilsTest {
@Test @Test
public void testNoPromo_P_noDefaultDisabled() { public void testNoPromo_P_noDefaultDisabled() {
setDepsMockWithDefaultValues(); setDepsMockWithDefaultValues();
when(mDeps.getCurrentDefaultBrowserState(any())).thenReturn(DefaultBrowserState.NO_DEFAULT);
when(mDeps.promoActionOnP()).thenReturn(DefaultBrowserPromoAction.NO_ACTION); when(mDeps.promoActionOnP()).thenReturn(DefaultBrowserPromoAction.NO_ACTION);
Assert.assertEquals( Assert.assertEquals(
"Should not promo on P- when promoing on \'no default\' scenario is disabled.", "Should not promo on P- when promoing on \'no default\' scenario is disabled.",
...@@ -186,9 +184,9 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -186,9 +184,9 @@ public class DefaultBrowserPromoUtilsTest {
public void testNoPromo_otherDefault_M() { public void testNoPromo_otherDefault_M() {
setDepsMockWithDefaultValues(); setDepsMockWithDefaultValues();
when(mDeps.getSDKInt()).thenReturn(Build.VERSION_CODES.M); when(mDeps.getSDKInt()).thenReturn(Build.VERSION_CODES.M);
when(mDeps.doesManageDefaultAppsSettingsActivityExist()).thenReturn(false); when(mDeps.doesManageDefaultAppsSettingsActivityExist()).thenCallRealMethod();
when(mDeps.getCurrentDefaultBrowserState(any())) when(mDeps.getDefaultWebBrowserActivityResolveInfo())
.thenReturn(DefaultBrowserState.OTHER_DEFAULT); .thenReturn(createResolveInfo("android", 1));
Assert.assertEquals("Should not promo on M- when there is another default browser.", Assert.assertEquals("Should not promo on M- when there is another default browser.",
DefaultBrowserPromoAction.NO_ACTION, DefaultBrowserPromoAction.NO_ACTION,
DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); DefaultBrowserPromoUtils.decideNextAction(mDeps, null));
...@@ -238,9 +236,10 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -238,9 +236,10 @@ public class DefaultBrowserPromoUtilsTest {
@Test @Test
public void testNoPromo_isOtherChromeDefault() { public void testNoPromo_isOtherChromeDefault() {
setDepsMockWithDefaultValues(); setDepsMockWithDefaultValues();
when(mDeps.isCurrentDefaultBrowserChrome(any())).thenReturn(true); when(mDeps.getDefaultWebBrowserActivityResolveInfo())
when(mDeps.getCurrentDefaultBrowserState(any())) .thenReturn(
.thenReturn(DefaultBrowserState.OTHER_DEFAULT); createResolveInfo(DefaultBrowserPromoDeps.CHROME_STABLE_PACKAGE_NAME, 1));
when(mDeps.isCurrentDefaultBrowserChrome(any())).thenCallRealMethod();
Assert.assertEquals( Assert.assertEquals(
"Should not promo when another chrome channel browser has been default.", "Should not promo when another chrome channel browser has been default.",
DefaultBrowserPromoAction.NO_ACTION, DefaultBrowserPromoAction.NO_ACTION,
...@@ -250,14 +249,23 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -250,14 +249,23 @@ public class DefaultBrowserPromoUtilsTest {
@Test @Test
public void testNoPromo_isCurrentChromeDefault() { public void testNoPromo_isCurrentChromeDefault() {
setDepsMockWithDefaultValues(); setDepsMockWithDefaultValues();
when(mDeps.isCurrentDefaultBrowserChrome(any())).thenReturn(true); when(mDeps.getDefaultWebBrowserActivityResolveInfo())
when(mDeps.getCurrentDefaultBrowserState(any())) .thenReturn(createResolveInfo(
.thenReturn(DefaultBrowserState.CHROME_DEFAULT); ContextUtils.getApplicationContext().getPackageName(), 1));
Assert.assertEquals("Should not promo when chrome has been default.", Assert.assertEquals("Should not promo when chrome has been default.",
DefaultBrowserPromoAction.NO_ACTION, DefaultBrowserPromoAction.NO_ACTION,
DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); DefaultBrowserPromoUtils.decideNextAction(mDeps, null));
} }
@Test
public void testNoPromo_webBrowserActivityNotExist() {
setDepsMockWithDefaultValues();
when(mDeps.getDefaultWebBrowserActivityResolveInfo()).thenReturn(null);
Assert.assertEquals("Should not promo when web browser activity does not exist.",
DefaultBrowserPromoAction.NO_ACTION,
DefaultBrowserPromoUtils.decideNextAction(mDeps, null));
}
private void setDepsMockWithDefaultValues() { private void setDepsMockWithDefaultValues() {
when(mDeps.isFeatureEnabled()).thenReturn(true); when(mDeps.isFeatureEnabled()).thenReturn(true);
when(mDeps.getMinSessionCount()).thenReturn(3); when(mDeps.getMinSessionCount()).thenReturn(3);
...@@ -272,7 +280,10 @@ public class DefaultBrowserPromoUtilsTest { ...@@ -272,7 +280,10 @@ public class DefaultBrowserPromoUtilsTest {
when(mDeps.getMinPromoInterval()).thenReturn(10); when(mDeps.getMinPromoInterval()).thenReturn(10);
when(mDeps.isChromePreStableInstalled()).thenReturn(false); when(mDeps.isChromePreStableInstalled()).thenReturn(false);
when(mDeps.isCurrentDefaultBrowserChrome(any())).thenReturn(false); when(mDeps.isCurrentDefaultBrowserChrome(any())).thenReturn(false);
when(mDeps.getCurrentDefaultBrowserState(any())).thenReturn(DefaultBrowserState.NO_DEFAULT); // No Default
when(mDeps.getDefaultWebBrowserActivityResolveInfo())
.thenReturn(createResolveInfo("android", 0));
when(mDeps.getCurrentDefaultBrowserState(any())).thenCallRealMethod();
} }
private ResolveInfo createResolveInfo(String packageName, int match) { private ResolveInfo createResolveInfo(String packageName, int match) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment