From 2f273c575b22dca52bafcbf6393662be3546c8bf Mon Sep 17 00:00:00 2001 From: Xin Li Date: Tue, 3 Aug 2021 11:41:26 -0700 Subject: [PATCH] DO NOT MERGE - Merge RQ3A.210805.001.A1. Bug: 192585466 Merged-In: Ibcfeef30c8cb88e244561cac99c034981b84ed80 Change-Id: I0dee74b1878f1baac52794efc6036a732240f8f3 --- .../ExternalStorageProvider.java | 5 +++ .../com/android/server/am/ActiveServices.java | 13 +++++- .../stats/pull/StatsPullAtomService.java | 6 ++- .../server/wm/RootWindowContainer.java | 40 +++++++++++++++---- .../server/wm/RootWindowContainerTests.java | 33 --------------- .../android/telephony/SubscriptionInfo.java | 7 ++++ 6 files changed, 61 insertions(+), 43 deletions(-) diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 11d1b0a9ef2a2..087275e73ee82 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -322,6 +322,11 @@ public class ExternalStorageProvider extends FileSystemProvider { return true; } + if (TextUtils.equals(Environment.DIRECTORY_ANDROID.toLowerCase(), + path.toLowerCase())) { + return true; + } + return false; } catch (IOException e) { throw new IllegalArgumentException( diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index b886dc1822012..b1ffaeb509121 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -935,7 +935,18 @@ public final class ActiveServices { void killMisbehavingService(ServiceRecord r, int appUid, int appPid, String localPackageName) { synchronized (mAm) { - stopServiceLocked(r); + if (!r.destroying) { + // This service is still alive, stop it. + stopServiceLocked(r); + } else { + // Check if there is another instance of it being started in parallel, + // if so, stop that too to avoid spamming the system. + final ServiceMap smap = getServiceMapLocked(r.userId); + final ServiceRecord found = smap.mServicesByInstanceName.remove(r.instanceName); + if (found != null) { + stopServiceLocked(found); + } + } mAm.crashApplication(appUid, appPid, localPackageName, -1, "Bad notification for startForeground", true /*force*/); } diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 5decf5efd876f..03900150cfaec 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -3362,7 +3362,11 @@ public class StatsPullAtomService extends SystemService { int pullFaceSettingsLocked(int atomTag, List pulledData) { final long callingToken = Binder.clearCallingIdentity(); try { - List users = mContext.getSystemService(UserManager.class).getUsers(); + UserManager manager = mContext.getSystemService(UserManager.class); + if (manager == null) { + return StatsManager.PULL_SKIP; + } + List users = manager.getUsers(); int numUsers = users.size(); FaceManager faceManager = mContext.getSystemService(FaceManager.class); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index ddad1dbd9b3d5..eaf76938e2e83 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -3372,7 +3372,7 @@ class RootWindowContainer extends WindowContainer } /** - * Find all task stacks containing {@param userId} and intercept them with an activity + * Find all visible task stacks containing {@param userId} and intercept them with an activity * to block out the contents and possibly start a credential-confirming intent. * * @param userId user handle for the locked managed profile. @@ -3380,18 +3380,42 @@ class RootWindowContainer extends WindowContainer void lockAllProfileTasks(@UserIdInt int userId) { mService.deferWindowLayout(); try { - forAllLeafTasks(task -> { - if (task.getActivity(activity -> !activity.finishing && activity.mUserId == userId) - != null) { - mService.getTaskChangeNotificationController().notifyTaskProfileLocked( - task.mTaskId, userId); - } - }, true /* traverseTopToBottom */); + final PooledConsumer c = PooledLambda.obtainConsumer( + RootWindowContainer::taskTopActivityIsUser, this, PooledLambda.__(Task.class), + userId); + forAllLeafTasks(c, true /* traverseTopToBottom */); + c.recycle(); } finally { mService.continueWindowLayout(); } } + /** + * Detects whether we should show a lock screen in front of this task for a locked user. + *

+ * We'll do this if either of the following holds: + *

    + *
  • The top activity explicitly belongs to {@param userId}.
  • + *
  • The top activity returns a result to an activity belonging to {@param userId}.
  • + *
+ * + * @return {@code true} if the top activity looks like it belongs to {@param userId}. + */ + private void taskTopActivityIsUser(Task task, @UserIdInt int userId) { + // To handle the case that work app is in the task but just is not the top one. + final ActivityRecord activityRecord = task.getTopNonFinishingActivity(); + final ActivityRecord resultTo = (activityRecord != null ? activityRecord.resultTo : null); + + // Check the task for a top activity belonging to userId, or returning a + // result to an activity belonging to userId. Example case: a document + // picker for personal files, opened by a work app, should still get locked. + if ((activityRecord != null && activityRecord.mUserId == userId) + || (resultTo != null && resultTo.mUserId == userId)) { + mService.getTaskChangeNotificationController().notifyTaskProfileLocked( + task.mTaskId, userId); + } + } + void cancelInitializingActivities() { for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java index 1aff8a7b53823..35d1b17d5822e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -25,7 +25,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; -import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.ActivityStack.ActivityState.FINISHING; import static com.android.server.wm.ActivityStack.ActivityState.PAUSED; import static com.android.server.wm.ActivityStack.ActivityState.PAUSING; @@ -37,13 +36,10 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.verify; import android.app.WindowConfiguration; import android.content.ComponentName; import android.content.pm.ActivityInfo; -import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; @@ -173,34 +169,5 @@ public class RootWindowContainerTests extends WindowTestsBase { activity.setState(FINISHING, "test FINISHING"); assertThat(mWm.mRoot.allPausedActivitiesComplete()).isTrue(); } - - @Test - public void testLockAllProfileTasks() { - // Make an activity visible with the user id set to 0 - DisplayContent displayContent = mWm.mRoot.getDisplayContent(DEFAULT_DISPLAY); - TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(0); - final ActivityStack stack = createTaskStackOnDisplay(WINDOWING_MODE_FULLSCREEN, - ACTIVITY_TYPE_STANDARD, displayContent); - final ActivityRecord activity = new ActivityTestsBase.ActivityBuilder(stack.mAtmService) - .setStack(stack) - .setUid(0) - .setCreateTask(true) - .build(); - - // Create another activity on top and the user id is 1 - Task task = activity.getTask(); - final ActivityRecord topActivity = new ActivityTestsBase.ActivityBuilder(mWm.mAtmService) - .setStack(stack) - .setUid(UserHandle.PER_USER_RANGE + 1) - .setTask(task) - .build(); - - // Make sure the listeners will be notified for putting the task to locked state - TaskChangeNotificationController controller = - mWm.mAtmService.getTaskChangeNotificationController(); - spyOn(controller); - mWm.mRoot.lockAllProfileTasks(0); - verify(controller).notifyTaskProfileLocked(eq(task.mTaskId), eq(0)); - } } diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index 2bbfdba425c9c..c86bedbc5ca5b 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -572,6 +572,13 @@ public class SubscriptionInfo implements Parcelable { return mGroupUUID; } + /** + * @hide + */ + public void clearGroupUuid() { + this.mGroupUUID = null; + } + /** * @hide */