Fixed an issue where a notification could stay userlocked

With the fingerprint gesture a user could get a notification
into a state where it remained userlocked.
We're now not only cancelling the expand helper when the shade
is collapsed but also clearing all userlocked flags.

Test: runtest systemui
Change-Id: Ibf0b29375242daf627ec9b5233a8720a9c01dbf6
Fixes: 63055586
This commit is contained in:
Selim Cinek
2017-07-03 17:05:01 +02:00
parent d43bc31eb7
commit 5b1591abd1
2 changed files with 47 additions and 10 deletions

View File

@@ -545,6 +545,16 @@ public class ExpandHelper implements Gefingerpoken {
*/
@VisibleForTesting
void finishExpanding(boolean forceAbort, float velocity) {
finishExpanding(forceAbort, velocity, true /* allowAnimation */);
}
/**
* 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, boolean allowAnimation) {
if (!mExpanding) return;
if (DEBUG) Log.d(TAG, "scale in finishing on view: " + mResizedView);
@@ -568,7 +578,7 @@ public class ExpandHelper implements Gefingerpoken {
mCallback.expansionStateChanged(false);
int naturalHeight = mScaler.getNaturalHeight();
float targetHeight = nowExpanded ? naturalHeight : mSmallSize;
if (targetHeight != currentHeight && mEnabled) {
if (targetHeight != currentHeight && mEnabled && allowAnimation) {
mScaleAnimation.setFloatValues(targetHeight);
mScaleAnimation.setupStartValues();
final View scaledView = mResizedView;
@@ -621,11 +631,23 @@ public class ExpandHelper implements Gefingerpoken {
mResizedView = null;
}
/**
* Use this to abort any pending expansions in progress and force that there will be no
* animations.
*/
public void cancelImmediately() {
cancel(false /* allowAnimation */);
}
/**
* Use this to abort any pending expansions in progress.
*/
public void cancel() {
finishExpanding(true /* forceAbort */, 0f /* velocity */);
cancel(true /* allowAnimation */);
}
private void cancel(boolean allowAnimation) {
finishExpanding(true /* forceAbort */, 0f /* velocity */, allowAnimation);
clearView();
// reset the gesture detector

View File

@@ -3358,15 +3358,29 @@ public class NotificationStackScrollLayout extends ViewGroup
if (!mIsExpanded) {
setOwnScrollY(0);
mStatusBar.resetUserExpandedStates();
clearTemporaryViews();
clearUserLockedViews();
}
}
// lets make sure nothing is in the overlay / transient anymore
clearTemporaryViews(this);
for (int i = 0; i < getChildCount(); i++) {
ExpandableView child = (ExpandableView) getChildAt(i);
if (child instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
clearTemporaryViews(row.getChildrenContainer());
}
private void clearUserLockedViews() {
for (int i = 0; i < getChildCount(); i++) {
ExpandableView child = (ExpandableView) getChildAt(i);
if (child instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
row.setUserLocked(false);
}
}
}
private void clearTemporaryViews() {
// lets make sure nothing is in the overlay / transient anymore
clearTemporaryViews(this);
for (int i = 0; i < getChildCount(); i++) {
ExpandableView child = (ExpandableView) getChildAt(i);
if (child instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
clearTemporaryViews(row.getChildrenContainer());
}
}
}
@@ -3401,6 +3415,7 @@ public class NotificationStackScrollLayout extends ViewGroup
if (changed) {
if (!mIsExpanded) {
mGroupManager.collapseAllGroups();
mExpandHelper.cancelImmediately();
}
updateNotificationAnimationStates();
updateChronometers();