diff options
Diffstat (limited to 'packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java')
-rw-r--r-- | packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java | 96 |
1 files changed, 86 insertions, 10 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index dd7c7ea6b5a5..d4d3d5b3ea2d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -32,6 +32,7 @@ import android.content.res.ColorStateList; import android.content.res.Configuration; import android.metrics.LogMaker; import android.os.UserHandle; +import android.provider.Settings; import android.util.Log; import android.util.Slog; import android.view.MotionEvent; @@ -49,6 +50,8 @@ import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.dagger.KeyguardBouncerScope; import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.Gefingerpoken; +import com.android.systemui.R; +import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -74,12 +77,14 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final KeyguardSecurityViewFlipperController mSecurityViewFlipperController; private final SecurityCallback mSecurityCallback; private final ConfigurationController mConfigurationController; + private final FalsingCollector mFalsingCollector; private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED; private SecurityMode mCurrentSecurityMode = SecurityMode.Invalid; - private final Gefingerpoken mGlobalTouchListener = new Gefingerpoken() { + @VisibleForTesting + final Gefingerpoken mGlobalTouchListener = new Gefingerpoken() { private MotionEvent mTouchDown; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { @@ -91,6 +96,17 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard // Do just a bit of our own falsing. People should only be tapping on the input, not // swiping. if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { + // If we're in one handed mode, the user can tap on the opposite side of the screen + // to move the bouncer across. In that case, inhibit the falsing (otherwise the taps + // to move the bouncer to each screen side can end up closing it instead). + if (mView.isOneHandedMode()) { + if ((mView.isOneHandedModeLeftAligned() && ev.getX() > mView.getWidth() / 2f) + || (!mView.isOneHandedModeLeftAligned() + && ev.getX() <= mView.getWidth() / 2f)) { + mFalsingCollector.avoidGesture(); + } + } + if (mTouchDown != null) { mTouchDown.recycle(); mTouchDown = null; @@ -135,9 +151,17 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard } public void reportUnlockAttempt(int userId, boolean success, int timeoutMs) { + int bouncerSide = SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED__SIDE__DEFAULT; + if (canUseOneHandedBouncer()) { + bouncerSide = isOneHandedKeyguardLeftAligned() + ? SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED__SIDE__LEFT + : SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED__SIDE__RIGHT; + } + if (success) { SysUiStatsLog.write(SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED, - SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__SUCCESS); + SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__SUCCESS, + bouncerSide); mLockPatternUtils.reportSuccessfulPasswordAttempt(userId); // Force a garbage collection in an attempt to erase any lockscreen password left in // memory. Do it asynchronously with a 5-sec delay to avoid making the keyguard @@ -152,7 +176,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard }); } else { SysUiStatsLog.write(SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED, - SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__FAILURE); + SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__FAILURE, + bouncerSide); reportFailedUnlockAttempt(userId, timeoutMs); } mMetricsLogger.write(new LogMaker(MetricsEvent.BOUNCER) @@ -184,7 +209,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private ConfigurationController.ConfigurationListener mConfigurationListener = new ConfigurationController.ConfigurationListener() { @Override - public void onOverlayChanged() { + public void onThemeChanged() { mSecurityViewFlipperController.reloadColors(); } @@ -204,7 +229,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard KeyguardStateController keyguardStateController, SecurityCallback securityCallback, KeyguardSecurityViewFlipperController securityViewFlipperController, - ConfigurationController configurationController) { + ConfigurationController configurationController, + FalsingCollector falsingCollector) { super(view); mLockPatternUtils = lockPatternUtils; mUpdateMonitor = keyguardUpdateMonitor; @@ -218,6 +244,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mKeyguardSecurityCallback); mConfigurationController = configurationController; mLastOrientation = getResources().getConfiguration().orientation; + mFalsingCollector = falsingCollector; } @Override @@ -296,6 +323,14 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard @Override public void onResume(int reason) { if (mCurrentSecurityMode != SecurityMode.None) { + int state = SysUiStatsLog.KEYGUARD_BOUNCER_STATE_CHANGED__STATE__SHOWN; + if (canUseOneHandedBouncer()) { + state = mView.isOneHandedModeLeftAligned() + ? SysUiStatsLog.KEYGUARD_BOUNCER_STATE_CHANGED__STATE__SHOWN_LEFT + : SysUiStatsLog.KEYGUARD_BOUNCER_STATE_CHANGED__STATE__SHOWN_RIGHT; + } + SysUiStatsLog.write(SysUiStatsLog.KEYGUARD_BOUNCER_STATE_CHANGED, state); + getCurrentSecurityController().onResume(reason); } mView.onResume( @@ -442,13 +477,49 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard if (newView != null) { newView.onResume(KeyguardSecurityView.VIEW_REVEALED); mSecurityViewFlipperController.show(newView); - mView.updateLayoutForSecurityMode(securityMode); + configureOneHandedMode(); } mSecurityCallback.onSecurityModeChanged( securityMode, newView != null && newView.needsInput()); } + /** Read whether the one-handed keyguard should be on the left/right from settings. */ + private boolean isOneHandedKeyguardLeftAligned() { + try { + return Settings.Global.getInt(mView.getContext().getContentResolver(), + Settings.Global.ONE_HANDED_KEYGUARD_SIDE) + == Settings.Global.ONE_HANDED_KEYGUARD_SIDE_LEFT; + } catch (Settings.SettingNotFoundException ex) { + return true; + } + } + + private boolean canUseOneHandedBouncer() { + // Is it enabled? + if (!getResources().getBoolean( + com.android.internal.R.bool.config_enableDynamicKeyguardPositioning)) { + return false; + } + + if (!KeyguardSecurityModel.isSecurityViewOneHanded(mCurrentSecurityMode)) { + return false; + } + + return getResources().getBoolean(R.bool.can_use_one_handed_bouncer); + } + + private void configureOneHandedMode() { + boolean oneHandedMode = canUseOneHandedBouncer(); + + mView.setOneHandedMode(oneHandedMode); + + if (oneHandedMode) { + mView.setOneHandedModeLeftAligned( + isOneHandedKeyguardLeftAligned(), /* animate= */false); + } + } + public void reportFailedUnlockAttempt(int userId, int timeoutMs) { // +1 for this time final int failedAttempts = mLockPatternUtils.getCurrentFailedPasswordAttempts(userId) + 1; @@ -513,13 +584,15 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard int newOrientation = getResources().getConfiguration().orientation; if (newOrientation != mLastOrientation) { mLastOrientation = newOrientation; - mView.updateLayoutForSecurityMode(mCurrentSecurityMode); + configureOneHandedMode(); } } /** Update keyguard position based on a tapped X coordinate. */ public void updateKeyguardPosition(float x) { - mView.updateKeyguardPosition(x); + if (mView.isOneHandedMode()) { + mView.setOneHandedModeLeftAligned(x <= mView.getWidth() / 2f, false); + } } static class Factory { @@ -535,6 +608,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final KeyguardStateController mKeyguardStateController; private final KeyguardSecurityViewFlipperController mSecurityViewFlipperController; private final ConfigurationController mConfigurationController; + private final FalsingCollector mFalsingCollector; @Inject Factory(KeyguardSecurityContainer view, @@ -547,7 +621,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard UiEventLogger uiEventLogger, KeyguardStateController keyguardStateController, KeyguardSecurityViewFlipperController securityViewFlipperController, - ConfigurationController configurationController) { + ConfigurationController configurationController, + FalsingCollector falsingCollector) { mView = view; mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory; mLockPatternUtils = lockPatternUtils; @@ -558,6 +633,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mKeyguardStateController = keyguardStateController; mSecurityViewFlipperController = securityViewFlipperController; mConfigurationController = configurationController; + mFalsingCollector = falsingCollector; } public KeyguardSecurityContainerController create( @@ -566,7 +642,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mAdminSecondaryLockScreenControllerFactory, mLockPatternUtils, mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger, mKeyguardStateController, securityCallback, mSecurityViewFlipperController, - mConfigurationController); + mConfigurationController, mFalsingCollector); } } |