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()