Fixed an issue where the panel could be stuck tracking

Multiple issues are fixed that could lead to the panel being
stuck on the lockscreen. The easiest way to reproduce it was
to swipe up while on ambient display, which could easily happen
in a pocket.
This also adds some safeguards, such that it won't happen again
and ensures that notifications can't be swiped in AOD.

Test: add notifications in AOD, try swiping on them
Change-Id: I8ba0ebe72c3a2734b59443f3b93dbe5f1837cbbd
Fixes: 38486627
This commit is contained in:
Selim Cinek
2017-05-30 12:11:09 -07:00
parent 9c1b222fc1
commit be2c443e21
6 changed files with 51 additions and 30 deletions

View File

@@ -165,7 +165,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
openedAmount = Math.min(1.0f, openedAmount);
mShelfState.openedAmount = openedAmount;
mShelfState.clipTopAmount = 0;
mShelfState.alpha = mAmbientState.isPulsing() ? 0 : 1;
mShelfState.alpha = mAmbientState.hasPulsingNotifications() ? 0 : 1;
mShelfState.belowSpeedBump = mAmbientState.getSpeedBumpIndex() == 0;
mShelfState.shadowAlpha = 1.0f;
mShelfState.hideSensitive = false;

View File

@@ -55,6 +55,7 @@ public abstract class PanelView extends FrameLayout {
private long mDownTime;
private float mMinExpandHeight;
private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
private boolean mPanelUpdateWhenAnimatorEnds;
private final void logf(String fmt, Object... args) {
Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args));
@@ -507,7 +508,7 @@ public abstract class PanelView extends FrameLayout {
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (mInstantExpanding || !mNotificationsDragEnabled
if (mInstantExpanding || !mNotificationsDragEnabled || mTouchDisabled
|| (mMotionAborted && event.getActionMasked() != MotionEvent.ACTION_DOWN)) {
return false;
}
@@ -758,14 +759,14 @@ public abstract class PanelView extends FrameLayout {
if (clearAllExpandHack && !mCancelled) {
setExpandedHeightInternal(getMaxPanelHeight());
}
mHeightAnimator = null;
setAnimator(null);
if (!mCancelled) {
notifyExpandingFinished();
}
notifyBarPanelExpansionChanged();
}
});
mHeightAnimator = animator;
setAnimator(animator);
animator.start();
}
@@ -802,15 +803,28 @@ public abstract class PanelView extends FrameLayout {
protected void requestPanelHeightUpdate() {
float currentMaxPanelHeight = getMaxPanelHeight();
// If the user isn't actively poking us, let's update the height
if ((!mTracking || isTrackingBlocked())
&& mHeightAnimator == null
&& !isFullyCollapsed()
&& currentMaxPanelHeight != mExpandedHeight
&& mPeekAnimator == null
&& !mPeekTouching) {
setExpandedHeight(currentMaxPanelHeight);
if (isFullyCollapsed()) {
return;
}
if (currentMaxPanelHeight == mExpandedHeight) {
return;
}
if (mPeekAnimator != null || mPeekTouching) {
return;
}
if (mTracking && !isTrackingBlocked()) {
return;
}
if (mHeightAnimator != null) {
mPanelUpdateWhenAnimatorEnds = true;
return;
}
setExpandedHeight(currentMaxPanelHeight);
}
public void setExpandedHeightInternal(float h) {
@@ -1062,7 +1076,7 @@ public abstract class PanelView extends FrameLayout {
@Override
public void onAnimationEnd(Animator animation) {
if (mCancelled) {
mHeightAnimator = null;
setAnimator(null);
onAnimationFinished.run();
} else {
startUnlockHintAnimationPhase2(onAnimationFinished);
@@ -1070,7 +1084,7 @@ public abstract class PanelView extends FrameLayout {
}
});
animator.start();
mHeightAnimator = animator;
setAnimator(animator);
mKeyguardBottomArea.getIndicationArea().animate()
.translationY(-mHintDistance)
.setDuration(250)
@@ -1088,6 +1102,14 @@ public abstract class PanelView extends FrameLayout {
.start();
}
private void setAnimator(ValueAnimator animator) {
mHeightAnimator = animator;
if (animator == null && mPanelUpdateWhenAnimatorEnds) {
mPanelUpdateWhenAnimatorEnds = false;
requestPanelHeightUpdate();
}
}
/**
* Phase 2: Bounce down.
*/
@@ -1098,13 +1120,13 @@ public abstract class PanelView extends FrameLayout {
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mHeightAnimator = null;
setAnimator(null);
onAnimationFinished.run();
notifyBarPanelExpansionChanged();
}
});
animator.start();
mHeightAnimator = animator;
setAnimator(animator);
}
private ValueAnimator createHeightAnimator(float targetHeight) {

View File

@@ -4938,7 +4938,6 @@ public class StatusBar extends SystemUI implements DemoMode,
where.getLocationInWindow(mTmpInt2);
mWakeUpTouchLocation = new PointF(mTmpInt2[0] + where.getWidth() / 2,
mTmpInt2[1] + where.getHeight() / 2);
mNotificationPanel.setTouchDisabled(false);
mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested();
mFalsingManager.onScreenOnFromTouch();
}

View File

@@ -277,7 +277,7 @@ public class StatusBarWindowView extends FrameLayout {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (mService.isDozing() && !mService.isPulsing()) {
if (mService.isDozing() && !mStackScrollLayout.hasPulsingNotifications()) {
// Capture all touch events in always-on.
return true;
}

View File

@@ -59,7 +59,7 @@ public class AmbientState {
private boolean mPanelTracking;
private boolean mExpansionChanging;
private boolean mPanelFullWidth;
private boolean mPulsing;
private boolean mHasPulsingNotifications;
private boolean mUnlockHintRunning;
public AmbientState(Context context) {
@@ -287,12 +287,12 @@ public class AmbientState {
mPanelTracking = panelTracking;
}
public boolean isPulsing() {
return mPulsing;
public boolean hasPulsingNotifications() {
return mHasPulsingNotifications;
}
public void setPulsing(boolean pulsing) {
mPulsing = pulsing;
public void setHasPulsingNotifications(boolean hasPulsing) {
mHasPulsingNotifications = hasPulsing;
}
public boolean isPanelTracking() {

View File

@@ -53,7 +53,6 @@ import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.OverScroller;
@@ -1941,7 +1940,7 @@ public class NotificationStackScrollLayout extends ViewGroup
int numShownItems = 0;
boolean finish = false;
int maxDisplayedNotifications = mAmbientState.isDark()
? (isPulsing() ? 1 : 0)
? (hasPulsingNotifications() ? 1 : 0)
: mMaxDisplayedNotifications;
for (int i = 0; i < getChildCount(); i++) {
@@ -1950,7 +1949,8 @@ public class NotificationStackScrollLayout extends ViewGroup
&& !expandableView.hasNoContentHeight()) {
boolean limitReached = maxDisplayedNotifications != -1
&& numShownItems >= maxDisplayedNotifications;
boolean notificationOnAmbientThatIsNotPulsing = isPulsing()
boolean notificationOnAmbientThatIsNotPulsing = mAmbientState.isDark()
&& hasPulsingNotifications()
&& expandableView instanceof ExpandableNotificationRow
&& !isPulsing(((ExpandableNotificationRow) expandableView).getEntry());
if (limitReached || notificationOnAmbientThatIsNotPulsing) {
@@ -2008,7 +2008,7 @@ public class NotificationStackScrollLayout extends ViewGroup
return false;
}
private boolean isPulsing() {
public boolean hasPulsingNotifications() {
return mPulsing != null;
}
@@ -2837,7 +2837,7 @@ public class NotificationStackScrollLayout extends ViewGroup
}
private void updateNotificationAnimationStates() {
boolean running = mAnimationsEnabled || isPulsing();
boolean running = mAnimationsEnabled || hasPulsingNotifications();
mShelf.setAnimationsEnabled(running);
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
@@ -2848,7 +2848,7 @@ public class NotificationStackScrollLayout extends ViewGroup
}
private void updateAnimationState(View child) {
updateAnimationState((mAnimationsEnabled || isPulsing())
updateAnimationState((mAnimationsEnabled || hasPulsingNotifications())
&& (mIsExpanded || isPinnedHeadsUp(child)), child);
}
@@ -4117,7 +4117,7 @@ public class NotificationStackScrollLayout extends ViewGroup
return;
}
mPulsing = pulsing;
mAmbientState.setPulsing(isPulsing());
mAmbientState.setHasPulsingNotifications(hasPulsingNotifications());
updateNotificationAnimationStates();
updateContentHeight();
notifyHeightChangeListener(mShelf);