Fixes type resolving in ActivityManagerShellCommand

 - There are 2 reasons for this change
    1. make it non-async, because the type may still be null while it's being used in the below codes
    2. Ams.mimeTypeFilterAsync is now used only when the caller does not hold the permission. So replacing it with ContentResolver.getType

 - Also granting shell special permission to access all provider mime types.

Bug: b/284407686

Test: The intended behavior was reproduced on local testing.
Change-Id: I9add06ffe8c0e7c185f0947f0695be259513bd13
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 43f98c3..56e0643 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -839,6 +839,8 @@
     <uses-permission android:name="android.permission.LAUNCH_CREDENTIAL_SELECTOR" />
     <!-- Permission required for CTS test IntentRedirectionTest -->
     <uses-permission android:name="android.permission.QUERY_CLONED_APPS" />
+    <!-- Permission required for accessing all content provider mime types -->
+    <uses-permission android:name="android.permission.GET_ANY_PROVIDER_TYPE" />
 
     <application
         android:label="@string/app_label"
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index add22bd..4dfa41d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -149,7 +149,6 @@
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
 
 import javax.microedition.khronos.egl.EGL10;
 import javax.microedition.khronos.egl.EGLConfig;
@@ -607,15 +606,7 @@
             return 1;
         }
 
-        AtomicReference<String> mimeType = new AtomicReference<>(intent.getType());
-
-        if (mimeType.get() == null && intent.getData() != null
-                && "content".equals(intent.getData().getScheme())) {
-            mInterface.getMimeTypeFilterAsync(intent.getData(), mUserId,
-                    new RemoteCallback(result -> {
-                        mimeType.set(result.getPairValue());
-                    }));
-        }
+        final String mimeType = intent.resolveType(mInternal.mContext);
 
         do {
             if (mStopOption) {
@@ -627,7 +618,7 @@
                     int userIdForQuery = mInternal.mUserController.handleIncomingUser(
                             Binder.getCallingPid(), Binder.getCallingUid(), mUserId, false,
                             ALLOW_NON_FULL, "ActivityManagerShellCommand", null);
-                    List<ResolveInfo> activities = mPm.queryIntentActivities(intent, mimeType.get(),
+                    List<ResolveInfo> activities = mPm.queryIntentActivities(intent, mimeType,
                             0, userIdForQuery).getList();
                     if (activities == null || activities.size() <= 0) {
                         getErrPrintWriter().println("Error: Intent does not match any activities: "
@@ -724,12 +715,12 @@
             }
             if (mWaitOption) {
                 result = mInternal.startActivityAndWait(null, SHELL_PACKAGE_NAME, null, intent,
-                        mimeType.get(), null, null, 0, mStartFlags, profilerInfo,
+                        mimeType, null, null, 0, mStartFlags, profilerInfo,
                         options != null ? options.toBundle() : null, mUserId);
                 res = result.result;
             } else {
                 res = mInternal.startActivityAsUserWithFeature(null, SHELL_PACKAGE_NAME, null,
-                        intent, mimeType.get(), null, null, 0, mStartFlags, profilerInfo,
+                        intent, mimeType, null, null, 0, mStartFlags, profilerInfo,
                         options != null ? options.toBundle() : null, mUserId);
             }
             final long endTime = SystemClock.uptimeMillis();