Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoader.kt +17 −4 Original line number Diff line number Diff line Loading @@ -20,9 +20,11 @@ import android.app.ActivityManager.RunningTaskInfo import android.content.Context import android.content.pm.ActivityInfo import android.content.pm.PackageManager import android.content.pm.PackageManager.NameNotFoundException import android.graphics.Bitmap import android.os.LocaleList import android.os.UserHandle import android.util.Slog import androidx.tracing.Trace import com.android.internal.annotations.VisibleForTesting import com.android.launcher3.icons.BaseIconFactory Loading Loading @@ -113,7 +115,6 @@ class WindowDecorTaskResourceLoader( return cachedResources.appName } val resources = loadAppResources(taskInfo) taskToResourceCache[taskInfo.taskId] = resources localeListOnCache[taskInfo.taskId] = taskInfo.getConfiguration().getLocales() return resources.appName } Loading @@ -127,7 +128,6 @@ class WindowDecorTaskResourceLoader( return cachedResources.appIcon } val resources = loadAppResources(taskInfo) taskToResourceCache[taskInfo.taskId] = resources localeListOnCache[taskInfo.taskId] = taskInfo.getConfiguration().getLocales() return resources.appIcon } Loading @@ -141,7 +141,6 @@ class WindowDecorTaskResourceLoader( return cachedResources.veilIcon } val resources = loadAppResources(taskInfo) taskToResourceCache[taskInfo.taskId] = resources localeListOnCache[taskInfo.taskId] = taskInfo.getConfiguration().getLocales() return resources.veilIcon } Loading Loading @@ -178,7 +177,21 @@ class WindowDecorTaskResourceLoader( val badgedAppIconDrawable = pm.getUserBadgedIcon(appIconDrawable, taskInfo.userHandle()) val appIcon = headerIconFactory.createIconBitmap(badgedAppIconDrawable, /* scale= */ 1f) val veilIcon = veilIconFactory.createScaledBitmap(appIconDrawable, MODE_DEFAULT) return AppResources(appName = appName, appIcon = appIcon, veilIcon = veilIcon) val appResources = AppResources(appName = appName, appIcon = appIcon, veilIcon = veilIcon) taskToResourceCache[taskInfo.taskId] = appResources return appResources } catch (e: NameNotFoundException) { Slog.e(TAG, "Failed to get app resources") val pm = userProfilesContexts .getOrCreate(taskInfo.userId) .packageManager val defaultIconDrawable = pm.getDefaultActivityIcon() val appIcon = headerIconFactory.createIconBitmap(defaultIconDrawable, /* scale= */ 1f) val veilIcon = veilIconFactory.createScaledBitmap(defaultIconDrawable, MODE_DEFAULT) // Do not cache the result when loading failed. return AppResources(appName = "", appIcon = appIcon, veilIcon = veilIcon) } finally { Trace.endSection() } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoaderTest.kt +24 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Intent import android.content.pm.ActivityInfo import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.content.pm.PackageManager.NameNotFoundException import android.graphics.drawable.Drawable import android.os.LocaleList import android.os.UserHandle Loading Loading @@ -50,6 +51,7 @@ import org.mockito.ArgumentMatchers.anyInt import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doReturn import org.mockito.kotlin.doThrow import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.spy Loading Loading @@ -211,6 +213,28 @@ class WindowDecorTaskResourceLoaderTest : ShellTestCase() { assertThrows(Exception::class.java) { loader.getName(task) } } @Test fun testGet_nonexistentPackage_returnsDefaultAndDontCache() { val componentName = ComponentName("com.foo", "BarActivity") val appIconDrawable = mock<Drawable>() val task = TestRunningTaskInfoBuilder() .setUserId(context.userId) .setBaseIntent(Intent().apply { component = componentName }) .build() loader.onWindowDecorCreated(task) doReturn(appIconDrawable).whenever(mockPackageManager).getDefaultActivityIcon() whenever(mockHeaderIconFactory.createIconBitmap(appIconDrawable, 1f)) .thenReturn(mock()) whenever(mockVeilIconFactory.createScaledBitmap(appIconDrawable, MODE_DEFAULT)) .thenReturn(mock()) doThrow(NameNotFoundException()).whenever(mockPackageManager).getActivityInfo(eq(componentName), anyInt()) loader.getVeilIcon(task) verify(mockVeilIconFactory).createScaledBitmap(appIconDrawable, MODE_DEFAULT) assertThat(loader.taskToResourceCache[task.taskId]).isNull() } private fun createTaskInfo(userId: Int): ActivityManager.RunningTaskInfo { val appIconDrawable = mock<Drawable>() val badgedAppIconDrawable = mock<Drawable>() Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoader.kt +17 −4 Original line number Diff line number Diff line Loading @@ -20,9 +20,11 @@ import android.app.ActivityManager.RunningTaskInfo import android.content.Context import android.content.pm.ActivityInfo import android.content.pm.PackageManager import android.content.pm.PackageManager.NameNotFoundException import android.graphics.Bitmap import android.os.LocaleList import android.os.UserHandle import android.util.Slog import androidx.tracing.Trace import com.android.internal.annotations.VisibleForTesting import com.android.launcher3.icons.BaseIconFactory Loading Loading @@ -113,7 +115,6 @@ class WindowDecorTaskResourceLoader( return cachedResources.appName } val resources = loadAppResources(taskInfo) taskToResourceCache[taskInfo.taskId] = resources localeListOnCache[taskInfo.taskId] = taskInfo.getConfiguration().getLocales() return resources.appName } Loading @@ -127,7 +128,6 @@ class WindowDecorTaskResourceLoader( return cachedResources.appIcon } val resources = loadAppResources(taskInfo) taskToResourceCache[taskInfo.taskId] = resources localeListOnCache[taskInfo.taskId] = taskInfo.getConfiguration().getLocales() return resources.appIcon } Loading @@ -141,7 +141,6 @@ class WindowDecorTaskResourceLoader( return cachedResources.veilIcon } val resources = loadAppResources(taskInfo) taskToResourceCache[taskInfo.taskId] = resources localeListOnCache[taskInfo.taskId] = taskInfo.getConfiguration().getLocales() return resources.veilIcon } Loading Loading @@ -178,7 +177,21 @@ class WindowDecorTaskResourceLoader( val badgedAppIconDrawable = pm.getUserBadgedIcon(appIconDrawable, taskInfo.userHandle()) val appIcon = headerIconFactory.createIconBitmap(badgedAppIconDrawable, /* scale= */ 1f) val veilIcon = veilIconFactory.createScaledBitmap(appIconDrawable, MODE_DEFAULT) return AppResources(appName = appName, appIcon = appIcon, veilIcon = veilIcon) val appResources = AppResources(appName = appName, appIcon = appIcon, veilIcon = veilIcon) taskToResourceCache[taskInfo.taskId] = appResources return appResources } catch (e: NameNotFoundException) { Slog.e(TAG, "Failed to get app resources") val pm = userProfilesContexts .getOrCreate(taskInfo.userId) .packageManager val defaultIconDrawable = pm.getDefaultActivityIcon() val appIcon = headerIconFactory.createIconBitmap(defaultIconDrawable, /* scale= */ 1f) val veilIcon = veilIconFactory.createScaledBitmap(defaultIconDrawable, MODE_DEFAULT) // Do not cache the result when loading failed. return AppResources(appName = "", appIcon = appIcon, veilIcon = veilIcon) } finally { Trace.endSection() } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/common/WindowDecorTaskResourceLoaderTest.kt +24 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Intent import android.content.pm.ActivityInfo import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.content.pm.PackageManager.NameNotFoundException import android.graphics.drawable.Drawable import android.os.LocaleList import android.os.UserHandle Loading Loading @@ -50,6 +51,7 @@ import org.mockito.ArgumentMatchers.anyInt import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doReturn import org.mockito.kotlin.doThrow import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.spy Loading Loading @@ -211,6 +213,28 @@ class WindowDecorTaskResourceLoaderTest : ShellTestCase() { assertThrows(Exception::class.java) { loader.getName(task) } } @Test fun testGet_nonexistentPackage_returnsDefaultAndDontCache() { val componentName = ComponentName("com.foo", "BarActivity") val appIconDrawable = mock<Drawable>() val task = TestRunningTaskInfoBuilder() .setUserId(context.userId) .setBaseIntent(Intent().apply { component = componentName }) .build() loader.onWindowDecorCreated(task) doReturn(appIconDrawable).whenever(mockPackageManager).getDefaultActivityIcon() whenever(mockHeaderIconFactory.createIconBitmap(appIconDrawable, 1f)) .thenReturn(mock()) whenever(mockVeilIconFactory.createScaledBitmap(appIconDrawable, MODE_DEFAULT)) .thenReturn(mock()) doThrow(NameNotFoundException()).whenever(mockPackageManager).getActivityInfo(eq(componentName), anyInt()) loader.getVeilIcon(task) verify(mockVeilIconFactory).createScaledBitmap(appIconDrawable, MODE_DEFAULT) assertThat(loader.taskToResourceCache[task.taskId]).isNull() } private fun createTaskInfo(userId: Int): ActivityManager.RunningTaskInfo { val appIconDrawable = mock<Drawable>() val badgedAppIconDrawable = mock<Drawable>() Loading