Fixed a bug where notifications could reappear
With sensitive notifications a user could get into
a situation where the groupsummary would not be cleared
because its dismissability was never updated and based
on the visibility of the veto button. This is now corrected.
This Cl also cleans up the veto button handling overall and
ensures that there's no stale state arond it.
Change-Id: Ic7df8d382146d7863ee551c1daa8ba5ed384c7b5
Fixes: 30056258
(cherry picked from commit 9e624e732a)
This commit is contained in:
@@ -40,7 +40,6 @@ import android.content.pm.PackageManager;
|
|||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
import android.content.pm.UserInfo;
|
import android.content.pm.UserInfo;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
@@ -959,18 +958,15 @@ public abstract class BaseStatusBar extends SystemUI implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected View bindVetoButtonClickListener(View row, final StatusBarNotification n) {
|
protected void bindDismissListener(final ExpandableNotificationRow row) {
|
||||||
View vetoButton = row.findViewById(R.id.veto);
|
row.setOnDismissListener(new View.OnClickListener() {
|
||||||
vetoButton.setOnClickListener(new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
// Accessibility feedback
|
// Accessibility feedback
|
||||||
v.announceForAccessibility(
|
v.announceForAccessibility(
|
||||||
mContext.getString(R.string.accessibility_notification_dismissed));
|
mContext.getString(R.string.accessibility_notification_dismissed));
|
||||||
performRemoveNotification(n, false /* removeView */);
|
performRemoveNotification(row.getStatusBarNotification(), false /* removeView */);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
vetoButton.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
|
|
||||||
return vetoButton;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void performRemoveNotification(StatusBarNotification n, boolean removeView) {
|
protected void performRemoveNotification(StatusBarNotification n, boolean removeView) {
|
||||||
@@ -1647,9 +1643,7 @@ public abstract class BaseStatusBar extends SystemUI implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
workAroundBadLayerDrawableOpacity(row);
|
workAroundBadLayerDrawableOpacity(row);
|
||||||
View vetoButton = bindVetoButtonClickListener(row, sbn);
|
bindDismissListener(row);
|
||||||
vetoButton.setContentDescription(mContext.getString(
|
|
||||||
R.string.accessibility_remove_notification));
|
|
||||||
|
|
||||||
// NB: the large icon is now handled entirely by the template
|
// NB: the large icon is now handled entirely by the template
|
||||||
|
|
||||||
@@ -2409,10 +2403,6 @@ public abstract class BaseStatusBar extends SystemUI implements
|
|||||||
updateHeadsUp(key, entry, shouldPeek, alertAgain);
|
updateHeadsUp(key, entry, shouldPeek, alertAgain);
|
||||||
updateNotifications();
|
updateNotifications();
|
||||||
|
|
||||||
// Update the veto button accordingly (and as a result, whether this row is
|
|
||||||
// swipe-dismissable)
|
|
||||||
bindVetoButtonClickListener(entry.row, notification);
|
|
||||||
|
|
||||||
if (!notification.isClearable()) {
|
if (!notification.isClearable()) {
|
||||||
// The user may have performed a dismiss action on the notification, since it's
|
// The user may have performed a dismiss action on the notification, since it's
|
||||||
// not clearable we should snap it back.
|
// not clearable we should snap it back.
|
||||||
|
|||||||
@@ -109,7 +109,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
|||||||
private int mHeadsUpHeight;
|
private int mHeadsUpHeight;
|
||||||
private View mVetoButton;
|
private View mVetoButton;
|
||||||
private int mNotificationColor;
|
private int mNotificationColor;
|
||||||
private boolean mClearable;
|
|
||||||
private ExpansionLogger mLogger;
|
private ExpansionLogger mLogger;
|
||||||
private String mLoggingKey;
|
private String mLoggingKey;
|
||||||
private NotificationSettingsIconRow mSettingsIconRow;
|
private NotificationSettingsIconRow mSettingsIconRow;
|
||||||
@@ -280,7 +279,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
|||||||
mPublicLayout.onNotificationUpdated(entry);
|
mPublicLayout.onNotificationUpdated(entry);
|
||||||
mShowingPublicInitialized = false;
|
mShowingPublicInitialized = false;
|
||||||
updateNotificationColor();
|
updateNotificationColor();
|
||||||
updateClearability();
|
|
||||||
if (mIsSummaryWithChildren) {
|
if (mIsSummaryWithChildren) {
|
||||||
mChildrenContainer.recreateNotificationHeader(mExpandClickListener, mEntry.notification);
|
mChildrenContainer.recreateNotificationHeader(mExpandClickListener, mEntry.notification);
|
||||||
mChildrenContainer.onNotificationUpdated();
|
mChildrenContainer.onNotificationUpdated();
|
||||||
@@ -779,6 +777,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
|||||||
return mGroupParentWhenDismissed;
|
return mGroupParentWhenDismissed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void performDismiss() {
|
||||||
|
mVetoButton.performClick();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnDismissListener(OnClickListener listener) {
|
||||||
|
mVetoButton.setOnClickListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
public interface ExpansionLogger {
|
public interface ExpansionLogger {
|
||||||
public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
|
public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
|
||||||
}
|
}
|
||||||
@@ -880,6 +886,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
mVetoButton = findViewById(R.id.veto);
|
mVetoButton = findViewById(R.id.veto);
|
||||||
|
mVetoButton.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
|
||||||
|
mVetoButton.setContentDescription(mContext.getString(
|
||||||
|
R.string.accessibility_remove_notification));
|
||||||
|
|
||||||
// Add the views that we translate to reveal the gear
|
// Add the views that we translate to reveal the gear
|
||||||
mTranslateableViews = new ArrayList<View>();
|
mTranslateableViews = new ArrayList<View>();
|
||||||
@@ -893,6 +902,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
|||||||
mTranslateableViews.remove(mGutsStub);
|
mTranslateableViews.remove(mGutsStub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public View getVetoButton() {
|
||||||
|
return mVetoButton;
|
||||||
|
}
|
||||||
|
|
||||||
public void resetTranslation() {
|
public void resetTranslation() {
|
||||||
if (mTranslateableViews != null) {
|
if (mTranslateableViews != null) {
|
||||||
for (int i = 0; i < mTranslateableViews.size(); i++) {
|
for (int i = 0; i < mTranslateableViews.size(); i++) {
|
||||||
@@ -1157,7 +1170,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Can the underlying notification be cleared?
|
* @return Can the underlying notification be cleared? This can be different from whether the
|
||||||
|
* notification can be dismissed in case notifications are sensitive on the lockscreen.
|
||||||
|
* @see #canViewBeDismissed()
|
||||||
*/
|
*/
|
||||||
public boolean isClearable() {
|
public boolean isClearable() {
|
||||||
return mStatusBarNotification != null && mStatusBarNotification.isClearable();
|
return mStatusBarNotification != null && mStatusBarNotification.isClearable();
|
||||||
@@ -1317,7 +1332,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
|||||||
NotificationContentView showingLayout = getShowingLayout();
|
NotificationContentView showingLayout = getShowingLayout();
|
||||||
showingLayout.updateBackgroundColor(animated);
|
showingLayout.updateBackgroundColor(animated);
|
||||||
mPrivateLayout.updateExpandButtons(isExpandable());
|
mPrivateLayout.updateExpandButtons(isExpandable());
|
||||||
updateClearability();
|
|
||||||
mShowingPublicInitialized = true;
|
mShowingPublicInitialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1357,12 +1371,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
|||||||
return mIsHeadsUp;
|
return mIsHeadsUp;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateClearability() {
|
/**
|
||||||
// public versions cannot be dismissed
|
* @return Whether this view is allowed to be dismissed. Only valid for visible notifications as
|
||||||
mVetoButton.setVisibility(canViewBeDismissed() ? View.VISIBLE : View.GONE);
|
* otherwise some state might not be updated. To request about the general clearability
|
||||||
}
|
* see {@link #isClearable()}.
|
||||||
|
*/
|
||||||
private boolean canViewBeDismissed() {
|
public boolean canViewBeDismissed() {
|
||||||
return isClearable() && (!mShowingPublic || !mSensitiveHiddenInGeneral);
|
return isClearable() && (!mShowingPublic || !mSensitiveHiddenInGeneral);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -780,7 +780,9 @@ public class NotificationStackScrollLayout extends ViewGroup
|
|||||||
|
|
||||||
public static void performDismiss(View v, NotificationGroupManager groupManager,
|
public static void performDismiss(View v, NotificationGroupManager groupManager,
|
||||||
boolean fromAccessibility) {
|
boolean fromAccessibility) {
|
||||||
if (v instanceof ExpandableNotificationRow) {
|
if (!(v instanceof ExpandableNotificationRow)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
|
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
|
||||||
if (groupManager.isOnlyChildInGroup(row.getStatusBarNotification())) {
|
if (groupManager.isOnlyChildInGroup(row.getStatusBarNotification())) {
|
||||||
ExpandableNotificationRow groupSummary =
|
ExpandableNotificationRow groupSummary =
|
||||||
@@ -790,10 +792,8 @@ public class NotificationStackScrollLayout extends ViewGroup
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
row.setDismissed(true, fromAccessibility);
|
row.setDismissed(true, fromAccessibility);
|
||||||
}
|
if (row.isClearable()) {
|
||||||
final View veto = v.findViewById(R.id.veto);
|
row.performDismiss();
|
||||||
if (veto != null && veto.getVisibility() != View.GONE) {
|
|
||||||
veto.performClick();
|
|
||||||
}
|
}
|
||||||
if (DEBUG) Log.v(TAG, "onChildDismissed: " + v);
|
if (DEBUG) Log.v(TAG, "onChildDismissed: " + v);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,14 +173,14 @@ public class StackScrollAlgorithm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean canChildBeDismissed(View v) {
|
public static boolean canChildBeDismissed(View v) {
|
||||||
if (v instanceof ExpandableNotificationRow) {
|
if (!(v instanceof ExpandableNotificationRow)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
|
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
|
||||||
if (row.areGutsExposed()) {
|
if (row.areGutsExposed()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
return row.canViewBeDismissed();
|
||||||
final View veto = v.findViewById(R.id.veto);
|
|
||||||
return (veto != null && veto.getVisibility() != View.GONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user