diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java index a525c2c0219ce..3253bb06c835e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java @@ -87,4 +87,9 @@ public interface OneHanded { * Notifies when user switch complete */ void onUserSwitch(int userId); + + /** + * Notifies when keyguard visibility changed + */ + void onKeyguardVisibilityChanged(boolean showing); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index b43daa0da2c09..7e673c6e32c20 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -81,6 +81,7 @@ public class OneHandedController implements RemoteCallable private volatile boolean mIsSwipeToNotificationEnabled; private boolean mTaskChangeToExit; private boolean mLockedDisabled; + private boolean mKeyguardShowing; private int mUserId; private float mOffSetFraction; @@ -357,7 +358,7 @@ public class OneHandedController implements RemoteCallable @VisibleForTesting void startOneHanded() { - if (isLockedDisabled()) { + if (isLockedDisabled() || mKeyguardShowing) { Slog.d(TAG, "Temporary lock disabled"); return; } @@ -692,6 +693,10 @@ public class OneHandedController implements RemoteCallable mTutorialHandler.onConfigurationChanged(); } + private void onKeyguardVisibilityChanged(boolean showing) { + mKeyguardShowing = showing; + } + private void onUserSwitch(int newUserId) { unregisterSettingObservers(); mUserId = newUserId; @@ -838,6 +843,13 @@ public class OneHandedController implements RemoteCallable OneHandedController.this.onUserSwitch(userId); }); } + + @Override + public void onKeyguardVisibilityChanged(boolean showing) { + mMainExecutor.execute(() -> { + OneHandedController.this.onKeyguardVisibilityChanged(showing); + }); + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 7e847c8068f34..f2db4f1cd9017 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -45,6 +45,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.keyguard.ScreenLifecycle; +import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.shared.tracing.ProtoTraceable; @@ -116,6 +117,7 @@ public final class WMShell extends SystemUI private final NavigationModeController mNavigationModeController; private final ScreenLifecycle mScreenLifecycle; private final SysUiState mSysUiState; + private final WakefulnessLifecycle mWakefulnessLifecycle; private final ProtoTracer mProtoTracer; private final Executor mSysUiMainExecutor; @@ -124,6 +126,7 @@ public final class WMShell extends SystemUI private KeyguardUpdateMonitorCallback mSplitScreenKeyguardCallback; private KeyguardUpdateMonitorCallback mPipKeyguardCallback; private KeyguardUpdateMonitorCallback mOneHandedKeyguardCallback; + private WakefulnessLifecycle.Observer mWakefulnessObserver; @Inject public WMShell(Context context, @@ -140,6 +143,7 @@ public final class WMShell extends SystemUI ScreenLifecycle screenLifecycle, SysUiState sysUiState, ProtoTracer protoTracer, + WakefulnessLifecycle wakefulnessLifecycle, @Main Executor sysUiMainExecutor) { super(context); mCommandQueue = commandQueue; @@ -153,6 +157,7 @@ public final class WMShell extends SystemUI mSplitScreenOptional = splitScreenOptional; mOneHandedOptional = oneHandedOptional; mHideDisplayCutoutOptional = hideDisplayCutoutOptional; + mWakefulnessLifecycle = wakefulnessLifecycle; mProtoTracer = protoTracer; mShellCommandHandler = shellCommandHandler; mSysUiMainExecutor = sysUiMainExecutor; @@ -282,22 +287,9 @@ public final class WMShell extends SystemUI }); mOneHandedKeyguardCallback = new KeyguardUpdateMonitorCallback() { - @Override - public void onKeyguardBouncerChanged(boolean bouncer) { - if (bouncer) { - oneHanded.stopOneHanded(); - } - } - @Override public void onKeyguardVisibilityChanged(boolean showing) { - if (showing) { - // When keyguard shown, temperory lock OHM disabled to avoid mis-trigger. - oneHanded.setLockedDisabled(true /* locked */, false /* enabled */); - } else { - // Reset locked. - oneHanded.setLockedDisabled(false /* locked */, false /* enabled */); - } + oneHanded.onKeyguardVisibilityChanged(showing); oneHanded.stopOneHanded(); } @@ -308,6 +300,24 @@ public final class WMShell extends SystemUI }; mKeyguardUpdateMonitor.registerCallback(mOneHandedKeyguardCallback); + mWakefulnessObserver = + new WakefulnessLifecycle.Observer() { + @Override + public void onFinishedWakingUp() { + // Reset locked for the case keyguard not shown. + oneHanded.setLockedDisabled(false /* locked */, false /* enabled */); + } + + @Override + public void onStartedGoingToSleep() { + oneHanded.stopOneHanded(); + // When user press power button going to sleep, temperory lock OHM disabled + // to avoid mis-trigger. + oneHanded.setLockedDisabled(true /* locked */, false /* enabled */); + } + }; + mWakefulnessLifecycle.addObserver(mWakefulnessObserver); + mScreenLifecycle.addObserver(new ScreenLifecycle.Observer() { @Override public void onScreenTurningOff() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java index 58328a3469a11..8480702c57c04 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java @@ -27,6 +27,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.SysuiTestCase; import com.android.systemui.keyguard.ScreenLifecycle; +import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.statusbar.CommandQueue; @@ -72,6 +73,7 @@ public class WMShellTest extends SysuiTestCase { @Mock SplitScreen mSplitScreen; @Mock OneHanded mOneHanded; @Mock HideDisplayCutout mHideDisplayCutout; + @Mock WakefulnessLifecycle mWakefulnessLifecycle; @Mock ProtoTracer mProtoTracer; @Mock ShellCommandHandler mShellCommandHandler; @Mock ShellExecutor mSysUiMainExecutor; @@ -84,7 +86,8 @@ public class WMShellTest extends SysuiTestCase { Optional.of(mSplitScreen), Optional.of(mOneHanded), Optional.of(mHideDisplayCutout), Optional.of(mShellCommandHandler), mCommandQueue, mConfigurationController, mKeyguardUpdateMonitor, mNavigationModeController, - mScreenLifecycle, mSysUiState, mProtoTracer, mSysUiMainExecutor); + mScreenLifecycle, mSysUiState, mProtoTracer, mWakefulnessLifecycle, + mSysUiMainExecutor); } @Test