Loading packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -336,6 +336,11 @@ public class KeyguardHostViewController extends ViewController<KeyguardHostView> mKeyguardSecurityContainerController.onStartingToHide(); mKeyguardSecurityContainerController.onStartingToHide(); } } /** Called when bouncer visibility changes. */ public void onBouncerVisibilityChanged(@View.Visibility int visibility) { mKeyguardSecurityContainerController.onBouncerVisibilityChanged(visibility); } public boolean hasDismissActions() { public boolean hasDismissActions() { return mDismissAction != null || mCancelAction != null; return mDismissAction != null || mCancelAction != null; } } Loading packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +61 −8 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.keyguard; package com.android.keyguard; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_BIOMETRIC; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_BIOMETRIC; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_EXTENDED_ACCESS; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_EXTENDED_ACCESS; Loading @@ -32,11 +33,13 @@ import android.app.admin.DevicePolicyManager; import android.content.Intent; import android.content.Intent; import android.content.res.ColorStateList; import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Configuration; import android.hardware.biometrics.BiometricSourceType; import android.metrics.LogMaker; import android.metrics.LogMaker; import android.os.UserHandle; import android.os.UserHandle; import android.util.Log; import android.util.Log; import android.util.Slog; import android.util.Slog; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.View; import androidx.annotation.Nullable; import androidx.annotation.Nullable; Loading @@ -55,6 +58,7 @@ import com.android.keyguard.dagger.KeyguardBouncerScope; import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.Gefingerpoken; import com.android.systemui.Gefingerpoken; import com.android.systemui.R; import com.android.systemui.R; import com.android.systemui.biometrics.SidefpsController; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.flags.Flags; Loading @@ -67,6 +71,8 @@ import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController; import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.settings.GlobalSettings; import java.util.Optional; import javax.inject.Inject; import javax.inject.Inject; /** Controller for {@link KeyguardSecurityContainer} */ /** Controller for {@link KeyguardSecurityContainer} */ Loading @@ -93,6 +99,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final GlobalSettings mGlobalSettings; private final GlobalSettings mGlobalSettings; private final FeatureFlags mFeatureFlags; private final FeatureFlags mFeatureFlags; private final SessionTracker mSessionTracker; private final SessionTracker mSessionTracker; private final Optional<SidefpsController> mSidefpsController; private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED; private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED; Loading Loading @@ -236,12 +243,26 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard reloadColors(); reloadColors(); } } }; }; private boolean mBouncerVisible = false; private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback = private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { new KeyguardUpdateMonitorCallback() { @Override @Override public void onDevicePolicyManagerStateChanged() { public void onDevicePolicyManagerStateChanged() { showPrimarySecurityScreen(false); showPrimarySecurityScreen(false); } } @Override public void onBiometricRunningStateChanged(boolean running, BiometricSourceType biometricSourceType) { if (biometricSourceType == FINGERPRINT) { updateSideFpsVisibility(); } } @Override public void onStrongAuthStateChanged(int userId) { updateSideFpsVisibility(); } }; }; private KeyguardSecurityContainerController(KeyguardSecurityContainer view, private KeyguardSecurityContainerController(KeyguardSecurityContainer view, Loading @@ -260,7 +281,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard UserSwitcherController userSwitcherController, UserSwitcherController userSwitcherController, FeatureFlags featureFlags, FeatureFlags featureFlags, GlobalSettings globalSettings, GlobalSettings globalSettings, SessionTracker sessionTracker) { SessionTracker sessionTracker, Optional<SidefpsController> sidefpsController) { super(view); super(view); mLockPatternUtils = lockPatternUtils; mLockPatternUtils = lockPatternUtils; mUpdateMonitor = keyguardUpdateMonitor; mUpdateMonitor = keyguardUpdateMonitor; Loading @@ -280,6 +302,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mFeatureFlags = featureFlags; mFeatureFlags = featureFlags; mGlobalSettings = globalSettings; mGlobalSettings = globalSettings; mSessionTracker = sessionTracker; mSessionTracker = sessionTracker; mSidefpsController = sidefpsController; } } @Override @Override Loading Loading @@ -311,8 +334,23 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard getCurrentSecurityController().onPause(); getCurrentSecurityController().onPause(); } } mView.onPause(); mView.onPause(); // It might happen that onStartingToHide is not called when the device is locked while on // bouncer. setBouncerVisible(false); } } private void updateSideFpsVisibility() { if (!mSidefpsController.isPresent()) { return; } if (mBouncerVisible && mView.isSidedSecurityMode() && mUpdateMonitor.isFingerprintDetectionRunning() && !mUpdateMonitor.userNeedsStrongAuth()) { mSidefpsController.get().show(); } else { mSidefpsController.get().hide(); } } /** /** * Shows the primary security screen for the user. This will be either the multi-selector * Shows the primary security screen for the user. This will be either the multi-selector Loading Loading @@ -397,6 +435,17 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard if (mCurrentSecurityMode != SecurityMode.None) { if (mCurrentSecurityMode != SecurityMode.None) { getCurrentSecurityController().onStartingToHide(); getCurrentSecurityController().onStartingToHide(); } } setBouncerVisible(false); } /** Called when the bouncer changes visibility. */ public void onBouncerVisibilityChanged(@View.Visibility int visibility) { setBouncerVisible(visibility == View.VISIBLE); } private void setBouncerVisible(boolean visible) { mBouncerVisible = visible; updateSideFpsVisibility(); } } /** /** Loading Loading @@ -655,6 +704,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final FeatureFlags mFeatureFlags; private final FeatureFlags mFeatureFlags; private final UserSwitcherController mUserSwitcherController; private final UserSwitcherController mUserSwitcherController; private final SessionTracker mSessionTracker; private final SessionTracker mSessionTracker; private final Optional<SidefpsController> mSidefpsController; @Inject @Inject Factory(KeyguardSecurityContainer view, Factory(KeyguardSecurityContainer view, Loading @@ -673,7 +723,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard UserSwitcherController userSwitcherController, UserSwitcherController userSwitcherController, FeatureFlags featureFlags, FeatureFlags featureFlags, GlobalSettings globalSettings, GlobalSettings globalSettings, SessionTracker sessionTracker) { SessionTracker sessionTracker, Optional<SidefpsController> sidefpsController) { mView = view; mView = view; mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory; mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory; mLockPatternUtils = lockPatternUtils; mLockPatternUtils = lockPatternUtils; Loading @@ -690,6 +741,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mGlobalSettings = globalSettings; mGlobalSettings = globalSettings; mUserSwitcherController = userSwitcherController; mUserSwitcherController = userSwitcherController; mSessionTracker = sessionTracker; mSessionTracker = sessionTracker; mSidefpsController = sidefpsController; } } public KeyguardSecurityContainerController create( public KeyguardSecurityContainerController create( Loading @@ -699,7 +751,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger, mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger, mKeyguardStateController, securityCallback, mSecurityViewFlipperController, mKeyguardStateController, securityCallback, mSecurityViewFlipperController, mConfigurationController, mFalsingCollector, mFalsingManager, mConfigurationController, mFalsingCollector, mFalsingManager, mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker); mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker, mSidefpsController); } } } } } } packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java +21 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,10 @@ package com.android.keyguard.dagger; package com.android.keyguard.dagger; import static com.android.systemui.biometrics.SidefpsControllerKt.hasSideFpsSensor; import android.annotation.Nullable; import android.hardware.fingerprint.FingerprintManager; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.ViewGroup; import android.view.ViewGroup; Loading @@ -23,9 +27,14 @@ import com.android.keyguard.KeyguardHostView; import com.android.keyguard.KeyguardSecurityContainer; import com.android.keyguard.KeyguardSecurityContainer; import com.android.keyguard.KeyguardSecurityViewFlipper; import com.android.keyguard.KeyguardSecurityViewFlipper; import com.android.systemui.R; import com.android.systemui.R; import com.android.systemui.biometrics.SidefpsController; import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.statusbar.phone.KeyguardBouncer; import java.util.Optional; import javax.inject.Provider; import dagger.Module; import dagger.Module; import dagger.Provides; import dagger.Provides; Loading Loading @@ -60,4 +69,16 @@ public interface KeyguardBouncerModule { KeyguardSecurityContainer containerView) { KeyguardSecurityContainer containerView) { return containerView.findViewById(R.id.view_flipper); return containerView.findViewById(R.id.view_flipper); } } /** Provides {@link SidefpsController} if the device has the side fingerprint sensor. */ @Provides @KeyguardBouncerScope static Optional<SidefpsController> providesOptionalSidefpsController( @Nullable FingerprintManager fingerprintManager, Provider<SidefpsController> sidefpsControllerProvider) { if (!hasSideFpsSensor(fingerprintManager)) { return Optional.empty(); } return Optional.of(sidefpsControllerProvider.get()); } } } packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.kt +34 −20 Original line number Original line Diff line number Diff line Loading @@ -34,16 +34,16 @@ import android.hardware.fingerprint.ISidefpsController import android.os.Handler import android.os.Handler import android.util.Log import android.util.Log import android.util.RotationUtils import android.util.RotationUtils import android.view.View.AccessibilityDelegate import android.view.accessibility.AccessibilityEvent import android.view.Display import android.view.Display import android.view.Gravity import android.view.Gravity import android.view.LayoutInflater import android.view.LayoutInflater import android.view.Surface import android.view.Surface import android.view.View import android.view.View import android.view.View.AccessibilityDelegate import android.view.ViewPropertyAnimator import android.view.ViewPropertyAnimator import android.view.WindowInsets import android.view.WindowInsets import android.view.WindowManager import android.view.WindowManager import android.view.accessibility.AccessibilityEvent import androidx.annotation.RawRes import androidx.annotation.RawRes import com.airbnb.lottie.LottieAnimationView import com.airbnb.lottie.LottieAnimationView import com.airbnb.lottie.LottieProperty import com.airbnb.lottie.LottieProperty Loading @@ -70,13 +70,12 @@ class SidefpsController @Inject constructor( private val activityTaskManager: ActivityTaskManager, private val activityTaskManager: ActivityTaskManager, overviewProxyService: OverviewProxyService, overviewProxyService: OverviewProxyService, displayManager: DisplayManager, displayManager: DisplayManager, @Main mainExecutor: DelayableExecutor, @Main private val mainExecutor: DelayableExecutor, @Main private val handler: Handler @Main private val handler: Handler ) { ) { @VisibleForTesting @VisibleForTesting val sensorProps: FingerprintSensorPropertiesInternal = fingerprintManager val sensorProps: FingerprintSensorPropertiesInternal = fingerprintManager ?.sensorPropertiesInternal ?.sideFpsSensorProperties ?.firstOrNull { it.isAnySidefpsType } ?: throw IllegalStateException("no side fingerprint sensor") ?: throw IllegalStateException("no side fingerprint sensor") @VisibleForTesting @VisibleForTesting Loading Loading @@ -135,23 +134,32 @@ class SidefpsController @Inject constructor( } } init { init { fingerprintManager?.setSidefpsController(object : ISidefpsController.Stub() { fingerprintManager?.setSidefpsController( object : ISidefpsController.Stub() { override fun show( override fun show( sensorId: Int, sensorId: Int, @BiometricOverlayConstants.ShowReason reason: Int @BiometricOverlayConstants.ShowReason reason: Int ) = if (reason.isReasonToShow(activityTaskManager)) doShow() else hide(sensorId) ) = if (reason.isReasonToShow(activityTaskManager)) show() else hide() private fun doShow() = mainExecutor.execute { override fun hide(sensorId: Int) = hide() }) overviewProxyService.addCallback(overviewProxyListener) } /** Shows the side fps overlay if not already shown. */ fun show() { mainExecutor.execute { if (overlayView == null) { if (overlayView == null) { createOverlayForDisplay() createOverlayForDisplay() } else { } else { Log.v(TAG, "overlay already shown") Log.v(TAG, "overlay already shown") } } } } } override fun hide(sensorId: Int) = mainExecutor.execute { overlayView = null } /** Hides the fps overlay if shown. */ }) fun hide() { overviewProxyService.addCallback(overviewProxyListener) mainExecutor.execute { overlayView = null } } } private fun onOrientationChanged() { private fun onOrientationChanged() { Loading Loading @@ -266,6 +274,12 @@ class SidefpsController @Inject constructor( } } } } private val FingerprintManager?.sideFpsSensorProperties: FingerprintSensorPropertiesInternal? get() = this?.sensorPropertiesInternal?.firstOrNull { it.isAnySidefpsType } /** Returns [True] when the device has a side fingerprint sensor. */ fun FingerprintManager?.hasSideFpsSensor(): Boolean = this?.sideFpsSensorProperties != null @BiometricOverlayConstants.ShowReason @BiometricOverlayConstants.ShowReason private fun Int.isReasonToShow(activityTaskManager: ActivityTaskManager): Boolean = when (this) { private fun Int.isReasonToShow(activityTaskManager: ActivityTaskManager): Boolean = when (this) { REASON_AUTH_KEYGUARD -> false REASON_AUTH_KEYGUARD -> false Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -266,6 +266,9 @@ public class KeyguardBouncer { private void setVisibility(@View.Visibility int visibility) { private void setVisibility(@View.Visibility int visibility) { mContainer.setVisibility(visibility); mContainer.setVisibility(visibility); if (mKeyguardViewController != null) { mKeyguardViewController.onBouncerVisibilityChanged(visibility); } dispatchVisibilityChanged(); dispatchVisibilityChanged(); } } Loading Loading @@ -645,7 +648,7 @@ public class KeyguardBouncer { /** /** * Invoked when the bouncer expansion reaches {@link KeyguardBouncer#EXPANSION_VISIBLE}. * Invoked when the bouncer expansion reaches {@link KeyguardBouncer#EXPANSION_VISIBLE}. * This is NOT called each time the bouncer is shown, but rather only when the fully * This is NOT called each time the bouncer is shown, but rather only when the fully * shown amount has changed based on the panel expansion. The bouncer is visibility * shown amount has changed based on the panel expansion. The bouncer's visibility * can still change when the expansion amount hasn't changed. * can still change when the expansion amount hasn't changed. * See {@link KeyguardBouncer#isShowing()} for the checks for the bouncer showing state. * See {@link KeyguardBouncer#isShowing()} for the checks for the bouncer showing state. */ */ Loading Loading
packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -336,6 +336,11 @@ public class KeyguardHostViewController extends ViewController<KeyguardHostView> mKeyguardSecurityContainerController.onStartingToHide(); mKeyguardSecurityContainerController.onStartingToHide(); } } /** Called when bouncer visibility changes. */ public void onBouncerVisibilityChanged(@View.Visibility int visibility) { mKeyguardSecurityContainerController.onBouncerVisibilityChanged(visibility); } public boolean hasDismissActions() { public boolean hasDismissActions() { return mDismissAction != null || mCancelAction != null; return mDismissAction != null || mCancelAction != null; } } Loading
packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +61 −8 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.keyguard; package com.android.keyguard; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_BIOMETRIC; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_BIOMETRIC; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_EXTENDED_ACCESS; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_EXTENDED_ACCESS; Loading @@ -32,11 +33,13 @@ import android.app.admin.DevicePolicyManager; import android.content.Intent; import android.content.Intent; import android.content.res.ColorStateList; import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Configuration; import android.hardware.biometrics.BiometricSourceType; import android.metrics.LogMaker; import android.metrics.LogMaker; import android.os.UserHandle; import android.os.UserHandle; import android.util.Log; import android.util.Log; import android.util.Slog; import android.util.Slog; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.View; import androidx.annotation.Nullable; import androidx.annotation.Nullable; Loading @@ -55,6 +58,7 @@ import com.android.keyguard.dagger.KeyguardBouncerScope; import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.Gefingerpoken; import com.android.systemui.Gefingerpoken; import com.android.systemui.R; import com.android.systemui.R; import com.android.systemui.biometrics.SidefpsController; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.flags.Flags; Loading @@ -67,6 +71,8 @@ import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController; import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.settings.GlobalSettings; import java.util.Optional; import javax.inject.Inject; import javax.inject.Inject; /** Controller for {@link KeyguardSecurityContainer} */ /** Controller for {@link KeyguardSecurityContainer} */ Loading @@ -93,6 +99,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final GlobalSettings mGlobalSettings; private final GlobalSettings mGlobalSettings; private final FeatureFlags mFeatureFlags; private final FeatureFlags mFeatureFlags; private final SessionTracker mSessionTracker; private final SessionTracker mSessionTracker; private final Optional<SidefpsController> mSidefpsController; private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED; private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED; Loading Loading @@ -236,12 +243,26 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard reloadColors(); reloadColors(); } } }; }; private boolean mBouncerVisible = false; private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback = private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { new KeyguardUpdateMonitorCallback() { @Override @Override public void onDevicePolicyManagerStateChanged() { public void onDevicePolicyManagerStateChanged() { showPrimarySecurityScreen(false); showPrimarySecurityScreen(false); } } @Override public void onBiometricRunningStateChanged(boolean running, BiometricSourceType biometricSourceType) { if (biometricSourceType == FINGERPRINT) { updateSideFpsVisibility(); } } @Override public void onStrongAuthStateChanged(int userId) { updateSideFpsVisibility(); } }; }; private KeyguardSecurityContainerController(KeyguardSecurityContainer view, private KeyguardSecurityContainerController(KeyguardSecurityContainer view, Loading @@ -260,7 +281,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard UserSwitcherController userSwitcherController, UserSwitcherController userSwitcherController, FeatureFlags featureFlags, FeatureFlags featureFlags, GlobalSettings globalSettings, GlobalSettings globalSettings, SessionTracker sessionTracker) { SessionTracker sessionTracker, Optional<SidefpsController> sidefpsController) { super(view); super(view); mLockPatternUtils = lockPatternUtils; mLockPatternUtils = lockPatternUtils; mUpdateMonitor = keyguardUpdateMonitor; mUpdateMonitor = keyguardUpdateMonitor; Loading @@ -280,6 +302,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mFeatureFlags = featureFlags; mFeatureFlags = featureFlags; mGlobalSettings = globalSettings; mGlobalSettings = globalSettings; mSessionTracker = sessionTracker; mSessionTracker = sessionTracker; mSidefpsController = sidefpsController; } } @Override @Override Loading Loading @@ -311,8 +334,23 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard getCurrentSecurityController().onPause(); getCurrentSecurityController().onPause(); } } mView.onPause(); mView.onPause(); // It might happen that onStartingToHide is not called when the device is locked while on // bouncer. setBouncerVisible(false); } } private void updateSideFpsVisibility() { if (!mSidefpsController.isPresent()) { return; } if (mBouncerVisible && mView.isSidedSecurityMode() && mUpdateMonitor.isFingerprintDetectionRunning() && !mUpdateMonitor.userNeedsStrongAuth()) { mSidefpsController.get().show(); } else { mSidefpsController.get().hide(); } } /** /** * Shows the primary security screen for the user. This will be either the multi-selector * Shows the primary security screen for the user. This will be either the multi-selector Loading Loading @@ -397,6 +435,17 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard if (mCurrentSecurityMode != SecurityMode.None) { if (mCurrentSecurityMode != SecurityMode.None) { getCurrentSecurityController().onStartingToHide(); getCurrentSecurityController().onStartingToHide(); } } setBouncerVisible(false); } /** Called when the bouncer changes visibility. */ public void onBouncerVisibilityChanged(@View.Visibility int visibility) { setBouncerVisible(visibility == View.VISIBLE); } private void setBouncerVisible(boolean visible) { mBouncerVisible = visible; updateSideFpsVisibility(); } } /** /** Loading Loading @@ -655,6 +704,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final FeatureFlags mFeatureFlags; private final FeatureFlags mFeatureFlags; private final UserSwitcherController mUserSwitcherController; private final UserSwitcherController mUserSwitcherController; private final SessionTracker mSessionTracker; private final SessionTracker mSessionTracker; private final Optional<SidefpsController> mSidefpsController; @Inject @Inject Factory(KeyguardSecurityContainer view, Factory(KeyguardSecurityContainer view, Loading @@ -673,7 +723,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard UserSwitcherController userSwitcherController, UserSwitcherController userSwitcherController, FeatureFlags featureFlags, FeatureFlags featureFlags, GlobalSettings globalSettings, GlobalSettings globalSettings, SessionTracker sessionTracker) { SessionTracker sessionTracker, Optional<SidefpsController> sidefpsController) { mView = view; mView = view; mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory; mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory; mLockPatternUtils = lockPatternUtils; mLockPatternUtils = lockPatternUtils; Loading @@ -690,6 +741,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mGlobalSettings = globalSettings; mGlobalSettings = globalSettings; mUserSwitcherController = userSwitcherController; mUserSwitcherController = userSwitcherController; mSessionTracker = sessionTracker; mSessionTracker = sessionTracker; mSidefpsController = sidefpsController; } } public KeyguardSecurityContainerController create( public KeyguardSecurityContainerController create( Loading @@ -699,7 +751,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger, mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger, mKeyguardStateController, securityCallback, mSecurityViewFlipperController, mKeyguardStateController, securityCallback, mSecurityViewFlipperController, mConfigurationController, mFalsingCollector, mFalsingManager, mConfigurationController, mFalsingCollector, mFalsingManager, mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker); mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker, mSidefpsController); } } } } } }
packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java +21 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,10 @@ package com.android.keyguard.dagger; package com.android.keyguard.dagger; import static com.android.systemui.biometrics.SidefpsControllerKt.hasSideFpsSensor; import android.annotation.Nullable; import android.hardware.fingerprint.FingerprintManager; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.ViewGroup; import android.view.ViewGroup; Loading @@ -23,9 +27,14 @@ import com.android.keyguard.KeyguardHostView; import com.android.keyguard.KeyguardSecurityContainer; import com.android.keyguard.KeyguardSecurityContainer; import com.android.keyguard.KeyguardSecurityViewFlipper; import com.android.keyguard.KeyguardSecurityViewFlipper; import com.android.systemui.R; import com.android.systemui.R; import com.android.systemui.biometrics.SidefpsController; import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.statusbar.phone.KeyguardBouncer; import java.util.Optional; import javax.inject.Provider; import dagger.Module; import dagger.Module; import dagger.Provides; import dagger.Provides; Loading Loading @@ -60,4 +69,16 @@ public interface KeyguardBouncerModule { KeyguardSecurityContainer containerView) { KeyguardSecurityContainer containerView) { return containerView.findViewById(R.id.view_flipper); return containerView.findViewById(R.id.view_flipper); } } /** Provides {@link SidefpsController} if the device has the side fingerprint sensor. */ @Provides @KeyguardBouncerScope static Optional<SidefpsController> providesOptionalSidefpsController( @Nullable FingerprintManager fingerprintManager, Provider<SidefpsController> sidefpsControllerProvider) { if (!hasSideFpsSensor(fingerprintManager)) { return Optional.empty(); } return Optional.of(sidefpsControllerProvider.get()); } } }
packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.kt +34 −20 Original line number Original line Diff line number Diff line Loading @@ -34,16 +34,16 @@ import android.hardware.fingerprint.ISidefpsController import android.os.Handler import android.os.Handler import android.util.Log import android.util.Log import android.util.RotationUtils import android.util.RotationUtils import android.view.View.AccessibilityDelegate import android.view.accessibility.AccessibilityEvent import android.view.Display import android.view.Display import android.view.Gravity import android.view.Gravity import android.view.LayoutInflater import android.view.LayoutInflater import android.view.Surface import android.view.Surface import android.view.View import android.view.View import android.view.View.AccessibilityDelegate import android.view.ViewPropertyAnimator import android.view.ViewPropertyAnimator import android.view.WindowInsets import android.view.WindowInsets import android.view.WindowManager import android.view.WindowManager import android.view.accessibility.AccessibilityEvent import androidx.annotation.RawRes import androidx.annotation.RawRes import com.airbnb.lottie.LottieAnimationView import com.airbnb.lottie.LottieAnimationView import com.airbnb.lottie.LottieProperty import com.airbnb.lottie.LottieProperty Loading @@ -70,13 +70,12 @@ class SidefpsController @Inject constructor( private val activityTaskManager: ActivityTaskManager, private val activityTaskManager: ActivityTaskManager, overviewProxyService: OverviewProxyService, overviewProxyService: OverviewProxyService, displayManager: DisplayManager, displayManager: DisplayManager, @Main mainExecutor: DelayableExecutor, @Main private val mainExecutor: DelayableExecutor, @Main private val handler: Handler @Main private val handler: Handler ) { ) { @VisibleForTesting @VisibleForTesting val sensorProps: FingerprintSensorPropertiesInternal = fingerprintManager val sensorProps: FingerprintSensorPropertiesInternal = fingerprintManager ?.sensorPropertiesInternal ?.sideFpsSensorProperties ?.firstOrNull { it.isAnySidefpsType } ?: throw IllegalStateException("no side fingerprint sensor") ?: throw IllegalStateException("no side fingerprint sensor") @VisibleForTesting @VisibleForTesting Loading Loading @@ -135,23 +134,32 @@ class SidefpsController @Inject constructor( } } init { init { fingerprintManager?.setSidefpsController(object : ISidefpsController.Stub() { fingerprintManager?.setSidefpsController( object : ISidefpsController.Stub() { override fun show( override fun show( sensorId: Int, sensorId: Int, @BiometricOverlayConstants.ShowReason reason: Int @BiometricOverlayConstants.ShowReason reason: Int ) = if (reason.isReasonToShow(activityTaskManager)) doShow() else hide(sensorId) ) = if (reason.isReasonToShow(activityTaskManager)) show() else hide() private fun doShow() = mainExecutor.execute { override fun hide(sensorId: Int) = hide() }) overviewProxyService.addCallback(overviewProxyListener) } /** Shows the side fps overlay if not already shown. */ fun show() { mainExecutor.execute { if (overlayView == null) { if (overlayView == null) { createOverlayForDisplay() createOverlayForDisplay() } else { } else { Log.v(TAG, "overlay already shown") Log.v(TAG, "overlay already shown") } } } } } override fun hide(sensorId: Int) = mainExecutor.execute { overlayView = null } /** Hides the fps overlay if shown. */ }) fun hide() { overviewProxyService.addCallback(overviewProxyListener) mainExecutor.execute { overlayView = null } } } private fun onOrientationChanged() { private fun onOrientationChanged() { Loading Loading @@ -266,6 +274,12 @@ class SidefpsController @Inject constructor( } } } } private val FingerprintManager?.sideFpsSensorProperties: FingerprintSensorPropertiesInternal? get() = this?.sensorPropertiesInternal?.firstOrNull { it.isAnySidefpsType } /** Returns [True] when the device has a side fingerprint sensor. */ fun FingerprintManager?.hasSideFpsSensor(): Boolean = this?.sideFpsSensorProperties != null @BiometricOverlayConstants.ShowReason @BiometricOverlayConstants.ShowReason private fun Int.isReasonToShow(activityTaskManager: ActivityTaskManager): Boolean = when (this) { private fun Int.isReasonToShow(activityTaskManager: ActivityTaskManager): Boolean = when (this) { REASON_AUTH_KEYGUARD -> false REASON_AUTH_KEYGUARD -> false Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -266,6 +266,9 @@ public class KeyguardBouncer { private void setVisibility(@View.Visibility int visibility) { private void setVisibility(@View.Visibility int visibility) { mContainer.setVisibility(visibility); mContainer.setVisibility(visibility); if (mKeyguardViewController != null) { mKeyguardViewController.onBouncerVisibilityChanged(visibility); } dispatchVisibilityChanged(); dispatchVisibilityChanged(); } } Loading Loading @@ -645,7 +648,7 @@ public class KeyguardBouncer { /** /** * Invoked when the bouncer expansion reaches {@link KeyguardBouncer#EXPANSION_VISIBLE}. * Invoked when the bouncer expansion reaches {@link KeyguardBouncer#EXPANSION_VISIBLE}. * This is NOT called each time the bouncer is shown, but rather only when the fully * This is NOT called each time the bouncer is shown, but rather only when the fully * shown amount has changed based on the panel expansion. The bouncer is visibility * shown amount has changed based on the panel expansion. The bouncer's visibility * can still change when the expansion amount hasn't changed. * can still change when the expansion amount hasn't changed. * See {@link KeyguardBouncer#isShowing()} for the checks for the bouncer showing state. * See {@link KeyguardBouncer#isShowing()} for the checks for the bouncer showing state. */ */ Loading