Loading services/core/java/com/android/server/wm/ActivityRecord.java +33 −3 Original line number Diff line number Diff line Loading @@ -225,7 +225,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 @@ -2814,9 +2816,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 @@ -4487,6 +4508,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 Loading @@ -4668,17 +4693,22 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (r == null || r.getTaskFragment() == null) { return false; } if (!r.inPinnedWindowingMode() && (r.mShowWhenLocked || r.containsShowWhenLockedWindow())) { if (canShowWhenLockedInner(r)) { return true; } else if (r.mInheritShownWhenLocked) { final ActivityRecord activity = r.getTaskFragment().getActivityBelow(r); return activity != null && !activity.inPinnedWindowingMode() && (activity.mShowWhenLocked || activity.containsShowWhenLockedWindow()); return activity != null && canShowWhenLockedInner(activity); } else { return false; } } /** @see #canShowWhenLocked(ActivityRecord) */ private static boolean canShowWhenLockedInner(@NonNull ActivityRecord r) { return !r.inPinnedWindowingMode() && (r.mShowWhenLocked || r.containsShowWhenLockedWindow()); } /** * Determines if the activity can show while lock-screen is displayed. System displays * activities while lock-screen is displayed only if all activities 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 @@ -63,6 +63,8 @@ import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_RECENTS_ANIM; 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.StartingData.AFTER_TRANSACTION_IDLE; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import android.annotation.IntDef; import android.annotation.NonNull; Loading Loading @@ -1202,6 +1204,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 @@ -124,6 +124,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 @@ -1935,6 +1936,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 @@ -2909,7 +2917,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
services/core/java/com/android/server/wm/ActivityRecord.java +33 −3 Original line number Diff line number Diff line Loading @@ -225,7 +225,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 @@ -2814,9 +2816,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 @@ -4487,6 +4508,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 Loading @@ -4668,17 +4693,22 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (r == null || r.getTaskFragment() == null) { return false; } if (!r.inPinnedWindowingMode() && (r.mShowWhenLocked || r.containsShowWhenLockedWindow())) { if (canShowWhenLockedInner(r)) { return true; } else if (r.mInheritShownWhenLocked) { final ActivityRecord activity = r.getTaskFragment().getActivityBelow(r); return activity != null && !activity.inPinnedWindowingMode() && (activity.mShowWhenLocked || activity.containsShowWhenLockedWindow()); return activity != null && canShowWhenLockedInner(activity); } else { return false; } } /** @see #canShowWhenLocked(ActivityRecord) */ private static boolean canShowWhenLockedInner(@NonNull ActivityRecord r) { return !r.inPinnedWindowingMode() && (r.mShowWhenLocked || r.containsShowWhenLockedWindow()); } /** * Determines if the activity can show while lock-screen is displayed. System displays * activities while lock-screen is displayed only if all activities 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 @@ -63,6 +63,8 @@ import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_RECENTS_ANIM; 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.StartingData.AFTER_TRANSACTION_IDLE; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import android.annotation.IntDef; import android.annotation.NonNull; Loading Loading @@ -1202,6 +1204,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 @@ -124,6 +124,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 @@ -1935,6 +1936,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 @@ -2909,7 +2917,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