Use app info to load app data instead of component info

Test: manual
Test: atest ControlsUiControllerImplTest
Fixes: 268194168
Change-Id: Icd98df3ec8905330e6e1e6565a1b5ed085a97bbd
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt b/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt
index 860149d..d3174f1 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt
@@ -26,9 +26,10 @@
 import android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE
 import android.content.pm.ResolveInfo
 import android.content.pm.ServiceInfo
+import android.graphics.drawable.Drawable
 import android.os.UserHandle
 import android.service.controls.ControlsProviderService
-import androidx.annotation.VisibleForTesting
+import android.util.IconDrawableFactory
 import androidx.annotation.WorkerThread
 import com.android.settingslib.applications.DefaultAppInfo
 import com.android.systemui.R
@@ -47,7 +48,7 @@
 
     init {
         val metadata = serviceInfo.metaData
-                ?.getString(ControlsProviderService.META_DATA_PANEL_ACTIVITY) ?: ""
+            ?.getString(ControlsProviderService.META_DATA_PANEL_ACTIVITY) ?: ""
         val unflatenned = ComponentName.unflattenFromString(metadata)
         if (unflatenned != null && unflatenned.packageName == componentName.packageName) {
             _panelActivity = unflatenned
@@ -71,21 +72,21 @@
 
     @WorkerThread
     fun resolvePanelActivity(
-            allowAllApps: Boolean = false
+        allowAllApps: Boolean = false
     ) {
         if (resolved) return
         resolved = true
         val validPackages = context.resources
-                .getStringArray(R.array.config_controlsPreferredPackages)
+            .getStringArray(R.array.config_controlsPreferredPackages)
         if (componentName.packageName !in validPackages && !allowAllApps) return
         panelActivity = _panelActivity?.let {
             val resolveInfos = mPm.queryIntentActivitiesAsUser(
-                    Intent().setComponent(it),
-                    PackageManager.ResolveInfoFlags.of(
-                            MATCH_DIRECT_BOOT_AWARE.toLong() or
-                                    MATCH_DIRECT_BOOT_UNAWARE.toLong()
-                    ),
-                    UserHandle.of(userId)
+                Intent().setComponent(it),
+                PackageManager.ResolveInfoFlags.of(
+                    MATCH_DIRECT_BOOT_AWARE.toLong() or
+                            MATCH_DIRECT_BOOT_UNAWARE.toLong()
+                ),
+                UserHandle.of(userId)
             )
             if (resolveInfos.isNotEmpty() && verifyResolveInfo(resolveInfos[0])) {
                 it
@@ -118,6 +119,27 @@
         }
     }
 
+    @WorkerThread
+    override fun loadLabel(): CharSequence {
+        return componentName?.let {
+            val appInfo = mPm.getApplicationInfoAsUser(componentName.packageName, 0, userId)
+            appInfo.loadLabel(mPm)
+        }
+            ?: packageItemInfo?.loadLabel(mPm)
+            ?: throw IllegalArgumentException("Package info is missing")
+    }
+
+    @WorkerThread
+    override fun loadIcon(): Drawable {
+        val packageName =
+            componentName?.packageName
+                ?: packageItemInfo?.packageName
+                ?: throw IllegalArgumentException("Package info is missing")
+        val factory = IconDrawableFactory.newInstance(context)
+        val appInfo = mPm.getApplicationInfoAsUser(packageName, 0, userId)
+        return factory.getBadgedIcon(appInfo)
+    }
+
     override fun equals(other: Any?): Boolean {
         return other is ControlsServiceInfo &&
                 userId == other.userId &&
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt
index 605dc3f..1a620d2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt
@@ -22,6 +22,7 @@
 import android.content.pm.ApplicationInfo
 import android.content.pm.PackageManager
 import android.content.pm.ServiceInfo
+import android.graphics.drawable.Drawable
 import android.os.UserHandle
 import android.service.controls.ControlsProviderService
 import android.testing.AndroidTestingRunner
@@ -69,6 +70,7 @@
 import org.junit.runner.RunWith
 import org.mockito.Mock
 import org.mockito.Mockito.clearInvocations
+import org.mockito.Mockito.doReturn
 import org.mockito.Mockito.never
 import org.mockito.Mockito.spy
 import org.mockito.Mockito.verify
@@ -516,9 +518,9 @@
                 name = componentName.className
             }
         return spy(ControlsServiceInfo(mContext, serviceInfo)).apply {
-            `when`(loadLabel()).thenReturn(label)
-            `when`(loadIcon()).thenReturn(mock())
-            `when`(panelActivity).thenReturn(panelComponentName)
+            doReturn(label).whenever(this).loadLabel()
+            doReturn(mock<Drawable>()).whenever(this).loadIcon()
+            doReturn(panelComponentName).whenever(this).panelActivity
         }
     }