summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chloris Kuo <chloriskuo@google.com> 2021-10-19 01:30:09 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2021-10-19 01:30:09 +0000
commit28967d42e742795897b55de2c411a8ac637a7b56 (patch)
treea0243e8a638feab893ec0a428ad7bf4d9a1fe35a
parent06738f856ef45ebdff30bd070901a4dadcedbf24 (diff)
parent36a15a906ceb06c4181ed1cb788329e1375466f5 (diff)
Merge "Notification text change should not be interruptive during post time" into sc-v2-dev am: 36a15a906c
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16076774 Change-Id: I23e725cb556cd6869de23fbce0eadc0db477c5df
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java18
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java14
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java2
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/RankingBuilder.java10
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java3
-rw-r--r--services/core/java/com/android/server/notification/NotificationRecord.java4
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java8
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java21
10 files changed, 57 insertions, 33 deletions
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 3d18a8933153..c94595468aec 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -1699,7 +1699,7 @@ public abstract class NotificationListenerService extends Service {
private ArrayList<Notification.Action> mSmartActions;
private ArrayList<CharSequence> mSmartReplies;
private boolean mCanBubble;
- private boolean mVisuallyInterruptive;
+ private boolean mIsTextChanged;
private boolean mIsConversation;
private ShortcutInfo mShortcutInfo;
private @RankingAdjustment int mRankingAdjustment;
@@ -1736,7 +1736,7 @@ public abstract class NotificationListenerService extends Service {
out.writeTypedList(mSmartActions, flags);
out.writeCharSequenceList(mSmartReplies);
out.writeBoolean(mCanBubble);
- out.writeBoolean(mVisuallyInterruptive);
+ out.writeBoolean(mIsTextChanged);
out.writeBoolean(mIsConversation);
out.writeParcelable(mShortcutInfo, flags);
out.writeInt(mRankingAdjustment);
@@ -1774,7 +1774,7 @@ public abstract class NotificationListenerService extends Service {
mSmartActions = in.createTypedArrayList(Notification.Action.CREATOR);
mSmartReplies = in.readCharSequenceList();
mCanBubble = in.readBoolean();
- mVisuallyInterruptive = in.readBoolean();
+ mIsTextChanged = in.readBoolean();
mIsConversation = in.readBoolean();
mShortcutInfo = in.readParcelable(cl);
mRankingAdjustment = in.readInt();
@@ -1977,8 +1977,8 @@ public abstract class NotificationListenerService extends Service {
}
/** @hide */
- public boolean visuallyInterruptive() {
- return mVisuallyInterruptive;
+ public boolean isTextChanged() {
+ return mIsTextChanged;
}
/** @hide */
@@ -2033,7 +2033,7 @@ public abstract class NotificationListenerService extends Service {
int userSentiment, boolean hidden, long lastAudiblyAlertedMs,
boolean noisy, ArrayList<Notification.Action> smartActions,
ArrayList<CharSequence> smartReplies, boolean canBubble,
- boolean visuallyInterruptive, boolean isConversation, ShortcutInfo shortcutInfo,
+ boolean isTextChanged, boolean isConversation, ShortcutInfo shortcutInfo,
int rankingAdjustment, boolean isBubble) {
mKey = key;
mRank = rank;
@@ -2055,7 +2055,7 @@ public abstract class NotificationListenerService extends Service {
mSmartActions = smartActions;
mSmartReplies = smartReplies;
mCanBubble = canBubble;
- mVisuallyInterruptive = visuallyInterruptive;
+ mIsTextChanged = isTextChanged;
mIsConversation = isConversation;
mShortcutInfo = shortcutInfo;
mRankingAdjustment = rankingAdjustment;
@@ -2096,7 +2096,7 @@ public abstract class NotificationListenerService extends Service {
other.mSmartActions,
other.mSmartReplies,
other.mCanBubble,
- other.mVisuallyInterruptive,
+ other.mIsTextChanged,
other.mIsConversation,
other.mShortcutInfo,
other.mRankingAdjustment,
@@ -2153,7 +2153,7 @@ public abstract class NotificationListenerService extends Service {
== (other.mSmartActions == null ? 0 : other.mSmartActions.size()))
&& Objects.equals(mSmartReplies, other.mSmartReplies)
&& Objects.equals(mCanBubble, other.mCanBubble)
- && Objects.equals(mVisuallyInterruptive, other.mVisuallyInterruptive)
+ && Objects.equals(mIsTextChanged, other.mIsTextChanged)
&& Objects.equals(mIsConversation, other.mIsConversation)
// Shortcutinfo doesn't have equals either; use id
&& Objects.equals((mShortcutInfo == null ? 0 : mShortcutInfo.getId()),
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index 05ebbba4e955..8d43f1375a8c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -121,7 +121,7 @@ public class Bubble implements BubbleViewProvider {
@Nullable
private Icon mIcon;
private boolean mIsBubble;
- private boolean mIsVisuallyInterruptive;
+ private boolean mIsTextChanged;
private boolean mIsClearable;
private boolean mShouldSuppressNotificationDot;
private boolean mShouldSuppressNotificationList;
@@ -342,12 +342,12 @@ public class Bubble implements BubbleViewProvider {
}
/**
- * Sets whether this bubble is considered visually interruptive. This method is purely for
+ * Sets whether this bubble is considered text changed. This method is purely for
* testing.
*/
@VisibleForTesting
- void setVisuallyInterruptiveForTest(boolean visuallyInterruptive) {
- mIsVisuallyInterruptive = visuallyInterruptive;
+ void setTextChangedForTest(boolean textChanged) {
+ mIsTextChanged = textChanged;
}
/**
@@ -454,7 +454,7 @@ public class Bubble implements BubbleViewProvider {
mFlyoutMessage = extractFlyoutMessage(entry);
if (entry.getRanking() != null) {
mShortcutInfo = entry.getRanking().getConversationShortcutInfo();
- mIsVisuallyInterruptive = entry.getRanking().visuallyInterruptive();
+ mIsTextChanged = entry.getRanking().isTextChanged();
if (entry.getRanking().getChannel() != null) {
mIsImportantConversation =
entry.getRanking().getChannel().isImportantConversation();
@@ -495,8 +495,8 @@ public class Bubble implements BubbleViewProvider {
return mIcon;
}
- boolean isVisuallyInterruptive() {
- return mIsVisuallyInterruptive;
+ boolean isTextChanged() {
+ return mIsTextChanged;
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index c126f32387f0..b6d65bebff28 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -939,7 +939,7 @@ public class BubbleController {
public void updateBubble(BubbleEntry notif, boolean suppressFlyout, boolean showInShade) {
// If this is an interruptive notif, mark that it's interrupted
mSysuiProxy.setNotificationInterruption(notif.getKey());
- if (!notif.getRanking().visuallyInterruptive()
+ if (!notif.getRanking().isTextChanged()
&& (notif.getBubbleMetadata() != null
&& !notif.getBubbleMetadata().getAutoExpandBubble())
&& mBubbleData.hasOverflowBubbleWithKey(notif.getKey())) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
index bef26bfffef3..519a856538c7 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
@@ -323,7 +323,7 @@ public class BubbleData {
}
mPendingBubbles.remove(bubble.getKey()); // No longer pending once we're here
Bubble prevBubble = getBubbleInStackWithKey(bubble.getKey());
- suppressFlyout |= !bubble.isVisuallyInterruptive();
+ suppressFlyout |= !bubble.isTextChanged();
if (prevBubble == null) {
// Create a new bubble
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
index 091022a139f3..bc701d0c70bc 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
@@ -131,7 +131,7 @@ public class BubbleDataTest extends ShellTestCase {
NotificationListenerService.Ranking ranking =
mock(NotificationListenerService.Ranking.class);
- when(ranking.visuallyInterruptive()).thenReturn(true);
+ when(ranking.isTextChanged()).thenReturn(true);
mEntryInterruptive = createBubbleEntry(1, "interruptive", "package.d", ranking);
mBubbleInterruptive = new Bubble(mEntryInterruptive, mSuppressionListener, null,
mMainExecutor);
@@ -1014,15 +1014,15 @@ public class BubbleDataTest extends ShellTestCase {
}
private void sendUpdatedEntryAtTime(BubbleEntry entry, long postTime) {
- sendUpdatedEntryAtTime(entry, postTime, true /* visuallyInterruptive */);
+ sendUpdatedEntryAtTime(entry, postTime, true /* isTextChanged */);
}
private void sendUpdatedEntryAtTime(BubbleEntry entry, long postTime,
- boolean visuallyInterruptive) {
+ boolean textChanged) {
setPostTime(entry, postTime);
// BubbleController calls this:
Bubble b = mBubbleData.getOrCreateBubble(entry, null /* persistedBubble */);
- b.setVisuallyInterruptiveForTest(visuallyInterruptive);
+ b.setTextChangedForTest(textChanged);
// And then this
mBubbleData.notificationEntryUpdated(b, false /* suppressFlyout*/,
true /* showInShade */);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/RankingBuilder.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/RankingBuilder.java
index ac699f7192c8..045e6f19c667 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/RankingBuilder.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/RankingBuilder.java
@@ -52,7 +52,7 @@ public class RankingBuilder {
private ArrayList<Notification.Action> mSmartActions = new ArrayList<>();
private ArrayList<CharSequence> mSmartReplies = new ArrayList<>();
private boolean mCanBubble = false;
- private boolean mIsVisuallyInterruptive = false;
+ private boolean mIsTextChanged = false;
private boolean mIsConversation = false;
private ShortcutInfo mShortcutInfo = null;
private int mRankingAdjustment = 0;
@@ -81,7 +81,7 @@ public class RankingBuilder {
mSmartActions = copyList(ranking.getSmartActions());
mSmartReplies = copyList(ranking.getSmartReplies());
mCanBubble = ranking.canBubble();
- mIsVisuallyInterruptive = ranking.visuallyInterruptive();
+ mIsTextChanged = ranking.isTextChanged();
mIsConversation = ranking.isConversation();
mShortcutInfo = ranking.getConversationShortcutInfo();
mRankingAdjustment = ranking.getRankingAdjustment();
@@ -110,7 +110,7 @@ public class RankingBuilder {
mSmartActions,
mSmartReplies,
mCanBubble,
- mIsVisuallyInterruptive,
+ mIsTextChanged,
mIsConversation,
mShortcutInfo,
mRankingAdjustment,
@@ -189,8 +189,8 @@ public class RankingBuilder {
return this;
}
- public RankingBuilder setVisuallyInterruptive(boolean interruptive) {
- mIsVisuallyInterruptive = interruptive;
+ public RankingBuilder setTextChanged(boolean textChanged) {
+ mIsTextChanged = textChanged;
return this;
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 7ba0f04a435f..2f550c6e9338 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -7076,7 +7076,6 @@ public class NotificationManagerService extends SystemService {
r.isUpdate = true;
final boolean isInterruptive = isVisuallyInterruptive(old, r);
r.setTextChanged(isInterruptive);
- r.setInterruptive(isInterruptive);
}
mNotificationsByKey.put(n.getKey(), r);
@@ -9424,7 +9423,7 @@ public class NotificationManagerService extends SystemService {
record.getSystemGeneratedSmartActions(),
record.getSmartReplies(),
record.canBubble(),
- record.isInterruptive(),
+ record.isTextChanged(),
record.isConversation(),
record.getShortcutInfo(),
record.getRankingScore() == 0
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index b4ca5118e10f..b6b54fc19011 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -1143,6 +1143,10 @@ public final class NotificationRecord {
return mIsInterruptive;
}
+ public boolean isTextChanged() {
+ return mTextChanged;
+ }
+
/** Returns the time the notification audibly alerted the user. */
public long getLastAudiblyAlertedMs() {
return mLastAudiblyAlertedMs;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
index 577e36c7d5db..a834e2b6cc5a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
@@ -118,7 +118,7 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
assertActionsEqual(getSmartActions(key, i), ranking.getSmartActions());
assertEquals(getSmartReplies(key, i), ranking.getSmartReplies());
assertEquals(canBubble(i), ranking.canBubble());
- assertEquals(visuallyInterruptive(i), ranking.visuallyInterruptive());
+ assertEquals(isTextChanged(i), ranking.isTextChanged());
assertEquals(isConversation(i), ranking.isConversation());
assertEquals(getShortcutInfo(i).getId(), ranking.getConversationShortcutInfo().getId());
assertEquals(getRankingAdjustment(i), ranking.getRankingAdjustment());
@@ -189,7 +189,7 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
(ArrayList) tweak.getSmartActions(),
(ArrayList) tweak.getSmartReplies(),
tweak.canBubble(),
- tweak.visuallyInterruptive(),
+ tweak.isTextChanged(),
tweak.isConversation(),
tweak.getConversationShortcutInfo(),
tweak.getRankingAdjustment(),
@@ -270,7 +270,7 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
getSmartActions(key, i),
getSmartReplies(key, i),
canBubble(i),
- visuallyInterruptive(i),
+ isTextChanged(i),
isConversation(i),
getShortcutInfo(i),
getRankingAdjustment(i),
@@ -379,7 +379,7 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
return index % 4 == 0;
}
- private boolean visuallyInterruptive(int index) {
+ private boolean isTextChanged(int index) {
return index % 4 == 0;
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 1ae219db7726..c493639fc6b1 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -3872,6 +3872,27 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testVisuallyInterruptive_notSeen() throws Exception {
+ NotificationRecord original = generateNotificationRecord(mTestNotificationChannel);
+ mService.addNotification(original);
+
+ StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, original.getSbn().getId(),
+ original.getSbn().getTag(), mUid, 0,
+ new Notification.Builder(mContext, mTestNotificationChannel.getId())
+ .setContentTitle("new title").build(),
+ UserHandle.getUserHandleForUid(mUid), null, 0);
+ NotificationRecord update = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
+ mService.addEnqueuedNotification(update);
+
+ NotificationManagerService.PostNotificationRunnable runnable =
+ mService.new PostNotificationRunnable(update.getKey());
+ runnable.run();
+ waitForIdle();
+
+ assertFalse(update.isInterruptive());
+ }
+
+ @Test
public void testApplyAdjustmentMultiUser() throws Exception {
final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
mService.addNotification(r);