Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23ecc9e7 authored by Automerger Merge Worker's avatar Automerger Merge Worker Committed by Android (Google) Code Review
Browse files

Merge "Merge "Removed and updated usage of old...

Merge "Merge "Removed and updated usage of old IActivityManager#getProviderMimeType methods" into udc-dev am: 485872d8 am: 89dd5954"
parents 160b8056 78e03185
Loading
Loading
Loading
Loading
+0 −6
Original line number Original line Diff line number Diff line
@@ -341,12 +341,6 @@ interface IActivityManager {
            in String message, boolean force, int exceptionTypeId);
            in String message, boolean force, int exceptionTypeId);
    void crashApplicationWithTypeWithExtras(int uid, int initialPid, in String packageName,
    void crashApplicationWithTypeWithExtras(int uid, int initialPid, in String packageName,
            int userId, in String message, boolean force, int exceptionTypeId, in Bundle extras);
            int userId, in String message, boolean force, int exceptionTypeId, in Bundle extras);
    /** @deprecated -- use getProviderMimeTypeAsync */
    @UnsupportedAppUsage(maxTargetSdk = 29, publicAlternatives =
            "Use {@link android.content.ContentResolver#getType} public API instead.")
    String getProviderMimeType(in Uri uri, int userId);

    oneway void getProviderMimeTypeAsync(in Uri uri, int userId, in RemoteCallback resultCallback);
    oneway void getMimeTypeFilterAsync(in Uri uri, int userId, in RemoteCallback resultCallback);
    oneway void getMimeTypeFilterAsync(in Uri uri, int userId, in RemoteCallback resultCallback);
    // Cause the specified process to dump the specified heap.
    // Cause the specified process to dump the specified heap.
    boolean dumpHeap(in String process, int userId, boolean managed, boolean mallocInfo,
    boolean dumpHeap(in String process, int userId, boolean managed, boolean mallocInfo,
+2 −0
Original line number Original line Diff line number Diff line
@@ -389,6 +389,8 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall


        @Override
        @Override
        public void getTypeAnonymousAsync(Uri uri, RemoteCallback callback) {
        public void getTypeAnonymousAsync(Uri uri, RemoteCallback callback) {
            uri = validateIncomingUri(uri);
            uri = maybeGetUriWithoutUserId(uri);
            final Bundle result = new Bundle();
            final Bundle result = new Bundle();
            try {
            try {
                result.putString(ContentResolver.REMOTE_CALLBACK_RESULT, getTypeAnonymous(uri));
                result.putString(ContentResolver.REMOTE_CALLBACK_RESULT, getTypeAnonymous(uri));
+0 −30
Original line number Original line Diff line number Diff line
@@ -7014,36 +7014,6 @@ public class ActivityManagerService extends IActivityManager.Stub
        mCpHelper.appNotRespondingViaProvider(connection);
        mCpHelper.appNotRespondingViaProvider(connection);
    }
    }
    /**
     * Allows apps to retrieve the MIME type of a URI.
     * If an app is in the same user as the ContentProvider, or if it is allowed to interact across
     * users, then it does not need permission to access the ContentProvider.
     * Either, it needs cross-user uri grants.
     *
     * CTS tests for this functionality can be run with "runtest cts-appsecurity".
     *
     * Test cases are at cts/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/
     *     src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
     *
     * @deprecated -- use getProviderMimeTypeAsync.
     */
    @Deprecated
    @Override
    public String getProviderMimeType(Uri uri, int userId) {
        return mCpHelper.getProviderMimeType(uri, userId);
    }
    /**
     * Allows apps to retrieve the MIME type of a URI.
     * If an app is in the same user as the ContentProvider, or if it is allowed to interact across
     * users, then it does not need permission to access the ContentProvider.
     * Either way, it needs cross-user uri grants.
     */
    @Override
    public void getProviderMimeTypeAsync(Uri uri, int userId, RemoteCallback resultCallback) {
        mCpHelper.getProviderMimeTypeAsync(uri, userId, resultCallback);
    }
    /**
    /**
     * Filters calls to getType based on permission. If the caller has required permission,
     * Filters calls to getType based on permission. If the caller has required permission,
     * then it returns the contentProvider#getType.
     * then it returns the contentProvider#getType.
+12 −7
Original line number Original line Diff line number Diff line
@@ -146,6 +146,7 @@ import java.util.Locale;
import java.util.Set;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;


import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLConfig;
@@ -595,10 +596,14 @@ final class ActivityManagerShellCommand extends ShellCommand {
            return 1;
            return 1;
        }
        }


        String mimeType = intent.getType();
        AtomicReference<String> mimeType = new AtomicReference<>(intent.getType());
        if (mimeType == null && intent.getData() != null

        if (mimeType.get() == null && intent.getData() != null
                && "content".equals(intent.getData().getScheme())) {
                && "content".equals(intent.getData().getScheme())) {
            mimeType = mInterface.getProviderMimeType(intent.getData(), mUserId);
            mInterface.getMimeTypeFilterAsync(intent.getData(), mUserId,
                    new RemoteCallback(result -> {
                        mimeType.set(result.getPairValue());
                    }));
        }
        }


        do {
        do {
@@ -611,8 +616,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
                    int userIdForQuery = mInternal.mUserController.handleIncomingUser(
                    int userIdForQuery = mInternal.mUserController.handleIncomingUser(
                            Binder.getCallingPid(), Binder.getCallingUid(), mUserId, false,
                            Binder.getCallingPid(), Binder.getCallingUid(), mUserId, false,
                            ALLOW_NON_FULL, "ActivityManagerShellCommand", null);
                            ALLOW_NON_FULL, "ActivityManagerShellCommand", null);
                    List<ResolveInfo> activities = mPm.queryIntentActivities(intent, mimeType, 0,
                    List<ResolveInfo> activities = mPm.queryIntentActivities(intent, mimeType.get(),
                            userIdForQuery).getList();
                            0, userIdForQuery).getList();
                    if (activities == null || activities.size() <= 0) {
                    if (activities == null || activities.size() <= 0) {
                        getErrPrintWriter().println("Error: Intent does not match any activities: "
                        getErrPrintWriter().println("Error: Intent does not match any activities: "
                                + intent);
                                + intent);
@@ -708,12 +713,12 @@ final class ActivityManagerShellCommand extends ShellCommand {
            }
            }
            if (mWaitOption) {
            if (mWaitOption) {
                result = mInternal.startActivityAndWait(null, SHELL_PACKAGE_NAME, null, intent,
                result = mInternal.startActivityAndWait(null, SHELL_PACKAGE_NAME, null, intent,
                        mimeType, null, null, 0, mStartFlags, profilerInfo,
                        mimeType.get(), null, null, 0, mStartFlags, profilerInfo,
                        options != null ? options.toBundle() : null, mUserId);
                        options != null ? options.toBundle() : null, mUserId);
                res = result.result;
                res = result.result;
            } else {
            } else {
                res = mInternal.startActivityAsUserWithFeature(null, SHELL_PACKAGE_NAME, null,
                res = mInternal.startActivityAsUserWithFeature(null, SHELL_PACKAGE_NAME, null,
                        intent, mimeType, null, null, 0, mStartFlags, profilerInfo,
                        intent, mimeType.get(), null, null, 0, mStartFlags, profilerInfo,
                        options != null ? options.toBundle() : null, mUserId);
                        options != null ? options.toBundle() : null, mUserId);
            }
            }
            final long endTime = SystemClock.uptimeMillis();
            final long endTime = SystemClock.uptimeMillis();
+0 −116
Original line number Original line Diff line number Diff line
@@ -963,122 +963,6 @@ public class ContentProviderHelper {
        }
        }
    }
    }


    /**
     * Allows apps to retrieve the MIME type of a URI.
     * If an app is in the same user as the ContentProvider, or if it is allowed to interact across
     * users, then it does not need permission to access the ContentProvider.
     * Either, it needs cross-user uri grants.
     *
     * CTS tests for this functionality can be run with "runtest cts-appsecurity".
     *
     * Test cases are at cts/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/
     *     src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
     *
     * @deprecated -- use getProviderMimeTypeAsync.
     */
    @Deprecated
    String getProviderMimeType(Uri uri, int userId) {
        mService.enforceNotIsolatedCaller("getProviderMimeType");
        final String name = uri.getAuthority();
        final int callingUid = Binder.getCallingUid();
        final int callingPid = Binder.getCallingPid();
        final int safeUserId = mService.mUserController.unsafeConvertIncomingUser(userId);
        final long ident = canClearIdentity(callingPid, callingUid, safeUserId)
                ? Binder.clearCallingIdentity() : 0;
        final ContentProviderHolder holder;
        try {
            holder = getContentProviderExternalUnchecked(name, null /* token */, callingUid,
                    "*getmimetype*", safeUserId);
        } finally {
            if (ident != 0) {
                Binder.restoreCallingIdentity(ident);
            }
        }
        try {
            if (isHolderVisibleToCaller(holder, callingUid, safeUserId)) {
                final IBinder providerConnection = holder.connection;
                final ComponentName providerName = holder.info.getComponentName();
                // Note: creating a new Runnable instead of using a lambda here since lambdas in
                // java provide no guarantee that there will be a new instance returned every call.
                // Hence, it's possible that a cached copy is returned and the ANR is executed on
                // the incorrect provider.
                final Runnable providerNotResponding = new Runnable() {
                    @Override
                    public void run() {
                        Log.w(TAG, "Provider " + providerName + " didn't return from getType().");
                        appNotRespondingViaProvider(providerConnection);
                    }
                };
                mService.mHandler.postDelayed(providerNotResponding, 1000);
                try {
                    final String type = holder.provider.getType(uri);
                    return type;
                } finally {
                    mService.mHandler.removeCallbacks(providerNotResponding);
                    // We need to clear the identity to call removeContentProviderExternalUnchecked
                    final long token = Binder.clearCallingIdentity();
                    try {
                        removeContentProviderExternalUnchecked(name, null /* token */, safeUserId);
                    } finally {
                        Binder.restoreCallingIdentity(token);
                    }
                }
            }
        } catch (RemoteException e) {
            Log.w(TAG, "Content provider dead retrieving " + uri, e);
            return null;
        } catch (Exception e) {
            Log.w(TAG, "Exception while determining type of " + uri, e);
            return null;
        }

        return null;
    }

    /**
     * Allows apps to retrieve the MIME type of a URI.
     * If an app is in the same user as the ContentProvider, or if it is allowed to interact across
     * users, then it does not need permission to access the ContentProvider.
     * Either way, it needs cross-user uri grants.
     */
    void getProviderMimeTypeAsync(Uri uri, int userId, RemoteCallback resultCallback) {
        mService.enforceNotIsolatedCaller("getProviderMimeTypeAsync");
        final String name = uri.getAuthority();
        final int callingUid = Binder.getCallingUid();
        final int callingPid = Binder.getCallingPid();
        final int safeUserId = mService.mUserController.unsafeConvertIncomingUser(userId);
        final long ident = canClearIdentity(callingPid, callingUid, safeUserId)
                ? Binder.clearCallingIdentity() : 0;
        final ContentProviderHolder holder;
        try {
            holder = getContentProviderExternalUnchecked(name, null /* token */, callingUid,
                    "*getmimetype*", safeUserId);
        } finally {
            if (ident != 0) {
                Binder.restoreCallingIdentity(ident);
            }
        }

        try {
            if (isHolderVisibleToCaller(holder, callingUid, safeUserId)) {
                holder.provider.getTypeAsync(uri, new RemoteCallback(result -> {
                    final long identity = Binder.clearCallingIdentity();
                    try {
                        removeContentProviderExternalUnchecked(name, null, safeUserId);
                    } finally {
                        Binder.restoreCallingIdentity(identity);
                    }
                    resultCallback.sendResult(result);
                }));
            } else {
                resultCallback.sendResult(Bundle.EMPTY);
            }
        } catch (RemoteException e) {
            Log.w(TAG, "Content provider dead retrieving " + uri, e);
            resultCallback.sendResult(Bundle.EMPTY);
        }
    }

    /**
    /**
     * Filters calls to getType based on permission. If the caller has required permission,
     * Filters calls to getType based on permission. If the caller has required permission,
     * then it returns the contentProvider#getType.
     * then it returns the contentProvider#getType.
Loading