Use app info to load app data instead of component info

Test: manual
Test: atest ControlsUiControllerImplTest
Fixes: 268194168
Change-Id: Icd98df3ec8905330e6e1e6565a1b5ed085a97bbd
This commit is contained in:
Anton Potapov
2023-04-18 17:00:46 +01:00
parent be845d9e60
commit f97f120815
2 changed files with 37 additions and 13 deletions

View File

@@ -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 &&

View File

@@ -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<Drawable>()).whenever(this).loadIcon()
doReturn(panelComponentName).whenever(this).panelActivity
}
}