From f97f1208150c70449c7fd04a335796ef587ad17e Mon Sep 17 00:00:00 2001 From: Anton Potapov Date: Tue, 18 Apr 2023 17:00:46 +0100 Subject: [PATCH] Use app info to load app data instead of component info Test: manual Test: atest ControlsUiControllerImplTest Fixes: 268194168 Change-Id: Icd98df3ec8905330e6e1e6565a1b5ed085a97bbd --- .../systemui/controls/ControlsServiceInfo.kt | 42 ++++++++++++++----- .../ui/ControlsUiControllerImplTest.kt | 8 ++-- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt b/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt index 860149d8acee5..d3174f11ace52 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_AWARE 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 @@ open class ControlsServiceInfo( 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 @@ open class ControlsServiceInfo( @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 @@ open class ControlsServiceInfo( } } + @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 605dc3f2e90af..1a620d266e420 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.Context 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.Test 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 @@ class ControlsUiControllerImplTest : SysuiTestCase() { 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()).whenever(this).loadIcon() + doReturn(panelComponentName).whenever(this).panelActivity } }