diff options
2 files changed, 111 insertions, 91 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt index 76e5fd3bd4f2..a5f42bb99e10 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt @@ -45,10 +45,12 @@ import javax.inject.Inject * icons and keeping the icon assets themselves up to date as notifications change. * * TODO: Much of this code was copied whole-sale in order to get it out of NotificationEntry. - * Long-term, it should probably live somewhere in the content inflation pipeline. + * Long-term, it should probably live somewhere in the content inflation pipeline. */ @SysUISingleton -class IconManager @Inject constructor( +class IconManager +@Inject +constructor( private val notifCollection: CommonNotifCollection, private val launcherApps: LauncherApps, private val iconBuilder: IconBuilder @@ -59,30 +61,30 @@ class IconManager @Inject constructor( notifCollection.addCollectionListener(entryListener) } - private val entryListener = object : NotifCollectionListener { - override fun onEntryInit(entry: NotificationEntry) { - entry.addOnSensitivityChangedListener(sensitivityListener) - } + private val entryListener = + object : NotifCollectionListener { + override fun onEntryInit(entry: NotificationEntry) { + entry.addOnSensitivityChangedListener(sensitivityListener) + } - override fun onEntryCleanUp(entry: NotificationEntry) { - entry.removeOnSensitivityChangedListener(sensitivityListener) - } + override fun onEntryCleanUp(entry: NotificationEntry) { + entry.removeOnSensitivityChangedListener(sensitivityListener) + } - override fun onRankingApplied() { - // rankings affect whether a conversation is important, which can change the icons - recalculateForImportantConversationChange() + override fun onRankingApplied() { + // rankings affect whether a conversation is important, which can change the icons + recalculateForImportantConversationChange() + } } - } - private val sensitivityListener = NotificationEntry.OnSensitivityChangedListener { - entry -> updateIconsSafe(entry) - } + private val sensitivityListener = + NotificationEntry.OnSensitivityChangedListener { entry -> updateIconsSafe(entry) } private fun recalculateForImportantConversationChange() { for (entry in notifCollection.allNotifs) { val isImportant = isImportantConversation(entry) - if (entry.icons.areIconsAvailable && - isImportant != entry.icons.isImportantConversation + if ( + entry.icons.areIconsAvailable && isImportant != entry.icons.isImportantConversation ) { updateIconsSafe(entry) } @@ -97,34 +99,35 @@ class IconManager @Inject constructor( * @throws InflationException Exception if required icons are not valid or specified */ @Throws(InflationException::class) - fun createIcons(entry: NotificationEntry) = traceSection("IconManager.createIcons") { - // Construct the status bar icon view. - val sbIcon = iconBuilder.createIconView(entry) - sbIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE - - // Construct the shelf icon view. - val shelfIcon = iconBuilder.createIconView(entry) - shelfIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE - shelfIcon.visibility = View.INVISIBLE - - // Construct the aod icon view. - val aodIcon = iconBuilder.createIconView(entry) - aodIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE - aodIcon.setIncreasedSize(true) - - // Set the icon views' icons - val (normalIconDescriptor, sensitiveIconDescriptor) = getIconDescriptors(entry) - - try { - setIcon(entry, normalIconDescriptor, sbIcon) - setIcon(entry, sensitiveIconDescriptor, shelfIcon) - setIcon(entry, sensitiveIconDescriptor, aodIcon) - entry.icons = IconPack.buildPack(sbIcon, shelfIcon, aodIcon, entry.icons) - } catch (e: InflationException) { - entry.icons = IconPack.buildEmptyPack(entry.icons) - throw e + fun createIcons(entry: NotificationEntry) = + traceSection("IconManager.createIcons") { + // Construct the status bar icon view. + val sbIcon = iconBuilder.createIconView(entry) + sbIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE + + // Construct the shelf icon view. + val shelfIcon = iconBuilder.createIconView(entry) + shelfIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE + shelfIcon.visibility = View.INVISIBLE + + // Construct the aod icon view. + val aodIcon = iconBuilder.createIconView(entry) + aodIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE + aodIcon.setIncreasedSize(true) + + // Set the icon views' icons + val (normalIconDescriptor, sensitiveIconDescriptor) = getIconDescriptors(entry) + + try { + setIcon(entry, normalIconDescriptor, sbIcon) + setIcon(entry, sensitiveIconDescriptor, shelfIcon) + setIcon(entry, sensitiveIconDescriptor, aodIcon) + entry.icons = IconPack.buildPack(sbIcon, shelfIcon, aodIcon, entry.icons) + } catch (e: InflationException) { + entry.icons = IconPack.buildEmptyPack(entry.icons) + throw e + } } - } /** * Update the notification icons. @@ -133,33 +136,33 @@ class IconManager @Inject constructor( * @throws InflationException Exception if required icons are not valid or specified */ @Throws(InflationException::class) - fun updateIcons(entry: NotificationEntry) = traceSection("IconManager.updateIcons") { - if (!entry.icons.areIconsAvailable) { - return@traceSection - } - entry.icons.smallIconDescriptor = null - entry.icons.peopleAvatarDescriptor = null + fun updateIcons(entry: NotificationEntry) = + traceSection("IconManager.updateIcons") { + if (!entry.icons.areIconsAvailable) { + return@traceSection + } + entry.icons.smallIconDescriptor = null + entry.icons.peopleAvatarDescriptor = null - val (normalIconDescriptor, sensitiveIconDescriptor) = getIconDescriptors(entry) - val notificationContentDescription = entry.sbn.notification?.let { - iconBuilder.getIconContentDescription(it) - } + val (normalIconDescriptor, sensitiveIconDescriptor) = getIconDescriptors(entry) + val notificationContentDescription = + entry.sbn.notification?.let { iconBuilder.getIconContentDescription(it) } - entry.icons.statusBarIcon?.let { - it.setNotification(entry.sbn, notificationContentDescription) - setIcon(entry, normalIconDescriptor, it) - } + entry.icons.statusBarIcon?.let { + it.setNotification(entry.sbn, notificationContentDescription) + setIcon(entry, normalIconDescriptor, it) + } - entry.icons.shelfIcon?.let { - it.setNotification(entry.sbn, notificationContentDescription) - setIcon(entry, normalIconDescriptor, it) - } + entry.icons.shelfIcon?.let { + it.setNotification(entry.sbn, notificationContentDescription) + setIcon(entry, sensitiveIconDescriptor, it) + } - entry.icons.aodIcon?.let { - it.setNotification(entry.sbn, notificationContentDescription) - setIcon(entry, sensitiveIconDescriptor, it) + entry.icons.aodIcon?.let { + it.setNotification(entry.sbn, notificationContentDescription) + setIcon(entry, sensitiveIconDescriptor, it) + } } - } private fun updateIconsSafe(entry: NotificationEntry) { try { @@ -173,11 +176,12 @@ class IconManager @Inject constructor( @Throws(InflationException::class) private fun getIconDescriptors(entry: NotificationEntry): Pair<StatusBarIcon, StatusBarIcon> { val iconDescriptor = getIconDescriptor(entry, redact = false) - val sensitiveDescriptor = if (entry.isSensitive) { - getIconDescriptor(entry, redact = true) - } else { - iconDescriptor - } + val sensitiveDescriptor = + if (entry.isSensitive) { + getIconDescriptor(entry, redact = true) + } else { + iconDescriptor + } return Pair(iconDescriptor, sensitiveDescriptor) } @@ -197,14 +201,15 @@ class IconManager @Inject constructor( } val icon = - (if (showPeopleAvatar) { - createPeopleAvatar(entry) - } else { - n.smallIcon - }) ?: throw InflationException( - "No icon in notification from " + entry.sbn.packageName) - - val ic = StatusBarIcon( + (if (showPeopleAvatar) { + createPeopleAvatar(entry) + } else { + n.smallIcon + }) + ?: throw InflationException("No icon in notification from " + entry.sbn.packageName) + + val ic = + StatusBarIcon( entry.sbn.user, entry.sbn.packageName, icon, @@ -282,8 +287,8 @@ class IconManager @Inject constructor( /** * Determines if this icon shows a conversation based on the sensitivity of the icon, its - * context and the user's indicated sensitivity preference. If we're using a fall back icon - * of the small icon, we don't consider this to be showing a conversation + * context and the user's indicated sensitivity preference. If we're using a fall back icon of + * the small icon, we don't consider this to be showing a conversation * * @param iconView The icon that shows the conversation. */ @@ -293,19 +298,20 @@ class IconManager @Inject constructor( iconDescriptor: StatusBarIcon ): Boolean { val usedInSensitiveContext = - iconView === entry.icons.shelfIcon || iconView === entry.icons.aodIcon + iconView === entry.icons.shelfIcon || iconView === entry.icons.aodIcon val isSmallIcon = iconDescriptor.icon.equals(entry.sbn.notification.smallIcon) - return isImportantConversation(entry) && !isSmallIcon && - (!usedInSensitiveContext || !entry.isSensitive) + return isImportantConversation(entry) && + !isSmallIcon && + (!usedInSensitiveContext || !entry.isSensitive) } private fun isImportantConversation(entry: NotificationEntry): Boolean { // Also verify that the Notification is MessagingStyle, since we're going to access // MessagingStyle-specific data (EXTRA_MESSAGES, EXTRA_MESSAGING_PERSON). return entry.ranking.channel != null && - entry.ranking.channel.isImportantConversation && - entry.sbn.notification.isStyle(MessagingStyle::class.java) && - entry.key !in unimportantConversationKeys + entry.ranking.channel.isImportantConversation && + entry.sbn.notification.isStyle(MessagingStyle::class.java) && + entry.key !in unimportantConversationKeys } override fun setUnimportantConversations(keys: Collection<String>) { @@ -323,8 +329,8 @@ private const val TAG = "IconManager" interface ConversationIconManager { /** * Sets the complete current set of notification keys which should (for the purposes of icon - * presentation) be considered unimportant. This tells the icon manager to remove the avatar - * of a group from which the priority notification has been removed. + * presentation) be considered unimportant. This tells the icon manager to remove the avatar of + * a group from which the priority notification has been removed. */ fun setUnimportantConversations(keys: Collection<String>) -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/IconManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/IconManagerTest.kt index 8b99811e3d5f..a12806b9cc99 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/IconManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/IconManagerTest.kt @@ -167,6 +167,20 @@ class IconManagerTest : SysuiTestCase() { } @Test + fun testUpdateIcons_sensitiveImportantConversation() { + val entry = + notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = false) + entry?.setSensitive(true, true) + entry?.channel?.isImportantConversation = true + entry?.let { iconManager.createIcons(it) } + // Updating the icons after creation shouldn't break anything + entry?.let { iconManager.updateIcons(it) } + assertThat(entry?.icons?.statusBarIcon?.sourceIcon).isEqualTo(shortcutIc) + assertThat(entry?.icons?.shelfIcon?.sourceIcon).isEqualTo(smallIc) + assertThat(entry?.icons?.aodIcon?.sourceIcon).isEqualTo(smallIc) + } + + @Test fun testUpdateIcons_sensitivityChange() { val entry = notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = false) |