Merge "Always use redacted icon for the shelf" into main
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 76e5fd3..a5f42bb 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 @@
  * 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 @@
         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 onRankingApplied() {
+                // rankings affect whether a conversation is important, which can change the icons
+                recalculateForImportantConversationChange()
+            }
         }
 
-        override fun onEntryCleanUp(entry: NotificationEntry) {
-            entry.removeOnSensitivityChangedListener(sensitivityListener)
-        }
-
-        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 @@
      * @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
+    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 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)
+            // 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)
+            // 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
+            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 @@
      * @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 @@
     @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 @@
         }
 
         val icon =
-                (if (showPeopleAvatar) {
-                    createPeopleAvatar(entry)
-                } else {
-                    n.smallIcon
-                }) ?: throw InflationException(
-                        "No icon in notification from " + entry.sbn.packageName)
+            (if (showPeopleAvatar) {
+                createPeopleAvatar(entry)
+            } else {
+                n.smallIcon
+            })
+                ?: throw InflationException("No icon in notification from " + entry.sbn.packageName)
 
-        val ic = StatusBarIcon(
+        val ic =
+            StatusBarIcon(
                 entry.sbn.user,
                 entry.sbn.packageName,
                 icon,
@@ -282,8 +287,8 @@
 
     /**
      * 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 @@
         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 @@
 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 8b99811..a12806b 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 @@
     }
 
     @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)