From c9804e7b12aa625391368ebd468f40e0890bfdce Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 15 May 2018 11:01:44 -0700 Subject: [PATCH] Allow recents component to launch non-exported activities - When relaunching an activity in an existing task, allow the recents component to launch all activity including those that are not exported (since the recents component can not have START_ANY_ACTIVITY). Bug: 73068266 Test: Open facebook, hit back to end the task, and try and relaunch from Overview Change-Id: I45e7ce339f83aadfb5a7faf5af51df97dd1414a5 --- .../android/server/am/ActivityStackSupervisor.java | 11 ++++++++--- .../java/com/android/server/am/ActivityStarter.java | 2 +- .../com/android/server/am/ActivityStarterTests.java | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index d194db3741022..df1ee55715622 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1702,11 +1702,16 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean checkStartAnyActivityPermission(Intent intent, ActivityInfo aInfo, String resultWho, int requestCode, int callingPid, int callingUid, - String callingPackage, boolean ignoreTargetSecurity, ProcessRecord callerApp, - ActivityRecord resultRecord, ActivityStack resultStack) { + String callingPackage, boolean ignoreTargetSecurity, boolean launchingInTask, + ProcessRecord callerApp, ActivityRecord resultRecord, ActivityStack resultStack) { + final boolean isCallerRecents = mService.getRecentTasks() != null && + mService.getRecentTasks().isCallerRecents(callingUid); final int startAnyPerm = mService.checkPermission(START_ANY_ACTIVITY, callingPid, callingUid); - if (startAnyPerm == PERMISSION_GRANTED) { + if (startAnyPerm == PERMISSION_GRANTED || (isCallerRecents && launchingInTask)) { + // If the caller has START_ANY_ACTIVITY, ignore all checks below. In addition, if the + // caller is the recents component and we are specifically starting an activity in an + // existing task, then also allow the activity to be fully relaunched. return true; } final int componentRestriction = getComponentRestrictionForCallingPackage( diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index bbf6e6cffee24..0104980f59fe1 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -713,7 +713,7 @@ class ActivityStarter { boolean abort = !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho, requestCode, callingPid, callingUid, callingPackage, ignoreTargetSecurity, - callerApp, resultRecord, resultStack); + inTask != null, callerApp, resultRecord, resultStack); abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid, callingPid, resolvedType, aInfo.applicationInfo); diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java index 18e842f3e694f..1520859d4aacb 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java @@ -243,7 +243,7 @@ public class ActivityStarterTests extends ActivityTestsBase { if (containsConditions(preconditions,PRECONDITION_CANNOT_START_ANY_ACTIVITY)) { doReturn(false).when(service.mStackSupervisor).checkStartAnyActivityPermission( any(), any(), any(), anyInt(), anyInt(), anyInt(), any(), - anyBoolean(), any(), any(), any()); + anyBoolean(), anyBoolean(), any(), any(), any()); } try { @@ -302,7 +302,7 @@ public class ActivityStarterTests extends ActivityTestsBase { // always allow test to start activity. doReturn(true).when(mService.mStackSupervisor).checkStartAnyActivityPermission( any(), any(), any(), anyInt(), anyInt(), anyInt(), any(), - anyBoolean(), any(), any(), any()); + anyBoolean(), anyBoolean(), any(), any(), any()); // instrument the stack and task used. final ActivityStack stack = mService.mStackSupervisor.getDefaultDisplay().createStack(