Use package manager to check default browser in bedstead.

cherry pick: ag/24587531

Bug: 293996884
Test: btest
a.d.g.ShareSheetTest#autoVerifiableAppWorkProfileCannotHandleButPersonalProfileCan_secondaryOpensBrowserAndPrimaryOpensCorrectApplication
-nm
Ignore-AOSP-First: Change in bedstead framework

Change-Id: I547ce3c7cca6f8eb6f490b45a9877e4e5ec794b4
diff --git a/common/device-side/bedstead/harrier/src/main/java/com/android/bedstead/harrier/DeviceState.java b/common/device-side/bedstead/harrier/src/main/java/com/android/bedstead/harrier/DeviceState.java
index ba6082a..dd2d8f9 100644
--- a/common/device-side/bedstead/harrier/src/main/java/com/android/bedstead/harrier/DeviceState.java
+++ b/common/device-side/bedstead/harrier/src/main/java/com/android/bedstead/harrier/DeviceState.java
@@ -1211,6 +1211,18 @@
                 continue;
             }
 
+            if (annotation instanceof RequireHasDefaultBrowser) {
+                RequireHasDefaultBrowser requireHasDefaultBrowser =
+                        (RequireHasDefaultBrowser) annotation;
+                UserReference user =
+                        resolveUserTypeToUser(requireHasDefaultBrowser.forUser());
+
+                checkFailOrSkip("User: " + user + " does not have a default browser",
+                        TestApis.packages().defaultBrowserForUser(user) != null,
+                        requireHasDefaultBrowser.failureMode());
+                continue;
+            }
+
             if (annotation instanceof RequireTelephonySupport requireTelephonySupport) {
                 checkFailOrSkip("Device does not have telephony support",
                         mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY),
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Packages.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Packages.java
index b1ae0e2..5c72efda 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Packages.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Packages.java
@@ -19,12 +19,15 @@
 import static android.Manifest.permission.INSTALL_PACKAGES;
 import static android.Manifest.permission.INTERACT_ACROSS_USERS;
 import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
+import static android.content.Intent.ACTION_VIEW;
 import static android.content.pm.PackageInstaller.EXTRA_PACKAGE_NAME;
 import static android.content.pm.PackageInstaller.EXTRA_STATUS;
 import static android.content.pm.PackageInstaller.EXTRA_STATUS_MESSAGE;
 import static android.content.pm.PackageInstaller.STATUS_FAILURE;
 import static android.content.pm.PackageInstaller.STATUS_SUCCESS;
 import static android.content.pm.PackageInstaller.SessionParams.MODE_FULL_INSTALL;
+import static android.content.pm.PackageManager.MATCH_ALL;
+import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
 import static android.os.Build.VERSION.SDK_INT;
 import static android.os.Build.VERSION_CODES.R;
 
@@ -41,6 +44,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
+import android.net.Uri;
 import android.os.Build;
 import android.util.Log;
 
@@ -75,6 +79,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -731,6 +736,52 @@
         return find(TestApis.ui().device().getLauncherPackageName());
     }
 
+    /**
+     * Finds the browser assigned to handle browsing intents by default for selected user.
+     *
+     * @return the package for the default browser if there is one, null otherwise.
+     */
+    @SuppressWarnings("NewApi")
+    @Experimental
+    public Package defaultBrowserForUser(UserReference user) {
+        ResolveInfo resolvedActivity;
+        List<ResolveInfo> possibleActivities;
+        Intent toResolve = new Intent(ACTION_VIEW, Uri.parse("http://"));
+
+        PackageManager pm = TestApis.context()
+                .instrumentationContextAsUser(user)
+                .getPackageManager();
+
+        if (Versions.meetsMinimumSdkVersionRequirement(Versions.T)) {
+            possibleActivities = pm.queryIntentActivities(toResolve,
+                    PackageManager.ResolveInfoFlags.of(MATCH_ALL));
+            resolvedActivity = pm.resolveActivity(toResolve,
+                    PackageManager.ResolveInfoFlags.of(MATCH_DEFAULT_ONLY));
+        } else {
+            possibleActivities = pm.queryIntentActivities(toResolve, MATCH_ALL);
+            resolvedActivity = pm.resolveActivity(toResolve, MATCH_DEFAULT_ONLY);
+        }
+
+        Set<String> possibleBrowserPackageName =  possibleActivities.stream()
+                .map(Packages::extractPackageName)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        String resolvedBrowserPackageName = extractPackageName(resolvedActivity);
+        if (resolvedBrowserPackageName == null
+                || !possibleBrowserPackageName.contains(resolvedBrowserPackageName)) {
+            return null;
+        }
+
+        return find(resolvedBrowserPackageName);
+    }
+
+    private static String extractPackageName(@Nullable ResolveInfo nullableInfo) {
+        return Optional.ofNullable(nullableInfo)
+                .map(resolveInfo -> resolveInfo.activityInfo)
+                .map(activityInfo -> activityInfo.packageName)
+                .orElse(null);
+    }
 
     /** See {@link PackageManager#queryIntentActivities(Intent, int)}.
      *