Android 14 系统统一修改app启动时图标大小和圆角

Android 14 统一修改app启动时图标大小和圆角

修改如下:

目录:frameworks/base/core/java/android/window/SplashScreenView.java

frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java

java 复制代码
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.ColorInt;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
import android.annotation.UiThread;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Outline;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteCallback;
import android.os.Trace;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.SurfaceControlViewHost;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.android.internal.R;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.policy.DecorView;
import java.time.Duration;
                    mUiThreadInitTask.accept(() -> view.mIconView = createSurfaceView(view));
                } else {
                    view.mIconView = createSurfaceView(view);
                }
                view.initIconAnimation(mIconDrawable);
                view.mIconAnimationStart = mIconAnimationStart;
                view.mIconAnimationDuration = mIconAnimationDuration;
            } else if (mIconSize != 0) {
                ImageView imageView = view.findViewById(R.id.splashscreen_icon_view);
                assert imageView != null;
                //start add code
                imageView.setOutlineProvider(new ViewOutlineProvider() {
                    @Override
                    public void getOutline(View view, Outline outline) {
                        outline.setRoundRect(0,0,view.getWidth(),view.getHeight(),40);
                    }
                });
                imageView.setClipToOutline(true);
                // end add code
                final ViewGroup.LayoutParams params = imageView.getLayoutParams();
                params.width = mIconSize;
                params.height = mIconSize;
                imageView.setLayoutParams(params);
                if (mIconDrawable != null) {
                    imageView.setImageDrawable(mIconDrawable);
                    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                }
                if (mIconBackground != null) {
                    imageView.setBackground(mIconBackground);
                }
                hasIcon = true;
                view.mIconView = imageView;
            }
            if (mOverlayDrawable != null || (!hasIcon && !mAllowHandleSolidColor)) {
                view.setNotCopyable();
            }
        private Bitmap mBrandingBitmap;
        private long mIconAnimationStartMillis;
        private long mIconAnimationDurationMillis;
        private SurfaceControlViewHost.SurfacePackage mSurfacePackage;
        private RemoteCallback mClientCallback;
        public SplashScreenViewParcelable(SplashScreenView view) {
            final View iconView = view.getIconView();
            //start add code
            if(mIconSize==0){
                mIconSize = iconView != null ? iconView.getWidth() : 0;
            }
           // end add code
            mBackgroundColor = view.getInitBackgroundColor();
            mIconBackground = iconView != null ? copyDrawable(iconView.getBackground()) : null;
            mSurfacePackage = view.mSurfacePackageCopy;
            if (mSurfacePackage == null) {
                // We only need to copy the drawable if we are not using a SurfaceView
                mIconBitmap = iconView != null
                        ? copyDrawable(((ImageView) view.getIconView()).getDrawable()) : null;
            }
            mBrandingBitmap = copyDrawable(view.getBrandingView().getBackground());
java 复制代码
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.util.DisplayMetrics;
import android.util.Slog;
import android.view.ContextThemeWrapper;
import android.view.Display;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.SplashScreenView;
import android.window.StartingWindowInfo;
import android.window.StartingWindowInfo.StartingWindowType;
import com.android.ex.camera2.portability.debug.Log;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.graphics.palette.Palette;
import com.android.internal.graphics.palette.Quantizer;
import com.android.internal.graphics.palette.VariationalKMeansQuantizer;
import com.android.internal.protolog.common.ProtoLog;
import com.android.launcher3.icons.BaseIconFactory;
import com.android.launcher3.icons.IconProvider;
import com.android.wm.shell.common.TransactionPool;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
            mAllowHandleSolidColor = allowHandleSolidColor;
            return this;
        }
        SplashScreenView build() {
            Drawable iconDrawable;
            if (mSuggestType == STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN
                    || mSuggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) {
                // empty or legacy splash screen case
                mFinalIconSize = 0;
 //  start add code              
//            } else if (mTmpAttrs.mSplashScreenIcon != null) {
//                // Using the windowSplashScreenAnimatedIcon attribute
//                iconDrawable = mTmpAttrs.mSplashScreenIcon;

//                // There is no background below the icon, so scale the icon up
//                if (mTmpAttrs.mIconBgColor == Color.TRANSPARENT
//                        || mTmpAttrs.mIconBgColor == mThemeColor) {
//                    mFinalIconSize *= NO_BACKGROUND_SCALE;
//                }
//                createIconDrawable(iconDrawable, false /* legacy */, false /* loadInDetail */);
 //  end add code    
             } else {
                android.util.Log.d("xuping","SplashScreenContentDrawer--build---22222");
                final float iconScale = (float) mIconSize / (float) mDefaultIconSize;
                final int densityDpi = mContext.getResources().getConfiguration().densityDpi;
                final int scaledIconDpi =
                        (int) (0.5f + iconScale * densityDpi * NO_BACKGROUND_SCALE);
                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "getIcon");
                iconDrawable = mHighResIconProvider.getIcon(
                        mActivityInfo, densityDpi, scaledIconDpi);
                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);

 // start add code
//                if (!processAdaptiveIcon(iconDrawable)) {
//                    ProtoLog.v(ShellProtoLogGroup.WM_SHELL_STARTING_WINDOW,
//                            "The icon is not an AdaptiveIconDrawable");
//                    Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "legacy_icon_factory");
//                    final ShapeIconFactory factory = new ShapeIconFactory(
//                            SplashscreenContentDrawer.this.mContext,
//                            scaledIconDpi, mFinalIconSize);
//                    final Bitmap bitmap = factory.createScaledBitmap(iconDrawable,
//                            BaseIconFactory.MODE_DEFAULT);
//                    Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
//                    createIconDrawable(new BitmapDrawable(bitmap), true,
//                            mHighResIconProvider.mLoadInDetail);
//                }
 // end add code
                createIconDrawable(iconDrawable, true , mHighResIconProvider.mLoadInDetail);
            }
            return fillViewWithIcon(mFinalIconSize, mFinalIconDrawables, mUiThreadInitTask);
        }
        private class ShapeIconFactory extends BaseIconFactory {
            protected ShapeIconFactory(Context context, int fillResIconDpi, int iconBitmapSize) {
                super(context, fillResIconDpi, iconBitmapSize, true /* shapeDetection */);
            }
        }
        private Context mStandaloneContext;
        private IconProvider mStandaloneIconProvider;
        HighResIconProvider(Context context, IconProvider sharedIconProvider) {
            mSharedContext = context;
            mSharedIconProvider = sharedIconProvider;
        }
        Drawable getIcon(ActivityInfo activityInfo, int currentDpi, int iconDpi) {
            mLoadInDetail = false;
        // strat add code
            Drawable drawable = getAppIconFromPackageName(mSharedContext,activityInfo.applicationInfo.packageName);
//            if (currentDpi < iconDpi && currentDpi < DisplayMetrics.DENSITY_XHIGH) {
                drawable = loadFromStandalone(activityInfo, currentDpi, iconDpi);
//            } else {
//                drawable = mSharedIconProvider.getIcon(activityInfo, iconDpi);
//            }
//            if (drawable == null) {
//                drawable = mSharedContext.getPackageManager().getDefaultActivityIcon();
//            }
 // end add code
            return drawable;
        }

         // strat add code
        public Drawable getAppIconFromPackageName(Context context, String packageName) {
            PackageManager packageManager = context.getPackageManager();
            Drawable appIcon =null;
            try {
                ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
                appIcon = packageManager.getApplicationIcon( applicationInfo);
            } catch (Exception e) {
                android.util.Log.d(TAG,"getAppIconFromPackageName Null");
            }
            return appIcon;
        }
       // end add code

        private Drawable loadFromStandalone(ActivityInfo activityInfo, int currentDpi,
                int iconDpi) {
            if (mStandaloneContext == null) {
                final Configuration defConfig = mSharedContext.getResources().getConfiguration();
                mStandaloneContext = mSharedContext.createConfigurationContext(defConfig);
                mStandaloneIconProvider = new IconProvider(mStandaloneContext);
            }
            Resources resources;
            try {
                resources = mStandaloneContext.getPackageManager()
相关推荐
_小马快跑_10 分钟前
ConstraintLayout之layout_constraintDimensionRatio属性详解
android
百锦再1 小时前
Android Studio开发 SharedPreferences 详解
android·ide·android studio
青春给了狗2 小时前
Android 14 修改侧滑手势动画效果
android
CYRUS STUDIO2 小时前
Android APP 热修复原理
android·app·frida·hotfix·热修复
火柴就是我3 小时前
首次使用Android Studio时,http proxy,gradle问题解决
android
limingade3 小时前
手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
android·智能手机·电脑·蓝牙电话·电脑打电话
浩浩测试一下3 小时前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
pengyu5 小时前
【Flutter 状态管理 - 柒】 | InheritedWidget:藏在组件树里的"魔法"✨
android·flutter·dart
居然是阿宋7 小时前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin