Hide "Open by default" entirely for browser apps

Browsers are explicitly treated outside the web link infrastructure, so
we shouldn't offer "Open by default" section.

Fixes: 129162570
Test: robotests
Change-Id: Ie63d5fbfb32eaed4bba8a80158b6bb19bb45b380
diff --git a/src/com/android/settings/applications/AppLaunchSettings.java b/src/com/android/settings/applications/AppLaunchSettings.java
index fdd2d16..86bc7ed 100644
--- a/src/com/android/settings/applications/AppLaunchSettings.java
+++ b/src/com/android/settings/applications/AppLaunchSettings.java
@@ -20,11 +20,8 @@
 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
 
 import android.app.settings.SettingsEnums;
-import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.net.Uri;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.util.ArraySet;
@@ -37,8 +34,7 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.core.SubSettingLauncher;
-
-import java.util.List;
+import com.android.settingslib.applications.AppUtils;
 
 public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListener,
         Preference.OnPreferenceChangeListener {
@@ -49,15 +45,6 @@
     private static final String FRAGMENT_OPEN_SUPPORTED_LINKS =
             "com.android.settings.applications.OpenSupportedLinks";
 
-    private static final Intent sBrowserIntent;
-
-    static {
-        sBrowserIntent = new Intent()
-                .setAction(Intent.ACTION_VIEW)
-                .addCategory(Intent.CATEGORY_BROWSABLE)
-                .setData(Uri.parse("http:"));
-    }
-
     private PackageManager mPm;
 
     private boolean mIsBrowser;
@@ -90,7 +77,7 @@
 
         mPm = getActivity().getPackageManager();
 
-        mIsBrowser = isBrowserApp(mPackageName);
+        mIsBrowser = AppUtils.isBrowserApp(this.getContext(), mPackageName, UserHandle.myUserId());
         mHasDomainUrls =
                 (mAppEntry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0;
 
@@ -108,22 +95,6 @@
         }
     }
 
-    // An app is a "browser" if it has an activity resolution that wound up
-    // marked with the 'handleAllWebDataURI' flag.
-    private boolean isBrowserApp(String packageName) {
-        sBrowserIntent.setPackage(packageName);
-        List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(sBrowserIntent,
-                PackageManager.MATCH_ALL, UserHandle.myUserId());
-        final int count = list.size();
-        for (int i = 0; i < count; i++) {
-            ResolveInfo info = list.get(i);
-            if (info.activityInfo != null && info.handleAllWebDataURI) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     private int linkStateToResourceId(int state) {
         switch (state) {
             case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS:
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index dff6d6d..7aad245 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -150,7 +150,11 @@
         installer.setParentFragment(this);
         use(AppInstallerPreferenceCategoryController.class).setChildren(Arrays.asList(installer));
         use(AppNotificationPreferenceController.class).setParentFragment(this);
-        use(AppOpenByDefaultPreferenceController.class).setParentFragment(this);
+
+        use(AppOpenByDefaultPreferenceController.class)
+                .setPackageName(packageName)
+                .setParentFragment(this);
+
         use(AppPermissionPreferenceController.class).setParentFragment(this);
         use(AppPermissionPreferenceController.class).setPackageName(packageName);
         use(AppSettingPreferenceController.class)
diff --git a/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceController.java b/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceController.java
index 7f64e3b..f9c88fc 100644
--- a/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceController.java
@@ -22,6 +22,7 @@
 import android.content.pm.PackageManager;
 import android.hardware.usb.IUsbManager;
 import android.os.ServiceManager;
+import android.os.UserHandle;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -35,6 +36,7 @@
 
     private IUsbManager mUsbManager;
     private PackageManager mPackageManager;
+    private String mPackageName;
 
     public AppOpenByDefaultPreferenceController(Context context, String key) {
         super(context, key);
@@ -42,6 +44,12 @@
         mPackageManager = context.getPackageManager();
     }
 
+    /** Set a package name for this controller. */
+    public AppOpenByDefaultPreferenceController setPackageName(String packageName) {
+        mPackageName = packageName;
+        return this;
+    }
+
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
@@ -57,7 +65,9 @@
     @Override
     public void updateState(Preference preference) {
         final PackageInfo packageInfo = mParent.getPackageInfo();
-        if (packageInfo != null && !AppUtils.isInstant(packageInfo.applicationInfo)) {
+        if (packageInfo != null && !AppUtils.isInstant(packageInfo.applicationInfo)
+                && !AppUtils.isBrowserApp(mContext, packageInfo.packageName,
+                UserHandle.myUserId())) {
             preference.setVisible(true);
             preference.setSummary(AppUtils.getLaunchByDefaultSummary(mParent.getAppEntry(),
                     mUsbManager, mPackageManager, mContext));
@@ -70,5 +80,4 @@
     protected Class<? extends SettingsPreferenceFragment> getDetailFragmentClass() {
         return AppLaunchSettings.class;
     }
-
 }
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceControllerTest.java
index b6da54e..849f2ac 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceControllerTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
@@ -26,8 +27,12 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -37,6 +42,8 @@
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
 
+import com.google.common.collect.ImmutableList;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -46,6 +53,8 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.util.ReflectionHelpers;
 
+import java.util.List;
+
 @RunWith(RobolectricTestRunner.class)
 public class AppOpenByDefaultPreferenceControllerTest {
 
@@ -55,6 +64,8 @@
     private PreferenceScreen mScreen;
     @Mock
     private Preference mPreference;
+    @Mock
+    private PackageManager mPackageManager;
 
     private Context mContext;
     private AppOpenByDefaultPreferenceController mController;
@@ -62,10 +73,11 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mContext = RuntimeEnvironment.application.getApplicationContext();
+        mContext = spy(RuntimeEnvironment.application.getApplicationContext());
         mController = spy(new AppOpenByDefaultPreferenceController(mContext, "preferred_app"));
         mController.setParentFragment(mFragment);
         when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
     }
 
     @Test
@@ -146,13 +158,42 @@
     }
 
     @Test
-    public void updateState_notInstantApp_shouldShowPreferenceAndSetSummary() {
-        when(mFragment.getPackageInfo()).thenReturn(new PackageInfo());
+    public void updateState_isBrowserApp_shouldNotShowPreference() {
+        final PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = "com.package.test.browser";
+        when(mFragment.getPackageInfo()).thenReturn(packageInfo);
+        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
+                (InstantAppDataProvider) (i -> false));
+        final ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.activityInfo = new ActivityInfo();
+        resolveInfo.handleAllWebDataURI = true;
+        final List<ResolveInfo> resolveInfos = ImmutableList.of(resolveInfo);
+        when(mPackageManager
+                .queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt()))
+                .thenReturn(resolveInfos);
+
+        mController.updateState(mPreference);
+
+        verify(mPreference).setVisible(false);
+    }
+
+    @Test
+    public void updateState_notBrowserApp_notInstantApp_shouldShowPreferenceAndSetSummary() {
+        final PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = "com.package.test.browser";
+        when(mFragment.getPackageInfo()).thenReturn(packageInfo);
+        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
+                (InstantAppDataProvider) (i -> false));
+        final ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.activityInfo = new ActivityInfo();
+        resolveInfo.handleAllWebDataURI = false;
+        final List<ResolveInfo> resolveInfos = ImmutableList.of(resolveInfo);
+        when(mPackageManager
+                .queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt()))
+                .thenReturn(resolveInfos);
         final AppEntry appEntry = mock(AppEntry.class);
         appEntry.info = new ApplicationInfo();
         when(mFragment.getAppEntry()).thenReturn(appEntry);
-        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
-                (InstantAppDataProvider) (i -> false));
 
         mController.updateState(mPreference);