diff options
| author | 2021-10-01 09:05:57 -0400 | |
|---|---|---|
| committer | 2021-10-07 13:53:23 +0000 | |
| commit | 74b7f3c123338a9a6ec42e600cb0795fe63005c9 (patch) | |
| tree | 21508cc69a7296b927bca9ea1933b910bac2bfab | |
| parent | 5250bc61b08c23935ec45a59c9bc21f5abd18bc8 (diff) | |
Start keyguard docs
1. Move responsibility for the bouncer container to the
NotificationShadeWindowViewController
2. Start very basic keyguard documentation (much more to come)
Bug: 195430376
Test: atest KeyguardBouncerTest StatusBarTest StatusBarKeyguardViewManagerTest
NotificationPanelViewControllerTest
Change-Id: Iba45a9252fd37c00b2023407eb44bd91c44a87ad
11 files changed, 74 insertions, 32 deletions
diff --git a/packages/SystemUI/docs/keyguard.md b/packages/SystemUI/docs/keyguard.md new file mode 100644 index 000000000000..e3d48aee96e4 --- /dev/null +++ b/packages/SystemUI/docs/keyguard.md @@ -0,0 +1,12 @@ +# Keyguard (aka Lockscreen) + +Keyguard is responsible for: + +1. Handling authentication to allow the user to unlock the device, via biometrics or [KeyguardBouncer][1] +2. Displaying informational content such as the time, notifications, and smartspace +3. Always-on Display (AOD) + +Keyguard is the first screen available when turning on the device, as long as the user has not specified a security method of NONE. + +[1]: /frameworks/base/packages/SystemUI/docs/keyguard/bouncer.md + diff --git a/packages/SystemUI/docs/keyguard/bouncer.md b/packages/SystemUI/docs/keyguard/bouncer.md new file mode 100644 index 000000000000..a724966a639a --- /dev/null +++ b/packages/SystemUI/docs/keyguard/bouncer.md @@ -0,0 +1,18 @@ +# Bouncer + +[KeyguardBouncer][1] is the component responsible for displaying the security method set by the user (password, PIN, pattern) as well as SIM-related security methods, allowing the user to unlock the device or SIM. + +## Components + +The bouncer contains a hierarchy of controllers/views to render the user's security method and to manage the authentication attempts. + +1. [KeyguardBouncer][1] - Entrypoint for managing the bouncer visibility. + 1. [KeyguardHostViewController][2] - Intercepts media keys. Can most likely be merged with the next item. + 1. [KeyguardSecurityContainerController][3] - Manages unlock attempt responses, one-handed use + 1. [KeyguardSecurityViewFlipperController][4] - Based upon the [KeyguardSecurityModel#SecurityMode][5], will instantiate the required view and controller. PIN, Pattern, etc. + +[1]: /frameworks/base/packages/SystemUI/com/android/systemui/statusbar/phone/KeyguardBouncer +[2]: /frameworks/base/packages/SystemUI/com/android/keyguard/KeyguardHostViewController +[3]: /frameworks/base/packages/SystemUI/com/android/keyguard/KeyguardSecurityContainerController +[4]: /frameworks/base/packages/SystemUI/com/android/keyguard/KeyguardSecurityViewFlipperController +[5]: /frameworks/base/packages/SystemUI/com/android/keyguard/KeyguardSecurityModel diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml index d9a56707fb31..e02a1767a96c 100644 --- a/packages/SystemUI/res/layout/super_notification_shade.xml +++ b/packages/SystemUI/res/layout/super_notification_shade.xml @@ -97,7 +97,7 @@ android:singleLine="true" android:ellipsize="marquee" android:focusable="true" /> - <FrameLayout android:id="@+id/keyboard_bouncer_container" + <FrameLayout android:id="@+id/keyguard_bouncer_container" android:layout_height="0dp" android:layout_width="match_parent" android:layout_weight="1" /> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java index ecc8c0074e18..db729da9c8bf 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java @@ -18,7 +18,6 @@ package com.android.keyguard; import android.os.Bundle; import android.view.View; -import android.view.ViewGroup; import android.view.ViewRootImpl; import com.android.systemui.keyguard.KeyguardViewMediator; @@ -186,14 +185,12 @@ public interface KeyguardViewController { /** * Registers the StatusBar to which this Keyguard View is mounted. * @param statusBar - * @param container * @param notificationPanelViewController * @param biometricUnlockController * @param notificationContainer * @param bypassController */ void registerStatusBar(StatusBar statusBar, - ViewGroup container, NotificationPanelViewController notificationPanelViewController, BiometricUnlockController biometricUnlockController, View notificationContainer, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 1561eb6368a8..c5694398cdc6 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -77,7 +77,6 @@ import android.view.IRemoteAnimationRunner; import android.view.RemoteAnimationTarget; import android.view.SyncRtSurfaceTransactionApplier; import android.view.View; -import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManagerPolicyConstants; import android.view.animation.Animation; @@ -2623,7 +2622,6 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, * Registers the StatusBar to which the Keyguard View is mounted. * * @param statusBar - * @param container * @param panelView * @param biometricUnlockController * @param notificationContainer @@ -2631,10 +2629,10 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, * @return the View Controller for the Keyguard View this class is mediating. */ public KeyguardViewController registerStatusBar(StatusBar statusBar, - ViewGroup container, NotificationPanelViewController panelView, + NotificationPanelViewController panelView, BiometricUnlockController biometricUnlockController, View notificationContainer, KeyguardBypassController bypassController) { - mKeyguardViewControllerLazy.get().registerStatusBar(statusBar, container, panelView, + mKeyguardViewControllerLazy.get().registerStatusBar(statusBar, panelView, biometricUnlockController, notificationContainer, bypassController); return mKeyguardViewControllerLazy.get(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index f1d5e0271b96..a090ac35070e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -126,6 +126,19 @@ public class KeyguardBouncer { mExpansionCallbacks.add(expansionCallback); } + /** + * Enable/disable only the back button + */ + public void setBackButtonEnabled(boolean enabled) { + int vis = mContainer.getSystemUiVisibility(); + if (enabled) { + vis &= ~View.STATUS_BAR_DISABLE_BACK; + } else { + vis |= View.STATUS_BAR_DISABLE_BACK; + } + mContainer.setSystemUiVisibility(vis); + } + public void show(boolean resetSecuritySelection) { show(resetSecuritySelection, true /* scrimmed */); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java index 03d0bb02e1bd..9d06d2bae8cb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java @@ -171,6 +171,13 @@ public class NotificationShadeWindowViewController { mBrightnessMirror = mView.findViewById(R.id.brightness_mirror_container); } + /** + * @return Location where to place the KeyguardBouncer + */ + public ViewGroup getBouncerContainer() { + return mView.findViewById(R.id.keyguard_bouncer_container); + } + /** Inflates the {@link R.layout#status_bar_expanded} layout and sets it up. */ public void setupExpandedStatusBar() { mStackScrollLayout = mView.findViewById(R.id.notification_stack_scroller); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 67b2ee5ba210..78ab0d7f8a2f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1552,6 +1552,9 @@ public class StatusBar extends SystemUI implements time, PowerManager.WAKE_REASON_GESTURE, "com.android.systemui:" + why); mWakeUpComingFromTouch = true; where.getLocationInWindow(mTmpInt2); + + // NOTE, the incoming view can sometimes be the entire container... unsure if + // this location is valuable enough mWakeUpTouchLocation = new PointF(mTmpInt2[0] + where.getWidth() / 2, mTmpInt2[1] + where.getHeight() / 2); mFalsingCollector.onScreenOnFromTouch(); @@ -1645,7 +1648,7 @@ public class StatusBar extends SystemUI implements } }); mStatusBarKeyguardViewManager.registerStatusBar( - /* statusBar= */ this, getBouncerContainer(), + /* statusBar= */ this, mNotificationPanelViewController, mBiometricUnlockController, mStackScroller, mKeyguardBypassController); mKeyguardIndicationController @@ -1680,8 +1683,8 @@ public class StatusBar extends SystemUI implements return mNotificationPanelViewController; } - protected ViewGroup getBouncerContainer() { - return mNotificationShadeWindowView.findViewById(R.id.keyboard_bouncer_container); + public ViewGroup getBouncerContainer() { + return mNotificationShadeWindowViewController.getBouncerContainer(); } public int getStatusBarHeight() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 18fd9d3c6651..07489a91f128 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -120,7 +120,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void onFullyShown() { updateStates(); - mStatusBar.wakeUpIfDozing(SystemClock.uptimeMillis(), mContainer, "BOUNCER_VISIBLE"); + mStatusBar.wakeUpIfDozing(SystemClock.uptimeMillis(), + mStatusBar.getBouncerContainer(), "BOUNCER_VISIBLE"); } @Override @@ -174,7 +175,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private NotificationPanelViewController mNotificationPanelViewController; private BiometricUnlockController mBiometricUnlockController; - private ViewGroup mContainer; private View mNotificationContainer; protected KeyguardBouncer mBouncer; @@ -270,14 +270,14 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void registerStatusBar(StatusBar statusBar, - ViewGroup container, NotificationPanelViewController notificationPanelViewController, BiometricUnlockController biometricUnlockController, View notificationContainer, KeyguardBypassController bypassController) { mStatusBar = statusBar; - mContainer = container; mBiometricUnlockController = biometricUnlockController; + + ViewGroup container = mStatusBar.getBouncerContainer(); mBouncer = mKeyguardBouncerFactory.create(container, mExpansionCallback); mNotificationPanelViewController = notificationPanelViewController; notificationPanelViewController.addExpansionListener(this); @@ -356,7 +356,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } else if (mPulsing && expansion == KeyguardBouncer.EXPANSION_VISIBLE) { // Panel expanded while pulsing but didn't translate the bouncer (because we are // unlocked.) Let's simply wake-up to dismiss the lock screen. - mStatusBar.wakeUpIfDozing(SystemClock.uptimeMillis(), mContainer, "BOUNCER_VISIBLE"); + mStatusBar.wakeUpIfDozing(SystemClock.uptimeMillis(), mStatusBar.getBouncerContainer(), + "BOUNCER_VISIBLE"); } } @@ -833,7 +834,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } public void onKeyguardFadedAway() { - mContainer.postDelayed(() -> mNotificationShadeWindowController + mNotificationContainer.postDelayed(() -> mNotificationShadeWindowController .setKeyguardFadingAway(false), 100); ViewGroupFadeHelper.reset(mNotificationPanelViewController.getView()); mStatusBar.finishKeyguardFadingAway(); @@ -958,10 +959,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb }; protected void updateStates() { - if (mContainer == null ) { - return; - } - int vis = mContainer.getSystemUiVisibility(); boolean showing = mShowing; boolean occluded = mOccluded; boolean bouncerShowing = mBouncer.isShowing(); @@ -973,9 +970,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb (mLastBouncerDismissible || !mLastShowing || mLastRemoteInputActive) || mFirstUpdate) { if (bouncerDismissible || !showing || remoteInputActive) { - mContainer.setSystemUiVisibility(vis & ~View.STATUS_BAR_DISABLE_BACK); + mBouncer.setBackButtonEnabled(true); } else { - mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK); + mBouncer.setBackButtonEnabled(false); } } @@ -1042,11 +1039,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb if (delay == 0) { mMakeNavigationBarVisibleRunnable.run(); } else { - mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable, + mNotificationContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable, delay); } } else { - mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable); + mNotificationContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable); mStatusBar.getNotificationShadeWindowView().getWindowInsetsController() .hide(navigationBars()); } @@ -1371,4 +1368,4 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb void requestUdfps(boolean requestUdfps, int color); } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 6e3d5ce7953e..3fcd0712079f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -16,15 +16,12 @@ package com.android.systemui.statusbar.phone; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; @@ -119,7 +116,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { any(ViewGroup.class), any(KeyguardBouncer.BouncerExpansionCallback.class))) .thenReturn(mBouncer); - + when(mStatusBar.getBouncerContainer()).thenReturn(mContainer); when(mContainer.findViewById(anyInt())).thenReturn(mKeyguardMessageArea); mWakefulnessLifecycle = new WakefulnessLifecycle( getContext(), @@ -143,7 +140,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mUnlockedScreenOffAnimationController, mKeyguardMessageAreaFactory, mShadeController); - mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer, + mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mNotificationPanelView, mBiometrucUnlockController, mNotificationContainer, mBypassController); mStatusBarKeyguardViewManager.show(null); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 6868e1855c65..741d95f283e3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -459,7 +459,7 @@ public class StatusBarTest extends SysuiTestCase { mock(DumpManager.class), mActivityLaunchAnimator, mDialogLaunchAnimator); - when(mKeyguardViewMediator.registerStatusBar(any(StatusBar.class), any(ViewGroup.class), + when(mKeyguardViewMediator.registerStatusBar(any(StatusBar.class), any(NotificationPanelViewController.class), any(BiometricUnlockController.class), any(ViewGroup.class), any(KeyguardBypassController.class))) .thenReturn(mStatusBarKeyguardViewManager); |