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()
相关推荐
uwvwko8 小时前
BUUCTF——web刷题第一页题解
android·前端·数据库·php·web·ctf
fzxwl8 小时前
隆重推荐(Android 和 iOS)UI 自动化工具—Maestro
android·ui·ios
LittleLoveBoy11 小时前
踩坑:uiautomatorviewer.bat 打不开
android
居然是阿宋11 小时前
Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析
android
CGG9214 小时前
【单例模式】
android·java·单例模式
kp0000015 小时前
PHP弱类型安全漏洞解析与防范指南
android·开发语言·安全·web安全·php·漏洞
编程乐学(Arfan开发工程师)20 小时前
06、基础入门-SpringBoot-依赖管理特性
android·spring boot·后端
androidwork20 小时前
使用 Kotlin 和 Jetpack Compose 开发 Wear OS 应用的完整指南
android·kotlin
繁依Fanyi21 小时前
Animaster:一次由 CodeBuddy 主导的 CSS 动画编辑器诞生记
android·前端·css·编辑器·codebuddy首席试玩官
奔跑吧 android1 天前
【android bluetooth 框架分析 02】【Module详解 6】【StorageModule 模块介绍】
android·bluetooth·bt·aosp13·storagemodule