diff options
| author | 2019-04-25 17:33:42 +0100 | |
|---|---|---|
| committer | 2019-05-01 13:54:50 +0000 | |
| commit | 1548684f7bcd813a40bae45b58607b024b9f5d33 (patch) | |
| tree | e72437eaabf86ca806553506d725fd12c2f171ca | |
| parent | 03979973108bee42e373b36e66be6c7947c923e9 (diff) | |
Allow holders of SYSTEM_ALERT_WINDOW permission to start
activities from background
Bug: 130222474
Test: manual, seeing log:
mkarpinski@mkarpinski2:~/android/qt-dev$ adb logcat -b system | grep "allowed because SYSTEM"
04-26 15:55:41.761 1283 3067 W ActivityTaskManager: Background activity start for com.facebook.orca allowed because SYSTEM_ALERT_WINDOW permission is granted.
Change-Id: I7d0a2ae7fde9b1f7f96a4936d872397a7e07ce0e
3 files changed, 29 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 4ef8753bd131..6976aa9432e9 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1038,6 +1038,12 @@ class ActivityStarter { } } } + // don't abort if the callingUid has SYSTEM_ALERT_WINDOW permission + if (mService.hasSystemAlertWindowPermission(callingUid, callingPid, callingPackage)) { + Slog.w(TAG, "Background activity start for " + callingPackage + + " allowed because SYSTEM_ALERT_WINDOW permission is granted."); + return false; + } // anything that has fallen through would currently be aborted Slog.w(TAG, "Background activity start [callingPackage: " + callingPackage + "; callingUid: " + callingUid diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 7bc9600f50b4..4a6aa336e36f 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -108,12 +108,10 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_SWITC import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_VISIBILITY; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; -import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_ACTIVITY_ID; import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT; import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_DATA; import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS; import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE; -import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_TASK_ID; import static com.android.server.wm.ActivityTaskManagerService.H.REPORT_TIME_TRACKER_MSG; import static com.android.server.wm.ActivityTaskManagerService.UiHandler.DISMISS_DIALOG_UI_MSG; import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE; @@ -136,6 +134,7 @@ import android.app.ActivityTaskManager; import android.app.ActivityThread; import android.app.AlertDialog; import android.app.AppGlobals; +import android.app.AppOpsManager; import android.app.Dialog; import android.app.IActivityController; import android.app.IActivityTaskManager; @@ -216,7 +215,6 @@ import android.text.format.Time; import android.util.ArrayMap; import android.util.EventLog; import android.util.Log; -import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; @@ -875,6 +873,16 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return getUserManager().hasUserRestriction(restriction, userId); } + boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, String callingPackage) { + final int mode = getAppOpsService().noteOperation(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, + callingUid, callingPackage); + if (mode == AppOpsManager.MODE_DEFAULT) { + return checkPermission(Manifest.permission.SYSTEM_ALERT_WINDOW, callingPid, callingUid) + == PERMISSION_GRANTED; + } + return mode == AppOpsManager.MODE_ALLOWED; + } + protected RecentTasks createRecentTasks() { return new RecentTasks(this, mStackSupervisor); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index afd4ec160aad..2991dffefa8e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -41,6 +41,7 @@ import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; import android.app.ActivityManagerInternal; import android.app.ActivityOptions; +import android.app.AppOpsManager; import android.app.IApplicationThread; import android.content.ComponentName; import android.content.Context; @@ -413,12 +414,18 @@ class ActivityTestsBase { ActivityStackSupervisor mTestStackSupervisor; ActivityDisplay mDefaultDisplay; + AppOpsService mAppOpsService; TestActivityTaskManagerService(Context context) { super(context); spyOn(this); mUgmInternal = mock(UriGrantsManagerInternal.class); + mAppOpsService = mock(AppOpsService.class); + + // Make sure permission checks aren't overridden. + doReturn(AppOpsManager.MODE_DEFAULT) + .when(mAppOpsService).noteOperation(anyInt(), anyInt(), anyString()); mSupportsMultiWindow = true; mSupportsMultiDisplay = true; @@ -482,6 +489,11 @@ class ActivityTestsBase { } @Override + AppOpsService getAppOpsService() { + return mAppOpsService; + } + + @Override void updateCpuStats() { } |