diff options
9 files changed, 106 insertions, 33 deletions
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index 2c3a5eacf940..e9506c6dcca0 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -67,6 +67,13 @@ flag { } flag { + name: "notifications_redesign_guts" + namespace: "systemui" + description: "Notifications Redesign: Update the look of the notification guts (that appear on long press). This includes using the new cache for app icons." + bug: "394822197" +} + +flag { name: "notification_row_content_binder_refactor" namespace: "systemui" description: "Convert the NotificationContentInflater to Kotlin and restructure it to support modern views" diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.kt index d43cc78e20dc..4c1f4f17e00c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.kt @@ -71,6 +71,10 @@ import com.android.systemui.statusbar.notification.collection.provider.HighPrior import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor import com.android.systemui.statusbar.notification.headsup.HeadsUpManager import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier +import com.android.systemui.statusbar.notification.row.icon.AppIconProvider +import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider +import com.android.systemui.statusbar.notification.row.icon.appIconProvider +import com.android.systemui.statusbar.notification.row.icon.notificationIconStyleProvider import com.android.systemui.statusbar.notification.stack.NotificationListContainer import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.testKosmos @@ -203,6 +207,8 @@ class NotificationGutsManagerTest(flags: FlagsParameterization) : SysuiTestCase( accessibilityManager, highPriorityProvider, iNotificationManager, + kosmos.appIconProvider, + kosmos.notificationIconStyleProvider, userManager, peopleSpaceWidgetManager, launcherApps, @@ -512,6 +518,8 @@ class NotificationGutsManagerTest(flags: FlagsParameterization) : SysuiTestCase( .bindNotification( any<PackageManager>(), any<INotificationManager>(), + any<AppIconProvider>(), + any<NotificationIconStyleProvider>(), eq(onUserInteractionCallback), eq(channelEditorDialogController), eq(statusBarNotification.packageName), @@ -550,6 +558,8 @@ class NotificationGutsManagerTest(flags: FlagsParameterization) : SysuiTestCase( .bindNotification( any<PackageManager>(), any<INotificationManager>(), + any<AppIconProvider>(), + any<NotificationIconStyleProvider>(), eq(onUserInteractionCallback), eq(channelEditorDialogController), eq(statusBarNotification.packageName), @@ -586,6 +596,8 @@ class NotificationGutsManagerTest(flags: FlagsParameterization) : SysuiTestCase( .bindNotification( any<PackageManager>(), any<INotificationManager>(), + any<AppIconProvider>(), + any<NotificationIconStyleProvider>(), eq(onUserInteractionCallback), eq(channelEditorDialogController), eq(statusBarNotification.packageName), diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.kt index 2945fa98caad..96ae07035ed2 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.kt @@ -64,6 +64,10 @@ import com.android.systemui.statusbar.RankingBuilder import com.android.systemui.statusbar.notification.AssistantFeedbackController import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder +import com.android.systemui.statusbar.notification.row.icon.AppIconProvider +import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider +import com.android.systemui.statusbar.notification.row.icon.appIconProvider +import com.android.systemui.statusbar.notification.row.icon.notificationIconStyleProvider import com.android.telecom.telecomManager import com.google.common.truth.Truth.assertThat import java.util.concurrent.CountDownLatch @@ -862,6 +866,8 @@ class NotificationInfoTest : SysuiTestCase() { private fun bindNotification( pm: PackageManager = this.mockPackageManager, iNotificationManager: INotificationManager = this.mockINotificationManager, + appIconProvider: AppIconProvider = kosmos.appIconProvider, + iconStyleProvider: NotificationIconStyleProvider = kosmos.notificationIconStyleProvider, onUserInteractionCallback: OnUserInteractionCallback = this.onUserInteractionCallback, channelEditorDialogController: ChannelEditorDialogController = this.channelEditorDialogController, @@ -882,6 +888,8 @@ class NotificationInfoTest : SysuiTestCase() { underTest.bindNotification( pm, iNotificationManager, + appIconProvider, + iconStyleProvider, onUserInteractionCallback, channelEditorDialogController, pkg, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfoTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfoTest.java index acdbd6237733..5638e0b434aa 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfoTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfoTest.java @@ -48,6 +48,8 @@ import com.android.systemui.res.R; import com.android.systemui.statusbar.notification.AssistantFeedbackController; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; +import com.android.systemui.statusbar.notification.row.icon.AppIconProvider; +import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider; import org.junit.Before; import org.junit.Rule; @@ -57,8 +59,6 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import java.util.concurrent.CountDownLatch; - @SmallTest @RunWith(AndroidJUnit4.class) @TestableLooper.RunWithLooper @@ -82,6 +82,10 @@ public class PromotedNotificationInfoTest extends SysuiTestCase { @Mock private INotificationManager mMockINotificationManager; @Mock + private AppIconProvider mMockAppIconProvider; + @Mock + private NotificationIconStyleProvider mMockIconStyleProvider; + @Mock private PackageManager mMockPackageManager; @Mock private OnUserInteractionCallback mOnUserInteractionCallback; @@ -127,10 +131,11 @@ public class PromotedNotificationInfoTest extends SysuiTestCase { public void testBindNotification_setsOnClickListenerForFeedback() throws Exception { // Bind the notification to the Info object - final CountDownLatch latch = new CountDownLatch(1); mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mMockAppIconProvider, + mMockIconStyleProvider, mOnUserInteractionCallback, mChannelEditorDialogController, TEST_PACKAGE_NAME, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index 430e5e4f1520..6e638f5de209 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -18,22 +18,13 @@ package com.android.systemui.statusbar.notification.row; import static android.app.AppOpsManager.OP_CAMERA; import static android.app.AppOpsManager.OP_RECORD_AUDIO; import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW; -import static android.service.notification.Adjustment.KEY_SUMMARIZATION; -import static android.service.notification.Adjustment.KEY_TYPE; -import static android.service.notification.NotificationAssistantService.ACTION_NOTIFICATION_ASSISTANT_FEEDBACK_SETTINGS; -import static android.service.notification.NotificationAssistantService.EXTRA_NOTIFICATION_ADJUSTMENT; -import static android.service.notification.NotificationAssistantService.EXTRA_NOTIFICATION_KEY; -import android.annotation.FlaggedApi; import android.app.INotificationManager; import android.app.NotificationChannel; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.ActivityInfo; import android.content.pm.LauncherApps; import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.content.pm.ShortcutManager; import android.net.Uri; import android.os.Bundle; @@ -41,7 +32,6 @@ import android.os.Handler; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; -import android.service.notification.NotificationAssistantService; import android.service.notification.StatusBarNotification; import android.util.ArraySet; import android.util.IconDrawableFactory; @@ -81,13 +71,14 @@ import com.android.systemui.statusbar.notification.collection.provider.HighPrior import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewListener; import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewManager; import com.android.systemui.statusbar.notification.headsup.HeadsUpManager; +import com.android.systemui.statusbar.notification.row.icon.AppIconProvider; +import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.wmshell.BubblesManager; -import java.util.List; import java.util.Optional; import javax.inject.Inject; @@ -131,6 +122,8 @@ public class NotificationGutsManager implements NotifGutsViewManager, CoreStarta private final Optional<BubblesManager> mBubblesManagerOptional; private Runnable mOpenRunnable; private final INotificationManager mNotificationManager; + private final AppIconProvider mAppIconProvider; + private final NotificationIconStyleProvider mIconStyleProvider; private final PeopleSpaceWidgetManager mPeopleSpaceWidgetManager; private final UserManager mUserManager; @@ -154,6 +147,8 @@ public class NotificationGutsManager implements NotifGutsViewManager, CoreStarta AccessibilityManager accessibilityManager, HighPriorityProvider highPriorityProvider, INotificationManager notificationManager, + AppIconProvider appIconProvider, + NotificationIconStyleProvider iconStyleProvider, UserManager userManager, PeopleSpaceWidgetManager peopleSpaceWidgetManager, LauncherApps launcherApps, @@ -180,6 +175,8 @@ public class NotificationGutsManager implements NotifGutsViewManager, CoreStarta mAccessibilityManager = accessibilityManager; mHighPriorityProvider = highPriorityProvider; mNotificationManager = notificationManager; + mAppIconProvider = appIconProvider; + mIconStyleProvider = iconStyleProvider; mUserManager = userManager; mPeopleSpaceWidgetManager = peopleSpaceWidgetManager; mLauncherApps = launcherApps; @@ -427,6 +424,8 @@ public class NotificationGutsManager implements NotifGutsViewManager, CoreStarta notificationInfoView.bindNotification( pmUser, mNotificationManager, + mAppIconProvider, + mIconStyleProvider, mOnUserInteractionCallback, mChannelEditorDialogController, packageName, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java index 49b682d0a5d2..661122510c6c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.notification.row; +import static android.app.Flags.notificationsRedesignThemedAppIcons; import static android.app.Notification.EXTRA_BUILDER_APPLICATION_INFO; import static android.app.NotificationChannel.SYSTEM_RESERVED_IDS; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; @@ -25,11 +26,13 @@ import static android.service.notification.Adjustment.KEY_SUMMARIZATION; import static android.service.notification.Adjustment.KEY_TYPE; import static com.android.app.animation.Interpolators.FAST_OUT_SLOW_IN; +import static com.android.systemui.Flags.notificationsRedesignGuts; import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; import android.annotation.Nullable; +import android.annotation.SuppressLint; import android.app.Flags; import android.app.INotificationManager; import android.app.Notification; @@ -70,8 +73,9 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; import com.android.systemui.res.R; import com.android.systemui.statusbar.notification.AssistantFeedbackController; -import com.android.systemui.statusbar.notification.NmSummarizationUiFlag; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.row.icon.AppIconProvider; +import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider; import java.lang.annotation.Retention; import java.util.List; @@ -88,6 +92,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private TextView mAutomaticDescriptionView; private INotificationManager mINotificationManager; + private AppIconProvider mAppIconProvider; + private NotificationIconStyleProvider mIconStyleProvider; private OnUserInteractionCallback mOnUserInteractionCallback; private PackageManager mPm; private MetricsLogger mMetricsLogger; @@ -183,6 +189,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G public void bindNotification( PackageManager pm, INotificationManager iNotificationManager, + AppIconProvider appIconProvider, + NotificationIconStyleProvider iconStyleProvider, OnUserInteractionCallback onUserInteractionCallback, ChannelEditorDialogController channelEditorDialogController, String pkg, @@ -200,6 +208,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G OnClickListener onCloseClick) throws RemoteException { mINotificationManager = iNotificationManager; + mAppIconProvider = appIconProvider; + mIconStyleProvider = iconStyleProvider; mMetricsLogger = metricsLogger; mOnUserInteractionCallback = onUserInteractionCallback; mChannelEditorDialogController = channelEditorDialogController; @@ -290,23 +300,39 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G applyAlertingBehavior(behavior, false /* userTriggered */); } + @SuppressLint("WrongThread") private void bindHeader() { - // Package name mPkgIcon = null; // filled in if missing during notification inflation, which must have happened if // we have a notification to long press on ApplicationInfo info = mSbn.getNotification().extras.getParcelable(EXTRA_BUILDER_APPLICATION_INFO, ApplicationInfo.class); - if (info != null) { - try { - mAppName = String.valueOf(mPm.getApplicationLabel(info)); - mPkgIcon = mPm.getApplicationIcon(info); - } catch (Exception ignored) {} - } - if (mPkgIcon == null) { - // app is gone, just show package name and generic icon - mPkgIcon = mPm.getDefaultActivityIcon(); + if (notificationsRedesignGuts()) { + if (info != null) { + try { + mAppName = String.valueOf(mPm.getApplicationLabel(info)); + // The app icon is likely already in the cache, so let's use it + boolean withWorkProfileBadge = + mIconStyleProvider.shouldShowWorkProfileBadge(mSbn, getContext()); + mPkgIcon = mAppIconProvider.getOrFetchAppIcon(info.packageName, getContext(), + withWorkProfileBadge, + /* themed = */ notificationsRedesignThemedAppIcons()); + } catch (Exception ignored) { + } + } + } else { + if (info != null) { + try { + mAppName = String.valueOf(mPm.getApplicationLabel(info)); + mPkgIcon = mPm.getApplicationIcon(info); + } catch (Exception ignored) { + } + } + if (mPkgIcon == null) { + // app is gone, just show package name and generic icon + mPkgIcon = mPm.getDefaultActivityIcon(); + } } ((ImageView) findViewById(R.id.pkg_icon)).setImageDrawable(mPkgIcon); ((TextView) findViewById(R.id.pkg_name)).setText(mAppName); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfo.java index db25e0889298..6ff711deeb01 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfo.java @@ -31,6 +31,8 @@ import com.android.internal.logging.UiEventLogger; import com.android.systemui.res.R; import com.android.systemui.statusbar.notification.AssistantFeedbackController; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.row.icon.AppIconProvider; +import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider; /** * The guts of a notification revealed when performing a long press, specifically @@ -50,6 +52,8 @@ public class PromotedNotificationInfo extends NotificationInfo { public void bindNotification( PackageManager pm, INotificationManager iNotificationManager, + AppIconProvider appIconProvider, + NotificationIconStyleProvider iconStyleProvider, OnUserInteractionCallback onUserInteractionCallback, ChannelEditorDialogController channelEditorDialogController, String pkg, @@ -64,11 +68,11 @@ public class PromotedNotificationInfo extends NotificationInfo { boolean wasShownHighPriority, AssistantFeedbackController assistantFeedbackController, MetricsLogger metricsLogger, OnClickListener onCloseClick) throws RemoteException { - super.bindNotification(pm, iNotificationManager, onUserInteractionCallback, - channelEditorDialogController, pkg, notificationChannel, entry, onSettingsClick, - onAppSettingsClick, feedbackClickListener, uiEventLogger, isDeviceProvisioned, - isNonblockable, wasShownHighPriority, assistantFeedbackController, metricsLogger, - onCloseClick); + super.bindNotification(pm, iNotificationManager, appIconProvider, iconStyleProvider, + onUserInteractionCallback, channelEditorDialogController, pkg, notificationChannel, + entry, onSettingsClick, onAppSettingsClick, feedbackClickListener, uiEventLogger, + isDeviceProvisioned, isNonblockable, wasShownHighPriority, + assistantFeedbackController, metricsLogger, onCloseClick); mNotificationManager = iNotificationManager; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt index 52a0f6f92355..33d943348cb3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt @@ -58,7 +58,7 @@ interface AppIconProvider { packageName: String, context: Context, withWorkProfileBadge: Boolean = false, - themed: Boolean = true, + themed: Boolean = false, ): Drawable /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt index 1b447525bbf5..3d4c90140adb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt @@ -67,6 +67,8 @@ import com.android.systemui.statusbar.notification.collection.provider.HighPrior import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier +import com.android.systemui.statusbar.notification.row.icon.appIconProvider +import com.android.systemui.statusbar.notification.row.icon.notificationIconStyleProvider import com.android.systemui.statusbar.notification.stack.NotificationListContainer import com.android.systemui.statusbar.notificationLockscreenUserManager import com.android.systemui.statusbar.policy.deviceProvisionedController @@ -128,6 +130,8 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { private val statusBarStateController = kosmos.statusBarStateController private val headsUpManager = kosmos.mockHeadsUpManager private val activityStarter = kosmos.activityStarter + private val appIconProvider = kosmos.appIconProvider + private val iconStyleProvider = kosmos.notificationIconStyleProvider private val userManager = kosmos.userManager private val activeNotificationsInteractor = kosmos.activeNotificationsInteractor private val sceneInteractor = kosmos.sceneInteractor @@ -174,6 +178,8 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { accessibilityManager, highPriorityProvider, notificationManager, + appIconProvider, + iconStyleProvider, userManager, peopleSpaceWidgetManager, launcherApps, @@ -429,6 +435,8 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { .bindNotification( any<PackageManager>(), any<INotificationManager>(), + eq(appIconProvider), + eq(iconStyleProvider), eq(onUserInteractionCallback), eq(channelEditorDialogController), eq(statusBarNotification.packageName), @@ -463,6 +471,8 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { .bindNotification( any<PackageManager>(), any<INotificationManager>(), + eq(appIconProvider), + eq(iconStyleProvider), eq(onUserInteractionCallback), eq(channelEditorDialogController), eq(statusBarNotification.packageName), @@ -497,6 +507,8 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { .bindNotification( any<PackageManager>(), any<INotificationManager>(), + eq(appIconProvider), + eq(iconStyleProvider), eq(onUserInteractionCallback), eq(channelEditorDialogController), eq(statusBarNotification.packageName), @@ -529,8 +541,8 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { .setChannel(testNotificationChannel) .build() row - } catch (e: Exception) { - org.junit.Assert.fail() + } catch (_: Exception) { + Assert.fail() null } } |