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);
 
