diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index f8bfacb..765c9d0 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -265,7 +265,6 @@
 import com.android.server.firewall.IntentFirewall;
 import com.android.server.pm.UserManagerService;
 import com.android.server.policy.PermissionPolicyInternal;
-import com.android.server.uri.NeededUriGrants;
 import com.android.server.uri.UriGrantsManagerInternal;
 import com.android.server.vr.VrManagerInternal;
 
@@ -1541,19 +1540,11 @@
             throw new IllegalArgumentException("File descriptors passed in Intent");
         }
 
-        final ActivityRecord r;
         synchronized (mGlobalLock) {
-            r = ActivityRecord.isInStackLocked(token);
+            ActivityRecord r = ActivityRecord.isInStackLocked(token);
             if (r == null) {
                 return true;
             }
-        }
-
-        // Carefully collect grants without holding lock
-        final NeededUriGrants resultGrants = mUgmInternal.checkGrantUriPermissionFromIntent(
-                Binder.getCallingUid(), resultData, r.packageName, r.mUserId);
-
-        synchronized (mGlobalLock) {
             // Keep track of the root activity of the task before we finish it
             final TaskRecord tr = r.getTaskRecord();
             ActivityRecord rootR = tr.getRootActivity();
@@ -1615,7 +1606,7 @@
                     r.mRelaunchReason = RELAUNCH_REASON_NONE;
                 } else {
                     res = tr.getStack().requestFinishActivityLocked(token, resultCode,
-                            resultData, resultGrants, "app-request", true);
+                            resultData, "app-request", true);
                     if (!res) {
                         Slog.i(TAG, "Failed to finish by app-request");
                     }
@@ -2141,23 +2132,14 @@
     @Override
     public boolean navigateUpTo(IBinder token, Intent destIntent, int resultCode,
             Intent resultData) {
-        final ActivityRecord r;
+
         synchronized (mGlobalLock) {
-            r = ActivityRecord.isInStackLocked(token);
-            if (r == null) {
-                return false;
+            final ActivityRecord r = ActivityRecord.forTokenLocked(token);
+            if (r != null) {
+                return r.getActivityStack().navigateUpToLocked(
+                        r, destIntent, resultCode, resultData);
             }
-        }
-
-        // Carefully collect grants without holding lock
-        final NeededUriGrants destGrants = mUgmInternal.checkGrantUriPermissionFromIntent(
-                Binder.getCallingUid(), destIntent, r.packageName, r.mUserId);
-        final NeededUriGrants resultGrants = mUgmInternal.checkGrantUriPermissionFromIntent(
-                Binder.getCallingUid(), resultData, r.packageName, r.mUserId);
-
-        synchronized (mGlobalLock) {
-            return r.getActivityStack().navigateUpToLocked(
-                    r, destIntent, destGrants, resultCode, resultData, resultGrants);
+            return false;
         }
     }
 
@@ -6607,23 +6589,14 @@
 
         @Override
         public void sendActivityResult(int callingUid, IBinder activityToken, String resultWho,
-                int requestCode, int resultCode, Intent resultData) {
-            final ActivityRecord r;
+                int requestCode, int resultCode, Intent data) {
             synchronized (mGlobalLock) {
-                r = ActivityRecord.isInStackLocked(activityToken);
-                if (r == null || r.getActivityStack() == null) {
-                    return;
+                final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
+                if (r != null && r.getActivityStack() != null) {
+                    r.getActivityStack().sendActivityResultLocked(callingUid, r, resultWho,
+                            requestCode, resultCode, data);
                 }
             }
-
-            // Carefully collect grants without holding lock
-            final NeededUriGrants resultGrants = mUgmInternal.checkGrantUriPermissionFromIntent(
-                    Binder.getCallingUid(), resultData, r.packageName, r.mUserId);
-
-            synchronized (mGlobalLock) {
-                r.getActivityStack().sendActivityResultLocked(callingUid, r, resultWho,
-                        requestCode, resultCode, resultData, resultGrants);
-            }
         }
 
         @Override
