Loading core/java/android/widget/RemoteViews.java +10 −6 Original line number Diff line number Diff line Loading @@ -6495,13 +6495,17 @@ public class RemoteViews implements Parcelable, Filter { && context.getPackageName().equals(mApplication.packageName)) { return context; } try { ApplicationInfo sanitizedApplication = mApplication; try { // Use PackageManager as the source of truth for application information, rather // than the parceled ApplicationInfo provided by the app. ApplicationInfo sanitizedApplication = context.getPackageManager().getApplicationInfoAsUser( mApplication.packageName, 0, UserHandle.getUserId(mApplication.uid)); sanitizedApplication = context.getPackageManager().getApplicationInfoAsUser( mApplication.packageName, 0, UserHandle.getUserId(mApplication.uid)); } catch(SecurityException se) { Log.d(LOG_TAG, "Unable to fetch appInfo for " + mApplication.packageName); } Context applicationContext = context.createApplicationContext( sanitizedApplication, Context.CONTEXT_RESTRICTED); Loading services/core/java/com/android/server/wm/ActivityRecord.java +25 −0 Original line number Diff line number Diff line Loading @@ -236,7 +236,9 @@ import static com.android.server.wm.IdentifierProto.USER_ID; import static com.android.server.wm.LetterboxConfiguration.DEFAULT_LETTERBOX_ASPECT_RATIO_FOR_MULTI_WINDOW; import static com.android.server.wm.LetterboxConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_COPY_TO_CLIENT; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_IDLE; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_REMOVE_DIRECTLY; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_PREDICT_BACK; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; Loading Loading @@ -2921,9 +2923,28 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A attachStartingSurfaceToAssociatedTask(); } /** * If the device is locked and the app does not request showWhenLocked, * defer removing the starting window until the transition is complete. * This prevents briefly appearing the app context and causing secure concern. */ void deferStartingWindowRemovalForKeyguardUnoccluding() { if (mStartingData != null && mStartingData.mRemoveAfterTransaction != AFTER_TRANSITION_FINISH && isKeyguardLocked() && !canShowWhenLockedInner(this) && !isVisibleRequested() && mTransitionController.inTransition(this)) { mStartingData.mRemoveAfterTransaction = AFTER_TRANSITION_FINISH; } } void removeStartingWindow() { boolean prevEligibleForLetterboxEducation = isEligibleForLetterboxEducation(); if (mStartingData != null && mStartingData.mRemoveAfterTransaction == AFTER_TRANSITION_FINISH) { return; } if (transferSplashScreenIfNeeded()) { return; } Loading Loading @@ -4641,6 +4662,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A tStartingWindow.mToken = this; tStartingWindow.mActivityRecord = this; if (mStartingData.mRemoveAfterTransaction == AFTER_TRANSITION_FINISH) { mStartingData.mRemoveAfterTransaction = AFTER_TRANSACTION_IDLE; } ProtoLog.v(WM_DEBUG_ADD_REMOVE, "Removing starting %s from %s", tStartingWindow, fromActivity); mTransitionController.collect(tStartingWindow); Loading services/core/java/com/android/server/wm/StartingData.java +7 −0 Original line number Diff line number Diff line Loading @@ -31,11 +31,18 @@ public abstract class StartingData { static final int AFTER_TRANSACTION_REMOVE_DIRECTLY = 1; /** Do copy splash screen to client after transaction done. */ static final int AFTER_TRANSACTION_COPY_TO_CLIENT = 2; /** * Remove the starting window after transition finish. * Used when activity doesn't request show when locked, so the app window should never show to * the user if device is locked. **/ static final int AFTER_TRANSITION_FINISH = 3; @IntDef(prefix = { "AFTER_TRANSACTION" }, value = { AFTER_TRANSACTION_IDLE, AFTER_TRANSACTION_REMOVE_DIRECTLY, AFTER_TRANSACTION_COPY_TO_CLIENT, AFTER_TRANSITION_FINISH, }) @interface AfterTransaction {} Loading services/core/java/com/android/server/wm/Transition.java +9 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_R import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SPLASH_SCREEN; import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_WINDOWS_DRAWN; import static com.android.server.wm.WindowState.BLAST_TIMEOUT_DURATION; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_IDLE; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import android.annotation.IntDef; import android.annotation.NonNull; Loading Loading @@ -1261,6 +1263,13 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { enterAutoPip = true; } } if (ar.mStartingData != null && ar.mStartingData.mRemoveAfterTransaction == AFTER_TRANSITION_FINISH && (!ar.isVisible() || !ar.mTransitionController.inTransition(ar))) { ar.mStartingData.mRemoveAfterTransaction = AFTER_TRANSACTION_IDLE; ar.removeStartingWindow(); } final ChangeInfo changeInfo = mChanges.get(ar); // Due to transient-hide, there may be some activities here which weren't in the // transition. Loading services/core/java/com/android/server/wm/WindowState.java +15 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,7 @@ import static com.android.server.wm.IdentifierProto.USER_ID; import static com.android.server.wm.MoveAnimationSpecProto.DURATION_MS; import static com.android.server.wm.MoveAnimationSpecProto.FROM; import static com.android.server.wm.MoveAnimationSpecProto.TO; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; Loading Loading @@ -1874,6 +1875,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } final ActivityRecord atoken = mActivityRecord; if (atoken != null) { if (atoken.mStartingData != null && mAttrs.type != TYPE_APPLICATION_STARTING && atoken.mStartingData.mRemoveAfterTransaction == AFTER_TRANSITION_FINISH) { // Preventing app window from visible during un-occluding animation playing due to // alpha blending. return false; } final boolean isVisible = isStartingWindowAssociatedToTask() ? mStartingData.mAssociatedTask.isVisible() : atoken.isVisible(); return ((!isParentWindowHidden() && isVisible) Loading Loading @@ -2862,7 +2870,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final int mask = FLAG_SHOW_WHEN_LOCKED | FLAG_DISMISS_KEYGUARD | FLAG_ALLOW_LOCK_WHILE_SCREEN_ON; WindowManager.LayoutParams sa = mActivityRecord.mStartingWindow.mAttrs; final boolean wasShowWhenLocked = (sa.flags & FLAG_SHOW_WHEN_LOCKED) != 0; final boolean removeShowWhenLocked = (mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) == 0; sa.flags = (sa.flags & ~mask) | (mAttrs.flags & mask); if (wasShowWhenLocked && removeShowWhenLocked) { // Trigger unoccluding animation if needed. mActivityRecord.checkKeyguardFlagsChanged(); mActivityRecord.deferStartingWindowRemovalForKeyguardUnoccluding(); } } } Loading Loading
core/java/android/widget/RemoteViews.java +10 −6 Original line number Diff line number Diff line Loading @@ -6495,13 +6495,17 @@ public class RemoteViews implements Parcelable, Filter { && context.getPackageName().equals(mApplication.packageName)) { return context; } try { ApplicationInfo sanitizedApplication = mApplication; try { // Use PackageManager as the source of truth for application information, rather // than the parceled ApplicationInfo provided by the app. ApplicationInfo sanitizedApplication = context.getPackageManager().getApplicationInfoAsUser( mApplication.packageName, 0, UserHandle.getUserId(mApplication.uid)); sanitizedApplication = context.getPackageManager().getApplicationInfoAsUser( mApplication.packageName, 0, UserHandle.getUserId(mApplication.uid)); } catch(SecurityException se) { Log.d(LOG_TAG, "Unable to fetch appInfo for " + mApplication.packageName); } Context applicationContext = context.createApplicationContext( sanitizedApplication, Context.CONTEXT_RESTRICTED); Loading
services/core/java/com/android/server/wm/ActivityRecord.java +25 −0 Original line number Diff line number Diff line Loading @@ -236,7 +236,9 @@ import static com.android.server.wm.IdentifierProto.USER_ID; import static com.android.server.wm.LetterboxConfiguration.DEFAULT_LETTERBOX_ASPECT_RATIO_FOR_MULTI_WINDOW; import static com.android.server.wm.LetterboxConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_COPY_TO_CLIENT; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_IDLE; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_REMOVE_DIRECTLY; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_PREDICT_BACK; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; Loading Loading @@ -2921,9 +2923,28 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A attachStartingSurfaceToAssociatedTask(); } /** * If the device is locked and the app does not request showWhenLocked, * defer removing the starting window until the transition is complete. * This prevents briefly appearing the app context and causing secure concern. */ void deferStartingWindowRemovalForKeyguardUnoccluding() { if (mStartingData != null && mStartingData.mRemoveAfterTransaction != AFTER_TRANSITION_FINISH && isKeyguardLocked() && !canShowWhenLockedInner(this) && !isVisibleRequested() && mTransitionController.inTransition(this)) { mStartingData.mRemoveAfterTransaction = AFTER_TRANSITION_FINISH; } } void removeStartingWindow() { boolean prevEligibleForLetterboxEducation = isEligibleForLetterboxEducation(); if (mStartingData != null && mStartingData.mRemoveAfterTransaction == AFTER_TRANSITION_FINISH) { return; } if (transferSplashScreenIfNeeded()) { return; } Loading Loading @@ -4641,6 +4662,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A tStartingWindow.mToken = this; tStartingWindow.mActivityRecord = this; if (mStartingData.mRemoveAfterTransaction == AFTER_TRANSITION_FINISH) { mStartingData.mRemoveAfterTransaction = AFTER_TRANSACTION_IDLE; } ProtoLog.v(WM_DEBUG_ADD_REMOVE, "Removing starting %s from %s", tStartingWindow, fromActivity); mTransitionController.collect(tStartingWindow); Loading
services/core/java/com/android/server/wm/StartingData.java +7 −0 Original line number Diff line number Diff line Loading @@ -31,11 +31,18 @@ public abstract class StartingData { static final int AFTER_TRANSACTION_REMOVE_DIRECTLY = 1; /** Do copy splash screen to client after transaction done. */ static final int AFTER_TRANSACTION_COPY_TO_CLIENT = 2; /** * Remove the starting window after transition finish. * Used when activity doesn't request show when locked, so the app window should never show to * the user if device is locked. **/ static final int AFTER_TRANSITION_FINISH = 3; @IntDef(prefix = { "AFTER_TRANSACTION" }, value = { AFTER_TRANSACTION_IDLE, AFTER_TRANSACTION_REMOVE_DIRECTLY, AFTER_TRANSACTION_COPY_TO_CLIENT, AFTER_TRANSITION_FINISH, }) @interface AfterTransaction {} Loading
services/core/java/com/android/server/wm/Transition.java +9 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_R import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SPLASH_SCREEN; import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_WINDOWS_DRAWN; import static com.android.server.wm.WindowState.BLAST_TIMEOUT_DURATION; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_IDLE; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import android.annotation.IntDef; import android.annotation.NonNull; Loading Loading @@ -1261,6 +1263,13 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { enterAutoPip = true; } } if (ar.mStartingData != null && ar.mStartingData.mRemoveAfterTransaction == AFTER_TRANSITION_FINISH && (!ar.isVisible() || !ar.mTransitionController.inTransition(ar))) { ar.mStartingData.mRemoveAfterTransaction = AFTER_TRANSACTION_IDLE; ar.removeStartingWindow(); } final ChangeInfo changeInfo = mChanges.get(ar); // Due to transient-hide, there may be some activities here which weren't in the // transition. Loading
services/core/java/com/android/server/wm/WindowState.java +15 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,7 @@ import static com.android.server.wm.IdentifierProto.USER_ID; import static com.android.server.wm.MoveAnimationSpecProto.DURATION_MS; import static com.android.server.wm.MoveAnimationSpecProto.FROM; import static com.android.server.wm.MoveAnimationSpecProto.TO; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; Loading Loading @@ -1874,6 +1875,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } final ActivityRecord atoken = mActivityRecord; if (atoken != null) { if (atoken.mStartingData != null && mAttrs.type != TYPE_APPLICATION_STARTING && atoken.mStartingData.mRemoveAfterTransaction == AFTER_TRANSITION_FINISH) { // Preventing app window from visible during un-occluding animation playing due to // alpha blending. return false; } final boolean isVisible = isStartingWindowAssociatedToTask() ? mStartingData.mAssociatedTask.isVisible() : atoken.isVisible(); return ((!isParentWindowHidden() && isVisible) Loading Loading @@ -2862,7 +2870,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final int mask = FLAG_SHOW_WHEN_LOCKED | FLAG_DISMISS_KEYGUARD | FLAG_ALLOW_LOCK_WHILE_SCREEN_ON; WindowManager.LayoutParams sa = mActivityRecord.mStartingWindow.mAttrs; final boolean wasShowWhenLocked = (sa.flags & FLAG_SHOW_WHEN_LOCKED) != 0; final boolean removeShowWhenLocked = (mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) == 0; sa.flags = (sa.flags & ~mask) | (mAttrs.flags & mask); if (wasShowWhenLocked && removeShowWhenLocked) { // Trigger unoccluding animation if needed. mActivityRecord.checkKeyguardFlagsChanged(); mActivityRecord.deferStartingWindowRemovalForKeyguardUnoccluding(); } } } Loading