Use IconProvider to get application icon.

Changes logic to get app icon to use IconProvider. Also places it such
that icon and name are fetched on WindowDecor creation rather than every
time handle menu is built.

Bug: 268363572
Test: Manual, ensure correct icon/name are still fetched.
Change-Id: I546fbead9b4d86a3fae61e1a21814df57f8363a2
This commit is contained in:
mattsziklay
2023-03-21 16:27:46 -07:00
parent f0cba6ab5a
commit 0537c95338
2 changed files with 23 additions and 24 deletions

View File

@@ -26,6 +26,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.Log;
import android.view.Choreographer;
@@ -38,6 +39,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import android.window.WindowContainerTransaction;
import com.android.launcher3.icons.IconProvider;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
@@ -81,6 +83,9 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
private final int mHandleMenuCornerRadiusId = R.dimen.caption_menu_corner_radius;
private PointF mHandleMenuPosition = new PointF();
private Drawable mAppIcon;
private CharSequence mAppName;
DesktopModeWindowDecoration(
Context context,
DisplayController displayController,
@@ -95,6 +100,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
mHandler = handler;
mChoreographer = choreographer;
mSyncQueue = syncQueue;
loadAppInfo();
}
@Override
@@ -185,7 +192,9 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
mWindowDecorViewHolder = new DesktopModeAppControlsWindowDecorationViewHolder(
mResult.mRootView,
mOnCaptionTouchListener,
mOnCaptionButtonClickListener
mOnCaptionButtonClickListener,
mAppName,
mAppIcon
);
} else {
throw new IllegalArgumentException("Unexpected layout resource id");
@@ -243,22 +252,24 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
final ImageView appIcon = menu.findViewById(R.id.application_icon);
final TextView appName = menu.findViewById(R.id.application_name);
loadAppInfo(appName, appIcon);
appIcon.setImageDrawable(mAppIcon);
appName.setText(mAppName);
}
boolean isHandleMenuActive() {
return mHandleMenu != null;
}
private void loadAppInfo(TextView appNameTextView, ImageView appIconImageView) {
private void loadAppInfo() {
String packageName = mTaskInfo.realActivity.getPackageName();
PackageManager pm = mContext.getApplicationContext().getPackageManager();
try {
// TODO(b/268363572): Use IconProvider or BaseIconCache to set drawable/name.
IconProvider provider = new IconProvider(mContext);
mAppIcon = provider.getIcon(pm.getActivityInfo(mTaskInfo.baseActivity,
PackageManager.ComponentInfoFlags.of(0)));
ApplicationInfo applicationInfo = pm.getApplicationInfo(packageName,
PackageManager.ApplicationInfoFlags.of(0));
appNameTextView.setText(pm.getApplicationLabel(applicationInfo));
appIconImageView.setImageDrawable(pm.getApplicationIcon(applicationInfo));
mAppName = pm.getApplicationLabel(applicationInfo);
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Package not found: " + packageName, e);
}

View File

@@ -1,10 +1,9 @@
package com.android.wm.shell.windowdecor.viewholder
import android.app.ActivityManager.RunningTaskInfo
import android.content.pm.PackageManager
import android.content.res.ColorStateList
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import android.util.Log
import android.view.View
import android.widget.ImageButton
import android.widget.ImageView
@@ -19,7 +18,9 @@ import com.android.wm.shell.R
internal class DesktopModeAppControlsWindowDecorationViewHolder(
rootView: View,
onCaptionTouchListener: View.OnTouchListener,
onCaptionButtonClickListener: View.OnClickListener
onCaptionButtonClickListener: View.OnClickListener,
appName: CharSequence,
appIcon: Drawable
) : DesktopModeWindowDecorationViewHolder(rootView) {
private val captionView: View = rootView.findViewById(R.id.desktop_mode_caption)
@@ -35,10 +36,11 @@ internal class DesktopModeAppControlsWindowDecorationViewHolder(
captionHandle.setOnTouchListener(onCaptionTouchListener)
openMenuButton.setOnClickListener(onCaptionButtonClickListener)
closeWindowButton.setOnClickListener(onCaptionButtonClickListener)
appNameTextView.text = appName
appIconImageView.setImageDrawable(appIcon)
}
override fun bindData(taskInfo: RunningTaskInfo) {
bindAppInfo(taskInfo)
val captionDrawable = captionView.background as GradientDrawable
captionDrawable.setColor(taskInfo.taskDescription.statusBarColor)
@@ -50,20 +52,6 @@ internal class DesktopModeAppControlsWindowDecorationViewHolder(
appNameTextView.setTextColor(getCaptionAppNameTextColor(taskInfo))
}
private fun bindAppInfo(taskInfo: RunningTaskInfo) {
val packageName: String = taskInfo.realActivity.packageName
val pm: PackageManager = context.applicationContext.packageManager
try {
// TODO(b/268363572): Use IconProvider or BaseIconCache to set drawable/name.
val applicationInfo = pm.getApplicationInfo(packageName,
PackageManager.ApplicationInfoFlags.of(0))
appNameTextView.text = pm.getApplicationLabel(applicationInfo)
appIconImageView.setImageDrawable(pm.getApplicationIcon(applicationInfo))
} catch (e: PackageManager.NameNotFoundException) {
Log.w(TAG, "Package not found: $packageName", e)
}
}
private fun getCaptionAppNameTextColor(taskInfo: RunningTaskInfo): Int {
return if (shouldUseLightCaptionColors(taskInfo)) {
context.getColor(R.color.desktop_mode_caption_app_name_light)