Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java +4 −0 Original line number Diff line number Diff line Loading @@ -214,6 +214,10 @@ public class KeyguardAffordanceHelper { return null; } public boolean isOnAffordanceIcon(float x, float y) { return isOnIcon(mLeftIcon, x, y) || isOnIcon(mRightIcon, x, y); } private boolean isOnIcon(View icon, float x, float y) { float iconX = icon.getX() + icon.getWidth() / 2.0f; float iconY = icon.getY() + icon.getHeight() / 2.0f; Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +9 −4 Original line number Diff line number Diff line Loading @@ -518,9 +518,9 @@ public class NotificationPanelView extends PanelView implements @Override protected void flingToHeight(float vel, boolean expand, float target, float collapseSpeedUpFactor) { float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { mHeadsUpTouchHelper.notifyFling(!expand); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } @Override Loading Loading @@ -771,8 +771,8 @@ public class NotificationPanelView extends PanelView implements } @Override protected boolean flingExpands(float vel, float vectorVel) { boolean expands = super.flingExpands(vel, vectorVel); protected boolean flingExpands(float vel, float vectorVel, float x, float y) { boolean expands = super.flingExpands(vel, vectorVel, x, y); // If we are already running a QS expansion, make sure that we keep the panel open. if (mQsExpansionAnimator != null) { Loading @@ -786,6 +786,11 @@ public class NotificationPanelView extends PanelView implements return mStatusBar.getBarState() != StatusBarState.SHADE; } @Override protected boolean shouldGestureIgnoreXTouchSlop(float x, float y) { return !mAfforanceHelper.isOnAffordanceIcon(x, y); } private void onQsTouch(MotionEvent event) { int pointerIndex = event.findPointerIndex(mTrackingPointer); if (pointerIndex < 0) { Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +59 −22 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ public abstract class PanelView extends FrameLayout { private int mUnlockFalsingThreshold; private boolean mTouchStartedInEmptyArea; private boolean mMotionAborted; private boolean mUpwardsWhenTresholdReached; private ValueAnimator mHeightAnimator; private ObjectAnimator mPeekAnimator; Loading Loading @@ -109,6 +110,7 @@ public abstract class PanelView extends FrameLayout { private boolean mExpanding; private boolean mGestureWaitForTouchSlop; private boolean mIgnoreXTouchSlop; private Runnable mPeekRunnable = new Runnable() { @Override public void run() { Loading Loading @@ -240,9 +242,9 @@ public abstract class PanelView extends FrameLayout { final float y = event.getY(pointerIndex); if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { mGestureWaitForTouchSlop = isShadeCollapsed(); mGestureWaitForTouchSlop = isShadeCollapsed() || hasConflictingGestures(); mIgnoreXTouchSlop = isShadeCollapsed() || shouldGestureIgnoreXTouchSlop(x, y); } boolean waitForTouchSlop = hasConflictingGestures() || mGestureWaitForTouchSlop; switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: Loading @@ -258,7 +260,7 @@ public abstract class PanelView extends FrameLayout { initVelocityTracker(); } trackMovement(event); if (!waitForTouchSlop || (mHeightAnimator != null && !mHintAnimationRunning) || if (!mGestureWaitForTouchSlop || (mHeightAnimator != null && !mHintAnimationRunning) || mPeekPending || mPeekAnimator != null) { cancelHeightAnimator(); cancelPeek(); Loading Loading @@ -296,9 +298,9 @@ public abstract class PanelView extends FrameLayout { // y-component of the gesture, as we have no conflicting horizontal gesture. if (Math.abs(h) > mTouchSlop && (Math.abs(h) > Math.abs(x - mInitialTouchX) || mInitialOffsetOnTouch == 0f)) { || mIgnoreXTouchSlop)) { mTouchSlopExceeded = true; if (waitForTouchSlop && !mTracking) { if (mGestureWaitForTouchSlop && !mTracking) { if (!mJustPeeked && mInitialOffsetOnTouch != 0f) { startExpandMotion(x, y, false /* startTracking */, mExpandedHeight); h = 0; Loading @@ -318,8 +320,9 @@ public abstract class PanelView extends FrameLayout { } if (-h >= getFalsingThreshold()) { mTouchAboveFalsingThreshold = true; mUpwardsWhenTresholdReached = isDirectionUpwards(x, y); } if (!mJustPeeked && (!waitForTouchSlop || mTracking) && !isTrackingBlocked()) { if (!mJustPeeked && (!mGestureWaitForTouchSlop || mTracking) && !isTrackingBlocked()) { setExpandedHeightInternal(newHeight); } Loading @@ -332,7 +335,20 @@ public abstract class PanelView extends FrameLayout { endMotionEvent(event, x, y, false /* forceCancel */); break; } return !waitForTouchSlop || mTracking; return !mGestureWaitForTouchSlop || mTracking; } /** * @return whether the swiping direction is upwards and above a 45 degree angle compared to the * horizontal direction */ private boolean isDirectionUpwards(float x, float y) { float xDiff = x - mInitialTouchX; float yDiff = y - mInitialTouchY; if (yDiff >= 0) { return false; } return Math.abs(yDiff) >= Math.abs(xDiff); } protected void startExpandMotion(float newX, float newY, boolean startTracking, Loading Loading @@ -361,7 +377,7 @@ public abstract class PanelView extends FrameLayout { vectorVel = (float) Math.hypot( mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity()); } boolean expand = flingExpands(vel, vectorVel) boolean expand = flingExpands(vel, vectorVel, x, y) || event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel; onTrackingStopped(expand); Loading @@ -377,7 +393,7 @@ public abstract class PanelView extends FrameLayout { EventLogConstants.SYSUI_LOCKSCREEN_GESTURE_SWIPE_UP_UNLOCK, heightDp, velocityDp); } fling(vel, expand); fling(vel, expand, isFalseTouch(x, y)); mUpdateFlingOnLayout = expand && mPanelClosedOnDown && !mHasLayoutedSinceDown; if (mUpdateFlingOnLayout) { mUpdateFlingVelocity = vel; Loading @@ -401,6 +417,8 @@ public abstract class PanelView extends FrameLayout { protected abstract boolean hasConflictingGestures(); protected abstract boolean shouldGestureIgnoreXTouchSlop(float x, float y); protected void onTrackingStopped(boolean expand) { mTracking = false; mBar.onTrackingStopped(PanelView.this, expand); Loading Loading @@ -553,8 +571,8 @@ public abstract class PanelView extends FrameLayout { * @param vectorVel the length of the vectorial velocity * @return whether a fling should expands the panel; contracts otherwise */ protected boolean flingExpands(float vel, float vectorVel) { if (isBelowFalsingThreshold()) { protected boolean flingExpands(float vel, float vectorVel, float x, float y) { if (isFalseTouch(x, y)) { return true; } if (Math.abs(vectorVel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { Loading @@ -564,22 +582,41 @@ public abstract class PanelView extends FrameLayout { } } private boolean isBelowFalsingThreshold() { return !mTouchAboveFalsingThreshold && mStatusBar.isFalsingThresholdNeeded(); /** * @param x the final x-coordinate when the finger was lifted * @param y the final y-coordinate when the finger was lifted * @return whether this motion should be regarded as a false touch */ private boolean isFalseTouch(float x, float y) { if (!mStatusBar.isFalsingThresholdNeeded()) { return false; } if (!mTouchAboveFalsingThreshold) { return true; } if (mUpwardsWhenTresholdReached) { return false; } return !isDirectionUpwards(x, y); } protected void fling(float vel, boolean expand) { fling(vel, expand, 1.0f /* collapseSpeedUpFactor */); fling(vel, expand, 1.0f /* collapseSpeedUpFactor */, false); } protected void fling(float vel, boolean expand, boolean expandBecauseOfFalsing) { fling(vel, expand, 1.0f /* collapseSpeedUpFactor */, expandBecauseOfFalsing); } protected void fling(float vel, boolean expand, float collapseSpeedUpFactor) { protected void fling(float vel, boolean expand, float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { cancelPeek(); float target = expand ? getMaxPanelHeight() : 0.0f; flingToHeight(vel, expand, target, collapseSpeedUpFactor); flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } protected void flingToHeight(float vel, boolean expand, float target, float collapseSpeedUpFactor) { float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { // Hack to make the expand transition look nice when clear all button is visible - we make // the animation only to the last notification, and then jump to the maximum panel height so // clear all just fades in and the decelerating motion is towards the last notification. Loading @@ -596,12 +633,11 @@ public abstract class PanelView extends FrameLayout { mOverExpandedBeforeFling = getOverExpansionAmount() > 0f; ValueAnimator animator = createHeightAnimator(target); if (expand) { boolean belowFalsingThreshold = isBelowFalsingThreshold(); if (belowFalsingThreshold) { if (expandBecauseOfFalsing) { vel = 0; } mFlingAnimationUtils.apply(animator, mExpandedHeight, target, vel, getHeight()); if (belowFalsingThreshold) { if (expandBecauseOfFalsing) { animator.setDuration(350); } } else { Loading Loading @@ -776,7 +812,7 @@ public abstract class PanelView extends FrameLayout { mNextCollapseSpeedUpFactor = speedUpFactor; postDelayed(mFlingCollapseRunnable, 120); } else { fling(0, false /* expand */, speedUpFactor); fling(0, false /* expand */, speedUpFactor, false /* expandBecauseOfFalsing */); } } } Loading @@ -784,7 +820,8 @@ public abstract class PanelView extends FrameLayout { private final Runnable mFlingCollapseRunnable = new Runnable() { @Override public void run() { fling(0, false /* expand */, mNextCollapseSpeedUpFactor); fling(0, false /* expand */, mNextCollapseSpeedUpFactor, false /* expandBecauseOfFalsing */); } }; Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +1 −3 Original line number Diff line number Diff line Loading @@ -1800,9 +1800,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } public boolean isFalsingThresholdNeeded() { boolean onKeyguard = getBarState() == StatusBarState.KEYGUARD; boolean isCurrentlyInsecure = mUnlockMethodCache.isCurrentlyInsecure(); return onKeyguard && (isCurrentlyInsecure || mDozing || mScreenOnComingFromTouch); return getBarState() == StatusBarState.KEYGUARD; } public boolean isDozing() { Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java +4 −0 Original line number Diff line number Diff line Loading @@ -214,6 +214,10 @@ public class KeyguardAffordanceHelper { return null; } public boolean isOnAffordanceIcon(float x, float y) { return isOnIcon(mLeftIcon, x, y) || isOnIcon(mRightIcon, x, y); } private boolean isOnIcon(View icon, float x, float y) { float iconX = icon.getX() + icon.getWidth() / 2.0f; float iconY = icon.getY() + icon.getHeight() / 2.0f; Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +9 −4 Original line number Diff line number Diff line Loading @@ -518,9 +518,9 @@ public class NotificationPanelView extends PanelView implements @Override protected void flingToHeight(float vel, boolean expand, float target, float collapseSpeedUpFactor) { float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { mHeadsUpTouchHelper.notifyFling(!expand); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } @Override Loading Loading @@ -771,8 +771,8 @@ public class NotificationPanelView extends PanelView implements } @Override protected boolean flingExpands(float vel, float vectorVel) { boolean expands = super.flingExpands(vel, vectorVel); protected boolean flingExpands(float vel, float vectorVel, float x, float y) { boolean expands = super.flingExpands(vel, vectorVel, x, y); // If we are already running a QS expansion, make sure that we keep the panel open. if (mQsExpansionAnimator != null) { Loading @@ -786,6 +786,11 @@ public class NotificationPanelView extends PanelView implements return mStatusBar.getBarState() != StatusBarState.SHADE; } @Override protected boolean shouldGestureIgnoreXTouchSlop(float x, float y) { return !mAfforanceHelper.isOnAffordanceIcon(x, y); } private void onQsTouch(MotionEvent event) { int pointerIndex = event.findPointerIndex(mTrackingPointer); if (pointerIndex < 0) { Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +59 −22 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ public abstract class PanelView extends FrameLayout { private int mUnlockFalsingThreshold; private boolean mTouchStartedInEmptyArea; private boolean mMotionAborted; private boolean mUpwardsWhenTresholdReached; private ValueAnimator mHeightAnimator; private ObjectAnimator mPeekAnimator; Loading Loading @@ -109,6 +110,7 @@ public abstract class PanelView extends FrameLayout { private boolean mExpanding; private boolean mGestureWaitForTouchSlop; private boolean mIgnoreXTouchSlop; private Runnable mPeekRunnable = new Runnable() { @Override public void run() { Loading Loading @@ -240,9 +242,9 @@ public abstract class PanelView extends FrameLayout { final float y = event.getY(pointerIndex); if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { mGestureWaitForTouchSlop = isShadeCollapsed(); mGestureWaitForTouchSlop = isShadeCollapsed() || hasConflictingGestures(); mIgnoreXTouchSlop = isShadeCollapsed() || shouldGestureIgnoreXTouchSlop(x, y); } boolean waitForTouchSlop = hasConflictingGestures() || mGestureWaitForTouchSlop; switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: Loading @@ -258,7 +260,7 @@ public abstract class PanelView extends FrameLayout { initVelocityTracker(); } trackMovement(event); if (!waitForTouchSlop || (mHeightAnimator != null && !mHintAnimationRunning) || if (!mGestureWaitForTouchSlop || (mHeightAnimator != null && !mHintAnimationRunning) || mPeekPending || mPeekAnimator != null) { cancelHeightAnimator(); cancelPeek(); Loading Loading @@ -296,9 +298,9 @@ public abstract class PanelView extends FrameLayout { // y-component of the gesture, as we have no conflicting horizontal gesture. if (Math.abs(h) > mTouchSlop && (Math.abs(h) > Math.abs(x - mInitialTouchX) || mInitialOffsetOnTouch == 0f)) { || mIgnoreXTouchSlop)) { mTouchSlopExceeded = true; if (waitForTouchSlop && !mTracking) { if (mGestureWaitForTouchSlop && !mTracking) { if (!mJustPeeked && mInitialOffsetOnTouch != 0f) { startExpandMotion(x, y, false /* startTracking */, mExpandedHeight); h = 0; Loading @@ -318,8 +320,9 @@ public abstract class PanelView extends FrameLayout { } if (-h >= getFalsingThreshold()) { mTouchAboveFalsingThreshold = true; mUpwardsWhenTresholdReached = isDirectionUpwards(x, y); } if (!mJustPeeked && (!waitForTouchSlop || mTracking) && !isTrackingBlocked()) { if (!mJustPeeked && (!mGestureWaitForTouchSlop || mTracking) && !isTrackingBlocked()) { setExpandedHeightInternal(newHeight); } Loading @@ -332,7 +335,20 @@ public abstract class PanelView extends FrameLayout { endMotionEvent(event, x, y, false /* forceCancel */); break; } return !waitForTouchSlop || mTracking; return !mGestureWaitForTouchSlop || mTracking; } /** * @return whether the swiping direction is upwards and above a 45 degree angle compared to the * horizontal direction */ private boolean isDirectionUpwards(float x, float y) { float xDiff = x - mInitialTouchX; float yDiff = y - mInitialTouchY; if (yDiff >= 0) { return false; } return Math.abs(yDiff) >= Math.abs(xDiff); } protected void startExpandMotion(float newX, float newY, boolean startTracking, Loading Loading @@ -361,7 +377,7 @@ public abstract class PanelView extends FrameLayout { vectorVel = (float) Math.hypot( mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity()); } boolean expand = flingExpands(vel, vectorVel) boolean expand = flingExpands(vel, vectorVel, x, y) || event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel; onTrackingStopped(expand); Loading @@ -377,7 +393,7 @@ public abstract class PanelView extends FrameLayout { EventLogConstants.SYSUI_LOCKSCREEN_GESTURE_SWIPE_UP_UNLOCK, heightDp, velocityDp); } fling(vel, expand); fling(vel, expand, isFalseTouch(x, y)); mUpdateFlingOnLayout = expand && mPanelClosedOnDown && !mHasLayoutedSinceDown; if (mUpdateFlingOnLayout) { mUpdateFlingVelocity = vel; Loading @@ -401,6 +417,8 @@ public abstract class PanelView extends FrameLayout { protected abstract boolean hasConflictingGestures(); protected abstract boolean shouldGestureIgnoreXTouchSlop(float x, float y); protected void onTrackingStopped(boolean expand) { mTracking = false; mBar.onTrackingStopped(PanelView.this, expand); Loading Loading @@ -553,8 +571,8 @@ public abstract class PanelView extends FrameLayout { * @param vectorVel the length of the vectorial velocity * @return whether a fling should expands the panel; contracts otherwise */ protected boolean flingExpands(float vel, float vectorVel) { if (isBelowFalsingThreshold()) { protected boolean flingExpands(float vel, float vectorVel, float x, float y) { if (isFalseTouch(x, y)) { return true; } if (Math.abs(vectorVel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { Loading @@ -564,22 +582,41 @@ public abstract class PanelView extends FrameLayout { } } private boolean isBelowFalsingThreshold() { return !mTouchAboveFalsingThreshold && mStatusBar.isFalsingThresholdNeeded(); /** * @param x the final x-coordinate when the finger was lifted * @param y the final y-coordinate when the finger was lifted * @return whether this motion should be regarded as a false touch */ private boolean isFalseTouch(float x, float y) { if (!mStatusBar.isFalsingThresholdNeeded()) { return false; } if (!mTouchAboveFalsingThreshold) { return true; } if (mUpwardsWhenTresholdReached) { return false; } return !isDirectionUpwards(x, y); } protected void fling(float vel, boolean expand) { fling(vel, expand, 1.0f /* collapseSpeedUpFactor */); fling(vel, expand, 1.0f /* collapseSpeedUpFactor */, false); } protected void fling(float vel, boolean expand, boolean expandBecauseOfFalsing) { fling(vel, expand, 1.0f /* collapseSpeedUpFactor */, expandBecauseOfFalsing); } protected void fling(float vel, boolean expand, float collapseSpeedUpFactor) { protected void fling(float vel, boolean expand, float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { cancelPeek(); float target = expand ? getMaxPanelHeight() : 0.0f; flingToHeight(vel, expand, target, collapseSpeedUpFactor); flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } protected void flingToHeight(float vel, boolean expand, float target, float collapseSpeedUpFactor) { float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { // Hack to make the expand transition look nice when clear all button is visible - we make // the animation only to the last notification, and then jump to the maximum panel height so // clear all just fades in and the decelerating motion is towards the last notification. Loading @@ -596,12 +633,11 @@ public abstract class PanelView extends FrameLayout { mOverExpandedBeforeFling = getOverExpansionAmount() > 0f; ValueAnimator animator = createHeightAnimator(target); if (expand) { boolean belowFalsingThreshold = isBelowFalsingThreshold(); if (belowFalsingThreshold) { if (expandBecauseOfFalsing) { vel = 0; } mFlingAnimationUtils.apply(animator, mExpandedHeight, target, vel, getHeight()); if (belowFalsingThreshold) { if (expandBecauseOfFalsing) { animator.setDuration(350); } } else { Loading Loading @@ -776,7 +812,7 @@ public abstract class PanelView extends FrameLayout { mNextCollapseSpeedUpFactor = speedUpFactor; postDelayed(mFlingCollapseRunnable, 120); } else { fling(0, false /* expand */, speedUpFactor); fling(0, false /* expand */, speedUpFactor, false /* expandBecauseOfFalsing */); } } } Loading @@ -784,7 +820,8 @@ public abstract class PanelView extends FrameLayout { private final Runnable mFlingCollapseRunnable = new Runnable() { @Override public void run() { fling(0, false /* expand */, mNextCollapseSpeedUpFactor); fling(0, false /* expand */, mNextCollapseSpeedUpFactor, false /* expandBecauseOfFalsing */); } }; Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +1 −3 Original line number Diff line number Diff line Loading @@ -1800,9 +1800,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } public boolean isFalsingThresholdNeeded() { boolean onKeyguard = getBarState() == StatusBarState.KEYGUARD; boolean isCurrentlyInsecure = mUnlockMethodCache.isCurrentlyInsecure(); return onKeyguard && (isCurrentlyInsecure || mDozing || mScreenOnComingFromTouch); return getBarState() == StatusBarState.KEYGUARD; } public boolean isDozing() { Loading