Loading packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +90 −42 Original line number Diff line number Diff line Loading @@ -23,11 +23,15 @@ import static com.android.systemui.classifier.Classifier.LOCK_ICON; import android.content.Context; import android.content.res.Configuration; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; import android.hardware.biometrics.BiometricSourceType; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.util.DisplayMetrics; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.View; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; Loading Loading @@ -99,6 +103,9 @@ public class LockIconViewController extends ViewController<LockIconView> impleme private boolean mShowUnlockIcon; private boolean mShowLockIcon; private boolean mDownDetected; private final Rect mSensorTouchLocation = new Rect(); @Inject public LockIconViewController( @Nullable LockIconView view, Loading Loading @@ -164,9 +171,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback); mStatusBarStateController.addCallback(mStatusBarStateListener); mKeyguardStateController.addCallback(mKeyguardStateCallback); mAccessibilityManager.addTouchExplorationStateChangeListener( mTouchExplorationStateChangeListener); mDownDetected = false; updateVisibility(); } Loading @@ -176,8 +181,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback); mStatusBarStateController.removeCallback(mStatusBarStateListener); mKeyguardStateController.removeCallback(mKeyguardStateCallback); mAccessibilityManager.removeTouchExplorationStateChangeListener( mTouchExplorationStateChangeListener); if (mCancelDelayedUpdateVisibilityRunnable != null) { mCancelDelayedUpdateVisibilityRunnable.run(); Loading @@ -189,18 +192,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme return mView.getLocationTop(); } private boolean onAffordanceClick() { if (mFalsingManager.isFalseTouch(LOCK_ICON)) { return false; } // pre-emptively set to true to hide view mIsBouncerShowing = true; updateVisibility(); mKeyguardViewController.showBouncer(/* scrim */ true); return true; } /** * Set whether qs is expanded. When QS is expanded, don't show a DisabledUdfps affordance. */ Loading @@ -224,7 +215,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme && (!mUdfpsEnrolled || !mRunningFPS); mShowUnlockIcon = mCanDismissLockScreen && isLockScreen(); updateClickListener(); final CharSequence prevContentDescription = mView.getContentDescription(); if (mShowLockIcon) { mView.setImageDrawable(mLockIcon); Loading Loading @@ -256,12 +246,14 @@ public class LockIconViewController extends ViewController<LockIconView> impleme getResources().getString(R.string.accessibility_enter_hint)); public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(v, info); if (isClickable()) { if (mShowLockIcon) { info.addAction(mAccessibilityAuthenticateHint); } else if (mShowUnlockIcon) { info.addAction(mAccessibilityEnterHint); } } } }; private boolean isLockScreen() { Loading @@ -271,24 +263,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme && mStatusBarState == StatusBarState.KEYGUARD; } private void updateClickListener() { if (mView != null) { if (mUdfpsEnrolled || mShowUnlockIcon) { mView.setOnClickListener(v -> onAffordanceClick()); if (mAccessibilityManager.isTouchExplorationEnabled()) { mView.setOnLongClickListener(null); mView.setLongClickable(false); } else { mView.setOnLongClickListener(v -> onAffordanceClick()); } } else { mView.setOnClickListener(null); mView.setOnLongClickListener(null); } } } private void updateKeyguardShowing() { mIsKeyguardShowing = mKeyguardStateController.isShowing() && !mKeyguardStateController.isKeyguardGoingAway(); Loading Loading @@ -324,6 +298,8 @@ public class LockIconViewController extends ViewController<LockIconView> impleme mHeightPixels - mIndicationBottomPadding - distAboveKgBottomArea - radius), (int) radius); } mView.getHitRect(mSensorTouchLocation); } @Override Loading Loading @@ -448,8 +424,80 @@ public class LockIconViewController extends ViewController<LockIconView> impleme } }; private final AccessibilityManager.TouchExplorationStateChangeListener mTouchExplorationStateChangeListener = enabled -> updateClickListener(); private final GestureDetector mGestureDetector = new GestureDetector(new SimpleOnGestureListener() { public boolean onDown(MotionEvent e) { if (!isClickable()) { mDownDetected = false; return false; } // intercept all following touches until we see MotionEvent.ACTION_CANCEL UP or // MotionEvent.ACTION_UP (see #onTouchEvent) mDownDetected = true; return true; } public void onLongPress(MotionEvent e) { if (!wasClickableOnDownEvent()) { return; } onAffordanceClick(); } public boolean onSingleTapUp(MotionEvent e) { if (!wasClickableOnDownEvent()) { return false; } onAffordanceClick(); return true; } private boolean wasClickableOnDownEvent() { return mDownDetected; } private void onAffordanceClick() { if (mFalsingManager.isFalseTouch(LOCK_ICON)) { return; } // pre-emptively set to true to hide view mIsBouncerShowing = true; updateVisibility(); mKeyguardViewController.showBouncer(/* scrim */ true); } }); /** * Send touch events to this view and handles it if the touch is within this view and we are * in a 'clickable' state * @return whether to intercept the touch event */ public boolean onTouchEvent(MotionEvent event) { if (mSensorTouchLocation.contains((int) event.getX(), (int) event.getY()) && mView.getVisibility() == View.VISIBLE) { mGestureDetector.onTouchEvent(event); } // we continue to intercept all following touches until we see MotionEvent.ACTION_CANCEL UP // or MotionEvent.ACTION_UP. this is to avoid passing the touch to NPV // after the lock icon disappears on device entry if (mDownDetected) { if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP) { mDownDetected = false; } return true; } return false; } private boolean isClickable() { return mUdfpsEnrolled || mShowUnlockIcon; } /** * Set the alpha of this view. Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +4 −0 Original line number Diff line number Diff line Loading @@ -3900,6 +3900,10 @@ public class NotificationPanelViewController extends PanelViewController { mStatusBarKeyguardViewManager.updateKeyguardPosition(event.getX()); } if (mLockIconViewController.onTouchEvent(event)) { return true; } handled |= super.onTouch(v, event); return !mDozing || mPulsing || handled; } Loading Loading
packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +90 −42 Original line number Diff line number Diff line Loading @@ -23,11 +23,15 @@ import static com.android.systemui.classifier.Classifier.LOCK_ICON; import android.content.Context; import android.content.res.Configuration; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; import android.hardware.biometrics.BiometricSourceType; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.util.DisplayMetrics; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.View; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; Loading Loading @@ -99,6 +103,9 @@ public class LockIconViewController extends ViewController<LockIconView> impleme private boolean mShowUnlockIcon; private boolean mShowLockIcon; private boolean mDownDetected; private final Rect mSensorTouchLocation = new Rect(); @Inject public LockIconViewController( @Nullable LockIconView view, Loading Loading @@ -164,9 +171,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback); mStatusBarStateController.addCallback(mStatusBarStateListener); mKeyguardStateController.addCallback(mKeyguardStateCallback); mAccessibilityManager.addTouchExplorationStateChangeListener( mTouchExplorationStateChangeListener); mDownDetected = false; updateVisibility(); } Loading @@ -176,8 +181,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback); mStatusBarStateController.removeCallback(mStatusBarStateListener); mKeyguardStateController.removeCallback(mKeyguardStateCallback); mAccessibilityManager.removeTouchExplorationStateChangeListener( mTouchExplorationStateChangeListener); if (mCancelDelayedUpdateVisibilityRunnable != null) { mCancelDelayedUpdateVisibilityRunnable.run(); Loading @@ -189,18 +192,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme return mView.getLocationTop(); } private boolean onAffordanceClick() { if (mFalsingManager.isFalseTouch(LOCK_ICON)) { return false; } // pre-emptively set to true to hide view mIsBouncerShowing = true; updateVisibility(); mKeyguardViewController.showBouncer(/* scrim */ true); return true; } /** * Set whether qs is expanded. When QS is expanded, don't show a DisabledUdfps affordance. */ Loading @@ -224,7 +215,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme && (!mUdfpsEnrolled || !mRunningFPS); mShowUnlockIcon = mCanDismissLockScreen && isLockScreen(); updateClickListener(); final CharSequence prevContentDescription = mView.getContentDescription(); if (mShowLockIcon) { mView.setImageDrawable(mLockIcon); Loading Loading @@ -256,12 +246,14 @@ public class LockIconViewController extends ViewController<LockIconView> impleme getResources().getString(R.string.accessibility_enter_hint)); public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(v, info); if (isClickable()) { if (mShowLockIcon) { info.addAction(mAccessibilityAuthenticateHint); } else if (mShowUnlockIcon) { info.addAction(mAccessibilityEnterHint); } } } }; private boolean isLockScreen() { Loading @@ -271,24 +263,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme && mStatusBarState == StatusBarState.KEYGUARD; } private void updateClickListener() { if (mView != null) { if (mUdfpsEnrolled || mShowUnlockIcon) { mView.setOnClickListener(v -> onAffordanceClick()); if (mAccessibilityManager.isTouchExplorationEnabled()) { mView.setOnLongClickListener(null); mView.setLongClickable(false); } else { mView.setOnLongClickListener(v -> onAffordanceClick()); } } else { mView.setOnClickListener(null); mView.setOnLongClickListener(null); } } } private void updateKeyguardShowing() { mIsKeyguardShowing = mKeyguardStateController.isShowing() && !mKeyguardStateController.isKeyguardGoingAway(); Loading Loading @@ -324,6 +298,8 @@ public class LockIconViewController extends ViewController<LockIconView> impleme mHeightPixels - mIndicationBottomPadding - distAboveKgBottomArea - radius), (int) radius); } mView.getHitRect(mSensorTouchLocation); } @Override Loading Loading @@ -448,8 +424,80 @@ public class LockIconViewController extends ViewController<LockIconView> impleme } }; private final AccessibilityManager.TouchExplorationStateChangeListener mTouchExplorationStateChangeListener = enabled -> updateClickListener(); private final GestureDetector mGestureDetector = new GestureDetector(new SimpleOnGestureListener() { public boolean onDown(MotionEvent e) { if (!isClickable()) { mDownDetected = false; return false; } // intercept all following touches until we see MotionEvent.ACTION_CANCEL UP or // MotionEvent.ACTION_UP (see #onTouchEvent) mDownDetected = true; return true; } public void onLongPress(MotionEvent e) { if (!wasClickableOnDownEvent()) { return; } onAffordanceClick(); } public boolean onSingleTapUp(MotionEvent e) { if (!wasClickableOnDownEvent()) { return false; } onAffordanceClick(); return true; } private boolean wasClickableOnDownEvent() { return mDownDetected; } private void onAffordanceClick() { if (mFalsingManager.isFalseTouch(LOCK_ICON)) { return; } // pre-emptively set to true to hide view mIsBouncerShowing = true; updateVisibility(); mKeyguardViewController.showBouncer(/* scrim */ true); } }); /** * Send touch events to this view and handles it if the touch is within this view and we are * in a 'clickable' state * @return whether to intercept the touch event */ public boolean onTouchEvent(MotionEvent event) { if (mSensorTouchLocation.contains((int) event.getX(), (int) event.getY()) && mView.getVisibility() == View.VISIBLE) { mGestureDetector.onTouchEvent(event); } // we continue to intercept all following touches until we see MotionEvent.ACTION_CANCEL UP // or MotionEvent.ACTION_UP. this is to avoid passing the touch to NPV // after the lock icon disappears on device entry if (mDownDetected) { if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP) { mDownDetected = false; } return true; } return false; } private boolean isClickable() { return mUdfpsEnrolled || mShowUnlockIcon; } /** * Set the alpha of this view. Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +4 −0 Original line number Diff line number Diff line Loading @@ -3900,6 +3900,10 @@ public class NotificationPanelViewController extends PanelViewController { mStatusBarKeyguardViewManager.updateKeyguardPosition(event.getX()); } if (mLockIconViewController.onTouchEvent(event)) { return true; } handled |= super.onTouch(v, event); return !mDozing || mPulsing || handled; } Loading