系统选择框ResolverActivity修改记录 (Android10)

本文详细记录了在Android10中,系统选择框ResolverActivity的修改情况,探讨了这些改动对开发者的影响及其应对策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统选择框ResolverActivity修改记录 (Android10)

    提交选择弹框、错误弹框修改;
diff --git a/frameworks/base/core/java/com/android/internal/app/AlertController.java b/frameworks/base/core/java/com/android/internal/app/AlertController.java
old mode 100644
new mode 100755
--- a/frameworks/base/core/java/com/android/internal/app/AlertController.java
+++ b/frameworks/base/core/java/com/android/internal/app/AlertController.java
@@ -28,6 +28,14 @@ import android.content.DialogInterface;
 import android.content.res.Configuration;
 import android.content.res.TypedArray;
 import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.os.Message;
@@ -273,6 +281,7 @@ public class AlertController {
   
   
     }
 
     private int selectContentView() {
   
   
+        // modified by xxxx
         if (mButtonPanelSideLayout == 0) {
   
   
             return mAlertDialogLayout;
         }
@@ -438,13 +447,58 @@ public class AlertController {
   
   
         if (mIconView != null) {
   
   
             if (icon != null) {
   
   
                 mIconView.setVisibility(View.VISIBLE);
-                mIconView.setImageDrawable(icon);
+                setIconView(mIconView, icon);
             } else {
   
   
                 mIconView.setVisibility(View.GONE);
             }
         }
     }
 
+    private void setIconView(ImageView imageView, int iconId) {
   
   
+        setIconView(imageView, mContext.getDrawable(iconId));
+    }
+
+    private void setIconView(ImageView imageView, Drawable icon) {
   
   
+        Bitmap bitmap = drawableToBitmap(icon);
+        imageView.setImageBitmap(setRoundCornerBitmap(bitmap, dp2px(mContext, 19)));
+    }
+
+    public int dp2px(Context context, float dpValue) {
   
   
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (int) (dpValue * scale + 0.5f);
+    }
+
+    public Bitmap drawableToBitmap(Drawable drawable) {
   
   
+        int width = drawable.getIntrinsicWidth();
+        int height = drawable.getIntrinsicHeight();
+
+        drawable.setBounds(0, 0, width, height);
+        Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
+                : Bitmap.Config.RGB_565;
+        Bitmap bitmap = Bitmap.createBitmap(width, height, config);
+        Canvas canvas = new Canvas(bitmap);
+        drawable.draw(canvas);
+        return bitmap;
+    }
+
+    public Bitmap setRoundCornerBitmap(Bitmap bitmap, float roundPx) {
   
   
+        int width = bitmap.getWidth();
+        int height = bitmap.getHeight();
+        Bitmap outBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(outBitmap);
+        final int color = 0xff424242;
+        final Paint paint = new Paint();
+        final Rect rect = new Rect(0, 0, width, height);
+        final RectF rectf = new RectF(rect);
+        paint.setAntiAlias(true);
+        canvas.drawARGB(0, 0, 0, 0);
+        paint.setColor(color);
+        canvas.drawRoundRect(rectf, roundPx, roundPx, paint);
+        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
+        canvas.drawBitmap(bitmap, rect, rect, paint);
+        return outBitmap;
+    }
+
     /**
      * @param attrId the attributeId of the theme-specific drawable
      * to resolve the resourceId for.*/
@@ -682,9 +736,11 @@ public class AlertController {
   
   
                 // use them instead of the default ones. If the user has
                 // specified 0 then make it disappear.
                 if (mIconId != 0) {
   
   
-                    mIconView.setImageResource(mIconId);
+                    setIconView(mIconView, mIconId);
+//                    mIconView.setImageResource(mIconId);
                 } else if (mIcon != null) {
   
   
-                    mIconView.setImageDrawable(mIcon);
+                    setIconView(mIconView, mIcon);
+//                    mIconView.setImageDrawable(mIcon);
                 } else {
   
   
                     // Apply the padding from the icon to ensure the title is
                     // aligned correctly.
diff --git a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
old mode 100644
new mode 100755
index 9961587..2d40af9
--- a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
+++ b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
@@ -43,9 +43,16 @@ import android.content.pm.UserInfo;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.Canvas;
 import android.graphics.ColorMatrix;
 import android.graphics.ColorMatrixColorFilter;
 import android.graphics.Insets;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -84,6 +91,7 @@ import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.content.PackageMonitor;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.internal.util.ImageUtils;
 import com.android.internal.widget.ResolverDrawerLayout;
 
 import java.util.ArrayList;
@@ -1302,7 +1310,7 @@ public class ResolverActivity extends Activity {
   
   
         // In case this method is called again (due to activity recreation), avoid adding a new
         // header if one is already present.
         if (useHeader && listView != null && listView.getHeaderViewsCount() == 0) {
   
   
-            listView.setHeaderDividersEnabled(true);
+            listView.setHeaderDividersEnabled(false);
             listView.addHeaderView(LayoutInflater.from(this).inflate(
                     R.layout.resolver_different_item_header, listView, false));
         }
@@ -1333,6 +1341,7 @@ public class ResolverActivity extends Activity {
   
   
 
         final ImageView iconView = findViewById(R.id.icon);
         final DisplayResolveInfo iconInfo = mAdapter.getFilteredItem();
+        Log.i(TAG, "iconInfo:" + iconInfo);
         if (iconView != null && iconInfo != null) {
   
   
             new LoadIconTask(iconInfo, iconView).execute();
         }
@@ -2061,6 +2070,7 @@ public class ResolverActivity extends Activity {
   
   
 
         protected void onBindView(View view, TargetInfo info) {
   
   
             final ViewHolder holder = (ViewHolder) view.getTag();
+
             if (info == null) {
   
   
                 holder.icon.setImageDrawable(
                         getDrawable(R.drawable.resolver_icon_placeholder));
@@ -2089,16 +2099,18 @@ public class ResolverActivity extends Activity {
   
   
                 holder.icon.setColorFilter(null);
             }
 
-            if (info instanceof DisplayResolveInfo
+            // set icon
+            String packageName = info.getResolveInfo().activityInfo.packageName;
+            holder.icon.setImageDrawable(ImageUtils.getAppIcon(getApplicationContext(), packageName));
+            /*if (info instanceof DisplayResolveInfo
                     && !((DisplayResolveInfo) info).hasDisplayIcon()) {
                 new LoadIconTask((DisplayResolveInfo) info, holder.icon).execute();
             } else {
                 holder.icon.setImageDrawable(info.getDisplayIcon());
-            }
+            }*/
         }
     }
 
-
     @VisibleForTesting
     public static final class ResolvedComponentInfo {
   
   
         public final ComponentName name;
diff --git a/frameworks/base/core/java/com/android/internal/util/ImageUtils.java b/frameworks/base/core/java/com/android/internal/util/ImageUtils.java
old mode 100644
new mode 100755
index 274a513..61f0fdb
--- a/frameworks/base/core/java/com/android/internal/util/ImageUtils.java
+++ b/frameworks/base/core/java/com/android/internal/util/ImageUtils.java
@@ -18,6 +18,8 @@ package com.android.internal.util;
 
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
 import android.graphics.Canvas;
@@ -26,8 +28,12 @@ import android.graphics.ImageDecoder.ImageInfo;
 import android.graphics.ImageDecoder.Source;
 import android.graphics.Matrix;
 import android.graphics.Paint;
+import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -215,4 +221,19 @@ public class ImageUtils {
   
   
                 });
         }
     }
+
+    public static Drawable getAppIcon(Context context, String packageName) {
   
   
+        PackageManager packageManager = context.getPackageManager();
+        try {
   
   
+            return packageManager.getApplicationIcon(packageName);
+        } catch (PackageManager.NameNotFoundException e) {
   
   
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static int dp2px(Context context, float dpValue) {
   
   
+        float scale = context.getResources().getDisplayMetrics().density;
+        return (int) (dpValue * scale + 0.5f);
+    }
 }
diff --git a/frameworks/base/core/java/com/android/internal/widget/RoundImageView.java b/frameworks/base/core/java/com/android/internal/widget/RoundImageView.java
new file mode 100755
index 0000000..d43710a
--- /dev/null
+++ b/frameworks/base/core/java/com/android/internal/widget/RoundImageView.java
@@ -0,0 +1,185 @@
+package com.android.internal.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.PixelFormat;
+import android.graphics.RectF;
+import android.graphics.Shader;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import java.lang.ref.WeakReference;
+
+public class RoundImageView extends ImageView {
   
   
+    private static final String TAG = RoundImageView.class.getSimpleName();
+
+    protected Context mContext;
+    protected int mShape;
+    protected int roundRadius;
+    protected int leftTopRadius;
+    protected int rightTopRadius;
+    protected int rightBottomRadius;
+    protected int leftBottomRadius;
+    private Paint shaderPaint;
+    private Paint mPaint;
+    private Shader shader;
+    private WeakReference<Bitmap> mWeakBitmap;
+
+    public RoundImageView(Context context) {
   
   
+        super(context);
+        sharedConstructor(context, null);
+    }
+
+    public RoundImageView(Context context, AttributeSet attrs) {
   
   
+        super(context, attrs);
+        sharedConstructor(context, attrs);
+    }
+
+    public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
   
   
+        super(context, attrs, defStyle);
+        sharedConstructor(context, attrs);
+    }
+
+    private void sharedConstructor(Context context, AttributeSet attrs) {
   
   
+        mContext = context;
+        shaderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
+        if (attrs != null) {
   
   
+            TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.RoundImageView);
+            roundRadius = a.getDimensionPixelSize(com.android.internal.R.styleable.RoundImageView_roundRadius, 20);
+            leftTopRadius = a.getDimensionPixelSize(com.android.internal.R.styleable.RoundImageView_leftTopRadius, -1);
+            if (leftTopRadius == -1){
   
   
+                leftTopRadius = roundRadius;
+            }
+            rightTopRadius = a.getDimensionPixelSize(com.android.internal.R.styleable.RoundImageView_rightTopRadius, -1);
+            if (rightTopRadius == -1){
   
   
+                rightTopRadius = roundRadius;
+            }
+            rightBottomRadius = a.getDimensionPixelSize(com.android.internal.R.styleable.RoundImageView_rightBottomRadius, -1);
+            if (rightBottomRadius == -1){
   
   
+                rightBottomRadius = roundRadius;
+            }
+            leftBottomRadius = a.getDimensionPixelSize(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值