diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java index f0443892bfaf4..f1b401e77fbc2 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java @@ -16,7 +16,6 @@ package com.android.systemui.bubbles; -import static android.app.Notification.FLAG_BUBBLE; import static android.os.AsyncTask.Status.FINISHED; import static android.view.Display.INVALID_DISPLAY; @@ -28,7 +27,6 @@ import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.content.pm.ApplicationInfo; import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; @@ -57,11 +55,6 @@ import java.util.Objects; class Bubble implements BubbleViewProvider { private static final String TAG = "Bubble"; - /** - * NotificationEntry associated with the bubble. A null value implies this bubble is loaded - * from disk. - */ - @Nullable private NotificationEntry mEntry; private final String mKey; private final String mGroupId; @@ -102,56 +95,18 @@ class Bubble implements BubbleViewProvider { private Bitmap mBadgedImage; private int mDotColor; private Path mDotPath; - private int mFlags; - /** - * Extract GroupId from {@link NotificationEntry}. See also {@link #groupId(ShortcutInfo)}. - */ + public static String groupId(NotificationEntry entry) { UserHandle user = entry.getSbn().getUser(); return user.getIdentifier() + "|" + entry.getSbn().getPackageName(); } - /** - * Extract GroupId from {@link ShortcutInfo}. This should match the one generated from - * {@link NotificationEntry}. See also {@link #groupId(NotificationEntry)}. - */ - @NonNull - public static String groupId(@NonNull final ShortcutInfo shortcutInfo) { - return shortcutInfo.getUserId() + "|" + shortcutInfo.getPackage(); - } - - /** - * Generate a unique identifier for this bubble based on given {@link NotificationEntry}. If - * {@link ShortcutInfo} was found in the notification entry, the identifier would be generated - * from {@link ShortcutInfo} instead. See also {@link #key(ShortcutInfo)}. - */ - @NonNull - public static String key(@NonNull final NotificationEntry entry) { - final ShortcutInfo shortcutInfo = entry.getRanking().getShortcutInfo(); - if (shortcutInfo != null) return key(shortcutInfo); - return entry.getKey(); - } - - /** - * Generate a unique identifier for this bubble based on given {@link ShortcutInfo}. - * See also {@link #key(NotificationEntry)}. - */ - @NonNull - public static String key(@NonNull final ShortcutInfo shortcutInfo) { - return shortcutInfo.getUserId() + "|" + shortcutInfo.getPackage() + "|" - + shortcutInfo.getId(); - } - - /** - * Create a bubble with limited information based on given {@link ShortcutInfo}. - * Note: Currently this is only being used when the bubble is persisted to disk. - */ + // TODO: Decouple Bubble from NotificationEntry and transform ShortcutInfo into Bubble Bubble(ShortcutInfo shortcutInfo) { mShortcutInfo = shortcutInfo; - mKey = key(shortcutInfo); - mGroupId = groupId(shortcutInfo); - mFlags = 0; + mKey = shortcutInfo.getId(); + mGroupId = shortcutInfo.getId(); } /** Used in tests when no UI is required. */ @@ -159,11 +114,10 @@ class Bubble implements BubbleViewProvider { Bubble(NotificationEntry e, BubbleController.NotificationSuppressionChangedListener listener) { mEntry = e; - mKey = key(e); + mKey = e.getKey(); mLastUpdated = e.getSbn().getPostTime(); mGroupId = groupId(e); mSuppressionListener = listener; - mFlags = e.getSbn().getNotification().flags; } @Override @@ -171,26 +125,16 @@ class Bubble implements BubbleViewProvider { return mKey; } - @Nullable public NotificationEntry getEntry() { return mEntry; } - @Nullable - public UserHandle getUser() { - if (mEntry != null) return mEntry.getSbn().getUser(); - if (mShortcutInfo != null) return mShortcutInfo.getUserHandle(); - return null; - } - public String getGroupId() { return mGroupId; } public String getPackageName() { - return mEntry == null - ? mShortcutInfo == null ? null : mShortcutInfo.getPackage() - : mEntry.getSbn().getPackageName(); + return mEntry.getSbn().getPackageName(); } @Override @@ -274,8 +218,7 @@ class Bubble implements BubbleViewProvider { void inflate(BubbleViewInfoTask.Callback callback, Context context, BubbleStackView stackView, - BubbleIconFactory iconFactory, - boolean skipInflation) { + BubbleIconFactory iconFactory) { if (isBubbleLoading()) { mInflationTask.cancel(true /* mayInterruptIfRunning */); } @@ -283,7 +226,6 @@ class Bubble implements BubbleViewProvider { context, stackView, iconFactory, - skipInflation, callback); if (mInflateSynchronously) { mInflationTask.onPostExecute(mInflationTask.doInBackground()); @@ -403,7 +345,6 @@ class Bubble implements BubbleViewProvider { * Whether this notification should be shown in the shade. */ boolean showInShade() { - if (mEntry == null) return false; return !shouldSuppressNotification() || !mEntry.isClearable(); } @@ -411,8 +352,8 @@ class Bubble implements BubbleViewProvider { * Sets whether this notification should be suppressed in the shade. */ void setSuppressNotification(boolean suppressNotification) { - if (mEntry == null) return; boolean prevShowInShade = showInShade(); + Notification.BubbleMetadata data = mEntry.getBubbleMetadata(); int flags = data.getFlags(); if (suppressNotification) { @@ -443,7 +384,6 @@ class Bubble implements BubbleViewProvider { */ @Override public boolean showDot() { - if (mEntry == null) return false; return mShowBubbleUpdateDot && !mEntry.shouldSuppressNotificationDot() && !shouldSuppressNotification(); @@ -453,7 +393,6 @@ class Bubble implements BubbleViewProvider { * Whether the flyout for the bubble should be shown. */ boolean showFlyout() { - if (mEntry == null) return false; return !mSuppressFlyout && !mEntry.shouldSuppressPeek() && !shouldSuppressNotification() && !mEntry.shouldSuppressNotificationList(); @@ -477,13 +416,11 @@ class Bubble implements BubbleViewProvider { * is an ongoing bubble. */ boolean isOngoing() { - if (mEntry == null) return false; int flags = mEntry.getSbn().getNotification().flags; return (flags & Notification.FLAG_FOREGROUND_SERVICE) != 0; } float getDesiredHeight(Context context) { - if (mEntry == null) return 0; Notification.BubbleMetadata data = mEntry.getBubbleMetadata(); boolean useRes = data.getDesiredHeightResId() != 0; if (useRes) { @@ -497,7 +434,6 @@ class Bubble implements BubbleViewProvider { } String getDesiredHeightString() { - if (mEntry == null) return String.valueOf(0); Notification.BubbleMetadata data = mEntry.getBubbleMetadata(); boolean useRes = data.getDesiredHeightResId() != 0; if (useRes) { @@ -514,13 +450,11 @@ class Bubble implements BubbleViewProvider { * To populate the icon use {@link LauncherApps#getShortcutIconDrawable(ShortcutInfo, int)}. */ boolean usingShortcutInfo() { - return mEntry != null && mEntry.getBubbleMetadata().getShortcutId() != null - || mShortcutInfo != null; + return mEntry.getBubbleMetadata().getShortcutId() != null; } @Nullable PendingIntent getBubbleIntent() { - if (mEntry == null) return null; Notification.BubbleMetadata data = mEntry.getBubbleMetadata(); if (data != null) { return data.getIntent(); @@ -528,32 +462,16 @@ class Bubble implements BubbleViewProvider { return null; } - Intent getSettingsIntent(final Context context) { + Intent getSettingsIntent() { final Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_BUBBLE_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); - final int uid = getUid(context); - if (uid != -1) { - intent.putExtra(Settings.EXTRA_APP_UID, uid); - } + intent.putExtra(Settings.EXTRA_APP_UID, mEntry.getSbn().getUid()); intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); return intent; } - private int getUid(final Context context) { - if (mEntry != null) return mEntry.getSbn().getUid(); - final PackageManager pm = context.getPackageManager(); - if (pm == null) return -1; - try { - final ApplicationInfo info = pm.getApplicationInfo(mShortcutInfo.getPackage(), 0); - return info.uid; - } catch (PackageManager.NameNotFoundException e) { - Log.e(TAG, "cannot find uid", e); - } - return -1; - } - private int getDimenForPackageUser(Context context, int resId, String pkg, int userId) { PackageManager pm = context.getPackageManager(); Resources r; @@ -575,30 +493,15 @@ class Bubble implements BubbleViewProvider { } private boolean shouldSuppressNotification() { - if (mEntry == null) return false; return mEntry.getBubbleMetadata() != null && mEntry.getBubbleMetadata().isNotificationSuppressed(); } boolean shouldAutoExpand() { - if (mEntry == null) return false; Notification.BubbleMetadata metadata = mEntry.getBubbleMetadata(); return metadata != null && metadata.getAutoExpandBubble(); } - public boolean isBubble() { - if (mEntry == null) return (mFlags & FLAG_BUBBLE) != 0; - return (mEntry.getSbn().getNotification().flags & FLAG_BUBBLE) != 0; - } - - public void enable(int option) { - mFlags |= option; - } - - public void disable(int option) { - mFlags &= ~option; - } - @Override public String toString() { return "Bubble{" + mKey + '}'; diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 8707d389858bc..a578f337cca27 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -42,7 +42,6 @@ import static java.lang.annotation.ElementType.LOCAL_VARIABLE; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.SOURCE; -import android.annotation.NonNull; import android.annotation.UserIdInt; import android.app.ActivityManager.RunningTaskInfo; import android.app.INotificationManager; @@ -243,7 +242,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi * This can happen when an app cancels a bubbled notification or when the user dismisses a * bubble. */ - void removeNotification(@NonNull NotificationEntry entry, int reason); + void removeNotification(NotificationEntry entry, int reason); /** * Called when a bubbled notification has changed whether it should be @@ -259,7 +258,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi * removes all remnants of the group's summary from the notification pipeline. * TODO: (b/145659174) Only old pipeline needs this - delete post-migration. */ - void maybeCancelSummary(@NonNull NotificationEntry entry); + void maybeCancelSummary(NotificationEntry entry); } /** @@ -482,7 +481,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi addNotifCallback(new NotifCallback() { @Override - public void removeNotification(@NonNull final NotificationEntry entry, int reason) { + public void removeNotification(NotificationEntry entry, int reason) { mNotificationEntryManager.performRemoveNotification(entry.getSbn(), reason); } @@ -493,7 +492,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } @Override - public void maybeCancelSummary(@NonNull final NotificationEntry entry) { + public void maybeCancelSummary(NotificationEntry entry) { // Check if removed bubble has an associated suppressed group summary that needs // to be removed now. final String groupKey = entry.getSbn().getGroupKey(); @@ -702,12 +701,10 @@ public class BubbleController implements ConfigurationController.ConfigurationLi mBubbleIconFactory = new BubbleIconFactory(mContext); // Reload each bubble for (Bubble b: mBubbleData.getBubbles()) { - b.inflate(null /* callback */, mContext, mStackView, mBubbleIconFactory, - false /* skipInflation */); + b.inflate(null /* callback */, mContext, mStackView, mBubbleIconFactory); } for (Bubble b: mBubbleData.getOverflowBubbles()) { - b.inflate(null /* callback */, mContext, mStackView, mBubbleIconFactory, - false /* skipInflation */); + b.inflate(null /* callback */, mContext, mStackView, mBubbleIconFactory); } } @@ -806,7 +803,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi if (bubble != null) { mBubbleData.promoteBubbleFromOverflow(bubble, mStackView, mBubbleIconFactory); } - } else if (bubble.isBubble()) { + } else if (bubble.getEntry().isBubble()){ mBubbleData.setSelectedBubble(bubble); } mBubbleData.setExpanded(true); @@ -835,33 +832,10 @@ public class BubbleController implements ConfigurationController.ConfigurationLi updateBubble(notif, suppressFlyout, true /* showInShade */); } - /** - * Fills the overflow bubbles by loading them from disk. - */ - void loadOverflowBubblesFromDisk() { - if (!mBubbleData.getOverflowBubbles().isEmpty()) { - // we don't need to load overflow bubbles from disk if it is already in memory - return; - } - mDataRepository.loadBubbles((bubbles) -> { - bubbles.forEach(bubble -> { - if (mBubbleData.getBubbles().contains(bubble)) { - // if the bubble is already active, there's no need to push it to overflow - return; - } - bubble.inflate((b) -> mBubbleData.overflowBubble(DISMISS_AGED, bubble), - mContext, mStackView, mBubbleIconFactory, true /* skipInflation */); - }); - return null; - }); - } - void updateBubble(NotificationEntry notif, boolean suppressFlyout, boolean showInShade) { if (mStackView == null) { // Lazy init stack view when a bubble is created ensureStackViewCreated(); - // Lazy load overflow bubbles from disk - loadOverflowBubblesFromDisk(); } // If this is an interruptive notif, mark that it's interrupted if (notif.getImportance() >= NotificationManager.IMPORTANCE_HIGH) { @@ -881,11 +855,11 @@ public class BubbleController implements ConfigurationController.ConfigurationLi return; } mHandler.post( - () -> removeBubble(bubble.getKey(), + () -> removeBubble(bubble.getEntry(), BubbleController.DISMISS_INVALID_INTENT)); }); }, - mContext, mStackView, mBubbleIconFactory, false /* skipInflation */); + mContext, mStackView, mBubbleIconFactory); } /** @@ -897,10 +871,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi * @param entry the notification to change bubble state for. * @param shouldBubble whether the notification should show as a bubble or not. */ - public void onUserChangedBubble(@Nullable final NotificationEntry entry, boolean shouldBubble) { - if (entry == null) { - return; - } + public void onUserChangedBubble(NotificationEntry entry, boolean shouldBubble) { NotificationChannel channel = entry.getChannel(); final String appPkg = entry.getSbn().getPackageName(); final int appUid = entry.getSbn().getUid(); @@ -939,14 +910,14 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } /** - * Removes the bubble with the given key. + * Removes the bubble with the given NotificationEntry. *
* Must be called from the main thread.
*/
@MainThread
- void removeBubble(String key, int reason) {
- if (mBubbleData.hasAnyBubbleWithKey(key)) {
- mBubbleData.notificationEntryRemoved(key, reason);
+ void removeBubble(NotificationEntry entry, int reason) {
+ if (mBubbleData.hasAnyBubbleWithKey(entry.getKey())) {
+ mBubbleData.notificationEntryRemoved(entry, reason);
}
}
@@ -962,7 +933,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
&& canLaunchInActivityView(mContext, entry);
if (!shouldBubble && mBubbleData.hasAnyBubbleWithKey(entry.getKey())) {
// It was previously a bubble but no longer a bubble -- lets remove it
- removeBubble(entry.getKey(), DISMISS_NO_LONGER_BUBBLE);
+ removeBubble(entry, DISMISS_NO_LONGER_BUBBLE);
} else if (shouldBubble) {
updateBubble(entry);
}
@@ -976,10 +947,10 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
// Remove any associated bubble children with the summary
final List