Loading core/java/android/service/dreams/flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,16 @@ flag { bug: "334083490" } flag { name: "dismiss_dream_on_keyguard_dismiss" namespace: "systemui" description: "Dismisses the dream in the keyguard-going-away transition, preventing it from being visible" bug: "333829441" metadata { purpose: PURPOSE_BUGFIX } } flag { name: "dream_tracks_focus" namespace: "communal" Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +3 −1 Original line number Diff line number Diff line Loading @@ -702,10 +702,12 @@ public abstract class WMShellBaseModule { ShellInit shellInit, ShellController shellController, Transitions transitions, TaskStackListenerImpl taskStackListener, @ShellMainThread Handler mainHandler, @ShellMainThread ShellExecutor mainExecutor) { return new KeyguardTransitionHandler( shellInit, shellController, transitions, mainHandler, mainExecutor); shellInit, shellController, transitions, taskStackListener, mainHandler, mainExecutor); } @WMSingleton Loading libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java +26 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.service.dreams.Flags.dismissDreamOnKeyguardDismiss; import static android.view.WindowManager.KEYGUARD_VISIBILITY_TRANSIT_FLAGS; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED; Loading @@ -44,10 +45,13 @@ import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.shared.annotations.ExternalThread; import com.android.wm.shell.sysui.KeyguardChangeListener; Loading @@ -62,7 +66,8 @@ import com.android.wm.shell.transition.Transitions.TransitionFinishCallback; * <p>This takes the highest priority. */ public class KeyguardTransitionHandler implements Transitions.TransitionHandler, KeyguardChangeListener { implements Transitions.TransitionHandler, KeyguardChangeListener, TaskStackListenerCallback { private static final String TAG = "KeyguardTransition"; private final Transitions mTransitions; Loading @@ -71,6 +76,7 @@ public class KeyguardTransitionHandler private final ShellExecutor mMainExecutor; private final ArrayMap<IBinder, StartedTransition> mStartedTransitions = new ArrayMap<>(); private final TaskStackListenerImpl mTaskStackListener; /** * Local IRemoteTransition implementations registered by the keyguard service. Loading @@ -87,6 +93,8 @@ public class KeyguardTransitionHandler // Last value reported by {@link KeyguardChangeListener}. private boolean mKeyguardShowing = true; @Nullable private WindowContainerToken mDreamToken; private final class StartedTransition { final TransitionInfo mInfo; Loading @@ -105,18 +113,23 @@ public class KeyguardTransitionHandler @NonNull ShellInit shellInit, @NonNull ShellController shellController, @NonNull Transitions transitions, @NonNull TaskStackListenerImpl taskStackListener, @NonNull Handler mainHandler, @NonNull ShellExecutor mainExecutor) { mTransitions = transitions; mShellController = shellController; mMainHandler = mainHandler; mMainExecutor = mainExecutor; mTaskStackListener = taskStackListener; shellInit.addInitCallback(this::onInit, this); } private void onInit() { mTransitions.addHandler(this); mShellController.addKeyguardChangeListener(this); if (dismissDreamOnKeyguardDismiss()) { mTaskStackListener.addListener(this); } } /** Loading @@ -141,6 +154,11 @@ public class KeyguardTransitionHandler return mKeyguardShowing; } @Override public void onTaskMovedToFront(ActivityManager.RunningTaskInfo taskInfo) { mDreamToken = taskInfo.getActivityType() == ACTIVITY_TYPE_DREAM ? taskInfo.token : null; } @Override public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction, Loading Loading @@ -271,6 +289,13 @@ public class KeyguardTransitionHandler @Override public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { if (dismissDreamOnKeyguardDismiss() && (request.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0 && mDreamToken != null) { // Dismiss the dream in the same transaction, so that it isn't visible once the device // is unlocked. return new WindowContainerTransaction().removeTask(mDreamToken); } return null; } Loading packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +17 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.keyguard; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.service.dreams.Flags.dismissDreamOnKeyguardDismiss; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; Loading Loading @@ -89,14 +90,14 @@ import com.android.wm.shell.shared.ShellTransitions; import com.android.wm.shell.shared.TransitionUtil; import com.android.wm.shell.transition.Transitions; import kotlinx.coroutines.CoroutineScope; import java.util.ArrayList; import java.util.Map; import java.util.WeakHashMap; import javax.inject.Inject; import kotlinx.coroutines.CoroutineScope; public class KeyguardService extends Service { static final String TAG = "KeyguardService"; static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD; Loading Loading @@ -223,6 +224,20 @@ public class KeyguardService extends Service { initAlphaForAnimationTargets(t, apps); initAlphaForAnimationTargets(t, wallpapers); // If the keyguard is going away, hide the dream if one exists. if (dismissDreamOnKeyguardDismiss() && (info.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0) { for (RemoteAnimationTarget app : apps) { final boolean isDream = app.taskInfo != null && app.taskInfo.getActivityType() == WindowConfiguration.ACTIVITY_TYPE_DREAM; if (isDream && app.mode == RemoteAnimationTarget.MODE_CLOSING) { t.hide(app.leash); break; } } } t.apply(); runner.onAnimationStart( Loading packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +11 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.provider.Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT; import static android.provider.Settings.System.LOCKSCREEN_SOUNDS_ENABLED; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; import static android.service.dreams.Flags.dismissDreamOnKeyguardDismiss; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT; Loading Loading @@ -3092,13 +3093,22 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, createInteractionJankMonitorConf( CUJ_LOCKSCREEN_UNLOCK_ANIMATION, "DismissPanel")); // Filter out any closing apps, such as the dream. RemoteAnimationTarget[] openingApps = apps; if (dismissDreamOnKeyguardDismiss()) { openingApps = Arrays.stream(apps) .filter(a -> a.mode == RemoteAnimationTarget.MODE_OPENING) .toArray(RemoteAnimationTarget[]::new); } // Pass the surface and metadata to the unlock animation controller. RemoteAnimationTarget[] openingWallpapers = Arrays.stream(wallpapers).filter( w -> w.mode == RemoteAnimationTarget.MODE_OPENING).toArray( RemoteAnimationTarget[]::new); mKeyguardUnlockAnimationControllerLazy.get() .notifyStartSurfaceBehindRemoteAnimation( apps, openingWallpapers, startTime, openingApps, openingWallpapers, startTime, mSurfaceBehindRemoteAnimationRequested); } else { mInteractionJankMonitor.begin( Loading Loading
core/java/android/service/dreams/flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,16 @@ flag { bug: "334083490" } flag { name: "dismiss_dream_on_keyguard_dismiss" namespace: "systemui" description: "Dismisses the dream in the keyguard-going-away transition, preventing it from being visible" bug: "333829441" metadata { purpose: PURPOSE_BUGFIX } } flag { name: "dream_tracks_focus" namespace: "communal" Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +3 −1 Original line number Diff line number Diff line Loading @@ -702,10 +702,12 @@ public abstract class WMShellBaseModule { ShellInit shellInit, ShellController shellController, Transitions transitions, TaskStackListenerImpl taskStackListener, @ShellMainThread Handler mainHandler, @ShellMainThread ShellExecutor mainExecutor) { return new KeyguardTransitionHandler( shellInit, shellController, transitions, mainHandler, mainExecutor); shellInit, shellController, transitions, taskStackListener, mainHandler, mainExecutor); } @WMSingleton Loading
libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java +26 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.service.dreams.Flags.dismissDreamOnKeyguardDismiss; import static android.view.WindowManager.KEYGUARD_VISIBILITY_TRANSIT_FLAGS; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED; Loading @@ -44,10 +45,13 @@ import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.shared.annotations.ExternalThread; import com.android.wm.shell.sysui.KeyguardChangeListener; Loading @@ -62,7 +66,8 @@ import com.android.wm.shell.transition.Transitions.TransitionFinishCallback; * <p>This takes the highest priority. */ public class KeyguardTransitionHandler implements Transitions.TransitionHandler, KeyguardChangeListener { implements Transitions.TransitionHandler, KeyguardChangeListener, TaskStackListenerCallback { private static final String TAG = "KeyguardTransition"; private final Transitions mTransitions; Loading @@ -71,6 +76,7 @@ public class KeyguardTransitionHandler private final ShellExecutor mMainExecutor; private final ArrayMap<IBinder, StartedTransition> mStartedTransitions = new ArrayMap<>(); private final TaskStackListenerImpl mTaskStackListener; /** * Local IRemoteTransition implementations registered by the keyguard service. Loading @@ -87,6 +93,8 @@ public class KeyguardTransitionHandler // Last value reported by {@link KeyguardChangeListener}. private boolean mKeyguardShowing = true; @Nullable private WindowContainerToken mDreamToken; private final class StartedTransition { final TransitionInfo mInfo; Loading @@ -105,18 +113,23 @@ public class KeyguardTransitionHandler @NonNull ShellInit shellInit, @NonNull ShellController shellController, @NonNull Transitions transitions, @NonNull TaskStackListenerImpl taskStackListener, @NonNull Handler mainHandler, @NonNull ShellExecutor mainExecutor) { mTransitions = transitions; mShellController = shellController; mMainHandler = mainHandler; mMainExecutor = mainExecutor; mTaskStackListener = taskStackListener; shellInit.addInitCallback(this::onInit, this); } private void onInit() { mTransitions.addHandler(this); mShellController.addKeyguardChangeListener(this); if (dismissDreamOnKeyguardDismiss()) { mTaskStackListener.addListener(this); } } /** Loading @@ -141,6 +154,11 @@ public class KeyguardTransitionHandler return mKeyguardShowing; } @Override public void onTaskMovedToFront(ActivityManager.RunningTaskInfo taskInfo) { mDreamToken = taskInfo.getActivityType() == ACTIVITY_TYPE_DREAM ? taskInfo.token : null; } @Override public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction, Loading Loading @@ -271,6 +289,13 @@ public class KeyguardTransitionHandler @Override public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { if (dismissDreamOnKeyguardDismiss() && (request.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0 && mDreamToken != null) { // Dismiss the dream in the same transaction, so that it isn't visible once the device // is unlocked. return new WindowContainerTransaction().removeTask(mDreamToken); } return null; } Loading
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +17 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.keyguard; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.service.dreams.Flags.dismissDreamOnKeyguardDismiss; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; Loading Loading @@ -89,14 +90,14 @@ import com.android.wm.shell.shared.ShellTransitions; import com.android.wm.shell.shared.TransitionUtil; import com.android.wm.shell.transition.Transitions; import kotlinx.coroutines.CoroutineScope; import java.util.ArrayList; import java.util.Map; import java.util.WeakHashMap; import javax.inject.Inject; import kotlinx.coroutines.CoroutineScope; public class KeyguardService extends Service { static final String TAG = "KeyguardService"; static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD; Loading Loading @@ -223,6 +224,20 @@ public class KeyguardService extends Service { initAlphaForAnimationTargets(t, apps); initAlphaForAnimationTargets(t, wallpapers); // If the keyguard is going away, hide the dream if one exists. if (dismissDreamOnKeyguardDismiss() && (info.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0) { for (RemoteAnimationTarget app : apps) { final boolean isDream = app.taskInfo != null && app.taskInfo.getActivityType() == WindowConfiguration.ACTIVITY_TYPE_DREAM; if (isDream && app.mode == RemoteAnimationTarget.MODE_CLOSING) { t.hide(app.leash); break; } } } t.apply(); runner.onAnimationStart( Loading
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +11 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.provider.Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT; import static android.provider.Settings.System.LOCKSCREEN_SOUNDS_ENABLED; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; import static android.service.dreams.Flags.dismissDreamOnKeyguardDismiss; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT; Loading Loading @@ -3092,13 +3093,22 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, createInteractionJankMonitorConf( CUJ_LOCKSCREEN_UNLOCK_ANIMATION, "DismissPanel")); // Filter out any closing apps, such as the dream. RemoteAnimationTarget[] openingApps = apps; if (dismissDreamOnKeyguardDismiss()) { openingApps = Arrays.stream(apps) .filter(a -> a.mode == RemoteAnimationTarget.MODE_OPENING) .toArray(RemoteAnimationTarget[]::new); } // Pass the surface and metadata to the unlock animation controller. RemoteAnimationTarget[] openingWallpapers = Arrays.stream(wallpapers).filter( w -> w.mode == RemoteAnimationTarget.MODE_OPENING).toArray( RemoteAnimationTarget[]::new); mKeyguardUnlockAnimationControllerLazy.get() .notifyStartSurfaceBehindRemoteAnimation( apps, openingWallpapers, startTime, openingApps, openingWallpapers, startTime, mSurfaceBehindRemoteAnimationRequested); } else { mInteractionJankMonitor.begin( Loading