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

Commit 9c2c77f8 authored by Adam Powell's avatar Adam Powell
Browse files

Keyguard - fix overzealous sliding security view

Bug 7453429

Change the detection of sliding the security view to require crossing
the border between sections in the correct direction. This also
improves the feel of re-opening the slider.

Change-Id: I57797f926e017ea2cf41f7c48e0fe77ac0f78460
parent 601dbad9
Loading
Loading
Loading
Loading
+18 −13
Original line number Original line Diff line number Diff line
@@ -16,6 +16,8 @@


package com.android.internal.policy.impl.keyguard;
package com.android.internal.policy.impl.keyguard;


import com.android.internal.R;

import android.animation.Animator;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ObjectAnimator;
@@ -29,7 +31,6 @@ import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.FloatProperty;
import android.util.Log;
import android.util.Log;
import android.util.MathUtils;
import android.util.Property;
import android.util.Property;
import android.view.MotionEvent;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.VelocityTracker;
@@ -40,8 +41,6 @@ import android.view.accessibility.AccessibilityManager;
import android.view.animation.Interpolator;
import android.view.animation.Interpolator;
import android.widget.Scroller;
import android.widget.Scroller;


import com.android.internal.R;

/**
/**
 * This layout handles interaction with the sliding security challenge views
 * This layout handles interaction with the sliding security challenge views
 * that overlay/resize other keyguard contents.
 * that overlay/resize other keyguard contents.
@@ -53,7 +52,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
    // The drag handle is measured in dp above & below the top edge of the
    // The drag handle is measured in dp above & below the top edge of the
    // challenge view; these parameters change based on whether the challenge 
    // challenge view; these parameters change based on whether the challenge 
    // is open or closed.
    // is open or closed.
    private static final int DRAG_HANDLE_CLOSED_ABOVE = 64; // dp
    private static final int DRAG_HANDLE_CLOSED_ABOVE = 8; // dp
    private static final int DRAG_HANDLE_CLOSED_BELOW = 0; // dp
    private static final int DRAG_HANDLE_CLOSED_BELOW = 0; // dp
    private static final int DRAG_HANDLE_OPEN_ABOVE = 8; // dp
    private static final int DRAG_HANDLE_OPEN_ABOVE = 8; // dp
    private static final int DRAG_HANDLE_OPEN_BELOW = 0; // dp
    private static final int DRAG_HANDLE_OPEN_BELOW = 0; // dp
@@ -581,9 +580,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
                    final float x = ev.getX(i);
                    final float x = ev.getX(i);
                    final float y = ev.getY(i);
                    final float y = ev.getY(i);
                    if (!mIsBouncing && mActivePointerId == INVALID_POINTER
                    if (!mIsBouncing && mActivePointerId == INVALID_POINTER
                                && ((isInDragHandle(x, y) && MathUtils.sq(x - mGestureStartX)
                                && (crossedDragHandle(x, y, mGestureStartY)
                                        + MathUtils.sq(y - mGestureStartY) > mTouchSlopSquare)
                                || crossedDragHandle(x, y, mGestureStartY)
                                || (isInChallengeView(x, y) &&
                                || (isInChallengeView(x, y) &&
                                        mScrollState == SCROLL_STATE_SETTLING))) {
                                        mScrollState == SCROLL_STATE_SETTLING))) {
                        mActivePointerId = ev.getPointerId(i);
                        mActivePointerId = ev.getPointerId(i);
@@ -592,7 +589,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
                        mGestureStartChallengeBottom = getChallengeBottom();
                        mGestureStartChallengeBottom = getChallengeBottom();
                        mDragging = true;
                        mDragging = true;
                        mChallengeView.setLayerType(LAYER_TYPE_HARDWARE, null);
                        mChallengeView.setLayerType(LAYER_TYPE_HARDWARE, null);
                    } else if (isInChallengeView(x, y)) {
                    } else if (mChallengeShowing && isInChallengeView(x, y)) {
                        mBlockDrag = true;
                        mBlockDrag = true;
                    }
                    }
                }
                }
@@ -767,11 +764,19 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
    }
    }


    private boolean crossedDragHandle(float x, float y, float initialY) {
    private boolean crossedDragHandle(float x, float y, float initialY) {

        final int challengeTop = mChallengeView.getTop();
        final int challengeTop = mChallengeView.getTop();
        return  x >= 0 &&
        final boolean horizOk = x >= 0 && x < getWidth();
                x < getWidth() &&

                initialY < (challengeTop - getDragHandleSizeAbove()) &&
        final boolean vertOk;
        if (mChallengeShowing) {
            vertOk = initialY < (challengeTop - getDragHandleSizeAbove()) &&
                    y > challengeTop + getDragHandleSizeBelow();
                    y > challengeTop + getDragHandleSizeBelow();
        } else {
            vertOk = initialY > challengeTop + getDragHandleSizeBelow() &&
                    y < challengeTop - getDragHandleSizeAbove();
        }
        return horizOk && vertOk;
    }
    }


    @Override
    @Override