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

Commit 48a92a5d authored by Selim Cinek's avatar Selim Cinek
Browse files

Handling the touch better when the screen turns off

Previously we were only cancelling touches when
showing keyguard, but this is not enough, since
a user might be touching it while on the keyguard
(e.g with falsing)

Fixes: 37287962
Fixes: 36416066
Fixes: 37696557
Test: manual, turn of screen while interacting
Merged-In: I572ade2380986ef087468dff721b1d1dfa7a48ab
Change-Id: I572ade2380986ef087468dff721b1d1dfa7a48ab
parent f323e3a5
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -168,7 +168,8 @@ public class KeyguardAffordanceHelper {
                        distance = mTranslationOnDown + distance;
                        distance = Math.max(0, distance);
                    }
                    setTranslation(distance, false /* isReset */, false /* animateReset */);
                    setTranslation(distance, false /* isReset */, false /* animateReset */,
                            false /* force */);
                }
                break;

@@ -373,11 +374,12 @@ public class KeyguardAffordanceHelper {
        targetView.finishAnimation(velocity, mAnimationEndRunnable);
    }

    private void setTranslation(float translation, boolean isReset, boolean animateReset) {
    private void setTranslation(float translation, boolean isReset, boolean animateReset,
            boolean force) {
        translation = rightSwipePossible() ? translation : Math.max(0, translation);
        translation = leftSwipePossible() ? translation : Math.min(0, translation);
        float absTranslation = Math.abs(translation);
        if (translation != mTranslation || isReset) {
        if (translation != mTranslation || isReset || force) {
            KeyguardAffordanceView targetView = translation > 0 ? mLeftIcon : mRightIcon;
            KeyguardAffordanceView otherView = translation > 0 ? mRightIcon : mLeftIcon;
            float alpha = absTranslation / getMinTranslationAmount();
@@ -392,15 +394,15 @@ public class KeyguardAffordanceHelper {
            boolean slowAnimation = isReset && isBelowFalsingThreshold();
            if (!isReset) {
                updateIcon(targetView, radius, alpha + fadeOutAlpha * targetView.getRestingAlpha(),
                        false, false, false, false);
                        false, false, force, false);
            } else {
                updateIcon(targetView, 0.0f, fadeOutAlpha * targetView.getRestingAlpha(),
                        animateIcons, slowAnimation, false, forceNoCircleAnimation);
                        animateIcons, slowAnimation, force, forceNoCircleAnimation);
            }
            updateIcon(otherView, 0.0f, fadeOutAlpha * otherView.getRestingAlpha(),
                    animateIcons, slowAnimation, false, forceNoCircleAnimation);
                    animateIcons, slowAnimation, force, forceNoCircleAnimation);
            updateIcon(mCenterIcon, 0.0f, fadeOutAlpha * mCenterIcon.getRestingAlpha(),
                    animateIcons, slowAnimation, false, forceNoCircleAnimation);
                    animateIcons, slowAnimation, force, forceNoCircleAnimation);

            mTranslation = translation;
        }
@@ -508,8 +510,12 @@ public class KeyguardAffordanceHelper {
    }

    public void reset(boolean animate) {
        reset(animate, false /* force */);
    }

    public void reset(boolean animate, boolean force) {
        cancelAnimation();
        setTranslation(0.0f, true, animate);
        setTranslation(0.0f, true, animate, force);
        mMotionCancelled = true;
        if (mSwipingInProgress) {
            mCallback.onSwipingAborted();
@@ -517,6 +523,10 @@ public class KeyguardAffordanceHelper {
        }
    }

    public void resetImmediately() {
        reset(false /* animate */, true /* force */);
    }

    public boolean isSwipingInProgress() {
        return mSwipingInProgress;
    }
+8 −1
Original line number Diff line number Diff line
@@ -46,7 +46,6 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.keyguard.KeyguardStatusView;
import com.android.systemui.DejankUtils;
import com.android.systemui.EventLogTags;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManager;
@@ -2463,6 +2462,14 @@ public class NotificationPanelView extends PanelView implements
        }
    };

    @Override
    public void setTouchDisabled(boolean disabled) {
        super.setTouchDisabled(disabled);
        if (disabled && mAffordanceHelper.isSwipingInProgress() && !mIsLaunchTransitionRunning) {
            mAffordanceHelper.resetImmediately();
        }
    }

    public void setDark(boolean dark) {
        mDark = dark;
        mKeyguardStatusView.setDark(dark);
+5 −2
Original line number Diff line number Diff line
@@ -221,10 +221,13 @@ public abstract class PanelView extends FrameLayout {

    public void setTouchDisabled(boolean disabled) {
        mTouchDisabled = disabled;
        if (mTouchDisabled && mTracking) {
        if (mTouchDisabled) {
            cancelHeightAnimator();
            if (mTracking) {
                onTrackingStopped(true /* expanded */);
            }
        }
    }

    public void startExpandLatencyTracking() {
        if (LatencyTracker.isEnabled(mContext)) {
+6 −7
Original line number Diff line number Diff line
@@ -4056,13 +4056,6 @@ public class StatusBar extends SystemUI implements DemoMode,
            setBarState(StatusBarState.KEYGUARD);
        }
        updateKeyguardState(false /* goingToFullShade */, false /* fromShadeLocked */);
        if (!mDeviceInteractive) {

            // If the screen is off already, we need to disable touch events because these might
            // collapse the panel after we expanded it, and thus we would end up with a blank
            // Keyguard.
            mNotificationPanel.setTouchDisabled(true);
        }
        if (mState == StatusBarState.KEYGUARD) {
            instantExpandNotificationsPanel();
        } else if (mState == StatusBarState.FULLSCREEN_USER_SWITCHER) {
@@ -4861,6 +4854,12 @@ public class StatusBar extends SystemUI implements DemoMode,
        mStackScroller.setAnimationsEnabled(false);
        mVisualStabilityManager.setScreenOn(false);
        updateVisibleToUser();

        // We need to disable touch events because these might
        // collapse the panel after we expanded it, and thus we would end up with a blank
        // Keyguard.
        mNotificationPanel.setTouchDisabled(true);
        mStatusBarWindow.cancelCurrentTouch();
        if (mLaunchCameraOnFinishedGoingToSleep) {
            mLaunchCameraOnFinishedGoingToSleep = false;

+28 −3
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.os.IBinder;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.InputDevice;
import android.view.InputQueue;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -84,6 +85,8 @@ public class StatusBarWindowView extends FrameLayout {
    private ActionMode mFloatingActionMode;
    private FloatingToolbar mFloatingToolbar;
    private ViewTreeObserver.OnPreDrawListener mFloatingToolbarPreDrawListener;
    private boolean mTouchCancelled;
    private boolean mTouchActive;

    public StatusBarWindowView(Context context, AttributeSet attrs) {
        super(context, attrs);
@@ -239,10 +242,20 @@ public class StatusBarWindowView extends FrameLayout {

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getActionMasked() == MotionEvent.ACTION_DOWN
                && mNotificationPanel.isFullyCollapsed()) {
        boolean isDown = ev.getActionMasked() == MotionEvent.ACTION_DOWN;
        if (isDown && mNotificationPanel.isFullyCollapsed()) {
            mNotificationPanel.startExpandLatencyTracking();
        }
        if (isDown) {
            mTouchActive = true;
            mTouchCancelled = false;
        } else if (ev.getActionMasked() == MotionEvent.ACTION_UP
                || ev.getActionMasked() == MotionEvent.ACTION_CANCEL) {
            mTouchActive = false;
        }
        if (mTouchCancelled) {
            return false;
        }
        mFalsingManager.onTouchEvent(ev, getWidth(), getHeight());
        if (mBrightnessMirror != null && mBrightnessMirror.getVisibility() == VISIBLE) {
            // Disallow new pointers while the brightness mirror is visible. This is so that you
@@ -252,7 +265,7 @@ public class StatusBarWindowView extends FrameLayout {
                return false;
            }
        }
        if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
        if (isDown) {
            mStackScrollLayout.closeControlsIfOutsideTouch(ev);
        }
        if (mService.isDozing()) {
@@ -349,6 +362,18 @@ public class StatusBarWindowView extends FrameLayout {
        }
    }

    public void cancelCurrentTouch() {
        if (mTouchActive) {
            final long now = SystemClock.uptimeMillis();
            MotionEvent event = MotionEvent.obtain(now, now,
                    MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0);
            event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
            dispatchTouchEvent(event);
            event.recycle();
            mTouchCancelled = true;
        }
    }

    public class LayoutParams extends FrameLayout.LayoutParams {

        public boolean ignoreRightInset;