Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2b82f70 authored by Jim Miller's avatar Jim Miller
Browse files

Fix wrong pattern count in keyguard pattern security view.

This fixes a bug introduced in I085c5ec8 where keyguard attempts to emulate
slippery windows with views.  In order to do so,  the code was overloading
dispatchTouchEvent().  It would allow the super (a ViewGroup) to dispatch
the events and then would dispatch them itself to sub views.  In the case
where an event overlaps an actual child view, it would  result in 2 copies of the event
per window layer (there are 2).  This results in 2 events per layer for the
top two views in the hierarchy. So each actual pattern attempt would count as 4
attempts to the system.

The solution is to overload onTouchEvent() at each level in the view hierarchy,
which means that we ignore events that were already handled by a child window
of the parent.

This change also disables slippery windows for keyguard because it causes
vertical patterns to be ignored.

Fixes bug 7191277

Change-Id: I4df217f2bf382134d93113b8d55b0d71e0e23677
parent 1e5aeecb
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -109,8 +109,8 @@ public class KeyguardHostView extends KeyguardViewBase {
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean result = super.dispatchTouchEvent(ev);
    public boolean onTouchEvent(MotionEvent ev) {
        boolean result = super.onTouchEvent(ev);
        mTempRect.set(0, 0, 0, 0);
        offsetRectIntoDescendantCoords(mSecurityViewContainer, mTempRect);
        ev.offsetLocation(mTempRect.left, mTempRect.top);
+4 −3
Original line number Diff line number Diff line
@@ -157,8 +157,8 @@ public class KeyguardPatternView extends GridLayout implements KeyguardSecurityV
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean result = super.dispatchTouchEvent(ev);
    public boolean onTouchEvent(MotionEvent ev) {
        boolean result = super.onTouchEvent(ev);
        // as long as the user is entering a pattern (i.e sending a touch event that was handled
        // by this screen), keep poking the wake lock so that the screen will stay on.
        final long elapsed = SystemClock.elapsedRealtime() - mLastPokeTime;
@@ -237,10 +237,11 @@ public class KeyguardPatternView extends GridLayout implements KeyguardSecurityV

        public void onPatternDetected(List<LockPatternView.Cell> pattern) {
            if (mLockPatternUtils.checkPattern(pattern)) {
                mCallback.reportSuccessfulUnlockAttempt();
                mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct);
                mCallback.dismiss(true); // keyguardDone(true)
                KeyStore.getInstance().password(LockPatternUtils.patternToString(pattern));
                mTotalFailedPatternAttempts = 0;
                mCallback.dismiss(true);
            } else {
                if (pattern.size() > MIN_PATTERN_BEFORE_POKE_WAKELOCK) {
                    mCallback.userActivity(UNLOCK_PATTERN_WAKE_INTERVAL_MS);
+2 −2
Original line number Diff line number Diff line
@@ -40,8 +40,8 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper {
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean result = super.dispatchTouchEvent(ev);
    public boolean onTouchEvent(MotionEvent ev) {
        boolean result = super.onTouchEvent(ev);
        mTempRect.set(0, 0, 0, 0);
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
+1 −2
Original line number Diff line number Diff line
@@ -131,8 +131,7 @@ public class KeyguardViewManager {
            mKeyguardHost = new ViewManagerHost(mContext);

            int flags = WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER
                    | WindowManager.LayoutParams.FLAG_SLIPPERY;
                    | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;

            if (!mNeedsInput) {
                flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;