Merge "Fixed a bug where notifications could stay expanded"

This commit is contained in:
Selim Cinek
2016-12-29 12:26:03 +00:00
committed by Android (Google) Code Review
5 changed files with 47 additions and 22 deletions

View File

@@ -326,7 +326,8 @@ public class ExpandHelper implements Gefingerpoken {
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (DEBUG) Log.d(TAG, "up/cancel");
finishExpanding(false, getCurrentVelocity());
finishExpanding(ev.getActionMasked() == MotionEvent.ACTION_CANCEL,
getCurrentVelocity());
clearView();
break;
}
@@ -390,7 +391,8 @@ public class ExpandHelper implements Gefingerpoken {
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!isEnabled()) {
if (!isEnabled() && !mExpanding) {
// In case we're expanding we still want to finish the current motion.
return false;
}
trackVelocity(ev);
@@ -485,7 +487,8 @@ public class ExpandHelper implements Gefingerpoken {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (DEBUG) Log.d(TAG, "up/cancel");
finishExpanding(false, getCurrentVelocity());
finishExpanding(!isEnabled() || ev.getActionMasked() == MotionEvent.ACTION_CANCEL,
getCurrentVelocity());
clearView();
break;
}
@@ -526,28 +529,37 @@ public class ExpandHelper implements Gefingerpoken {
return true;
}
private void finishExpanding(boolean force, float velocity) {
/**
* Finish the current expand motion
* @param forceAbort whether the expansion should be forcefully aborted and returned to the old
* state
* @param velocity the velocity this was expanded/ collapsed with
*/
private void finishExpanding(boolean forceAbort, float velocity) {
if (!mExpanding) return;
if (DEBUG) Log.d(TAG, "scale in finishing on view: " + mResizedView);
float currentHeight = mScaler.getHeight();
float h = mScaler.getHeight();
final boolean wasClosed = (mOldHeight == mSmallSize);
boolean nowExpanded;
int naturalHeight = mScaler.getNaturalHeight();
if (wasClosed) {
nowExpanded = (force || currentHeight > mOldHeight && velocity >= 0);
if (!forceAbort) {
if (wasClosed) {
nowExpanded = currentHeight > mOldHeight && velocity >= 0;
} else {
nowExpanded = currentHeight >= mOldHeight || velocity > 0;
}
nowExpanded |= mNaturalHeight == mSmallSize;
} else {
nowExpanded = !force && (currentHeight >= mOldHeight || velocity > 0);
nowExpanded = !wasClosed;
}
nowExpanded |= mNaturalHeight == mSmallSize;
if (mScaleAnimation.isRunning()) {
mScaleAnimation.cancel();
}
mCallback.expansionStateChanged(false);
int naturalHeight = mScaler.getNaturalHeight();
float targetHeight = nowExpanded ? naturalHeight : mSmallSize;
if (targetHeight != currentHeight) {
if (targetHeight != currentHeight && mEnabled) {
mScaleAnimation.setFloatValues(targetHeight);
mScaleAnimation.setupStartValues();
final View scaledView = mResizedView;
@@ -597,7 +609,7 @@ public class ExpandHelper implements Gefingerpoken {
* Use this to abort any pending expansions in progress.
*/
public void cancel() {
finishExpanding(true, 0f /* velocity */);
finishExpanding(true /* forceAbort */, 0f /* velocity */);
clearView();
// reset the gesture detector

View File

@@ -228,6 +228,10 @@ public class DragDownHelper implements Gefingerpoken {
return mCallback.getChildAtRawPosition(x, y);
}
public boolean isDraggingDown() {
return mDraggingDown;
}
public interface DragDownCallback {
/**

View File

@@ -4692,7 +4692,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
/* Only ever called as a consequence of a lockscreen expansion gesture. */
@Override
public boolean onDraggedDown(View startingChild, int dragLengthY) {
if (hasActiveNotifications()) {
if (hasActiveNotifications() && (!isDozing() || isPulsing())) {
EventLogTags.writeSysuiLockscreenGesture(
EventLogConstants.SYSUI_LOCKSCREEN_GESTURE_SWIPE_DOWN_FULL_SHADE,
(int) (dragLengthY / mDisplayMetrics.density),
@@ -4706,8 +4706,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
return true;
} else {
// No notifications - abort gesture.
// abort gesture.
return false;
}
}

View File

@@ -285,13 +285,10 @@ public class StatusBarWindowView extends FrameLayout {
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (mService.isDozing() && !mService.isPulsing()) {
// Discard all touch events in always-on.
return true;
}
boolean handled = false;
if (mService.getBarState() == StatusBarState.KEYGUARD) {
boolean handled = mService.isDozing() && !mService.isPulsing();
if (mService.getBarState() == StatusBarState.KEYGUARD
&& (!handled || mDragDownHelper.isDraggingDown())) {
// we still want to finish our drag down gesture when locking the screen
handled = mDragDownHelper.onTouchEvent(ev);
}
if (!handled) {

View File

@@ -1064,6 +1064,19 @@ public class NotificationStackScrollLayout extends ViewGroup
public void setUserExpandedChild(View v, boolean userExpanded) {
if (v instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
if (userExpanded && onKeyguard()) {
// Due to a race when locking the screen while touching, a notification may be
// expanded even after we went back to keyguard. An example of this happens if
// you click in the empty space while expanding a group.
// We also need to un-user lock it here, since otherwise the content height
// calculated might be wrong. We also can't invert the two calls since
// un-userlocking it will trigger a layout switch in the content view.
row.setUserLocked(false);
updateContentHeight();
notifyHeightChangeListener(row);
return;
}
row.setUserExpanded(userExpanded, true /* allowChildrenExpansion */);
row.onExpandedByGesture(userExpanded);
}