Merge "Archived install icon fixes." into main
diff --git a/core/java/android/content/pm/ArchivedActivityInfo.java b/core/java/android/content/pm/ArchivedActivityInfo.java
index 1faa437..166d265 100644
--- a/core/java/android/content/pm/ArchivedActivityInfo.java
+++ b/core/java/android/content/pm/ArchivedActivityInfo.java
@@ -91,26 +91,31 @@
* @hide
*/
public static Bitmap drawableToBitmap(Drawable drawable, int iconSize) {
- if (drawable instanceof BitmapDrawable) {
- return ((BitmapDrawable) drawable).getBitmap();
-
- }
-
Bitmap bitmap;
- if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
- // Needed for drawables that are just a single color.
- bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+ if (drawable instanceof BitmapDrawable) {
+ bitmap = ((BitmapDrawable) drawable).getBitmap();
} else {
- bitmap =
+ if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
+ // Needed for drawables that are just a single color.
+ bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+ } else {
+ bitmap =
Bitmap.createBitmap(
- drawable.getIntrinsicWidth(),
- drawable.getIntrinsicHeight(),
- Bitmap.Config.ARGB_8888);
+ drawable.getIntrinsicWidth(),
+ drawable.getIntrinsicHeight(),
+ Bitmap.Config.ARGB_8888);
+ }
+
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ drawable.draw(canvas);
}
- Canvas canvas = new Canvas(bitmap);
- drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
- drawable.draw(canvas);
- if (iconSize > 0 && bitmap.getWidth() > iconSize * 2 || bitmap.getHeight() > iconSize * 2) {
+ if (iconSize <= 0) {
+ return bitmap;
+ }
+
+ if (bitmap.getWidth() < iconSize || bitmap.getHeight() < iconSize
+ || bitmap.getWidth() > iconSize * 2 || bitmap.getHeight() > iconSize * 2) {
var scaledBitmap = Bitmap.createScaledBitmap(bitmap, iconSize, iconSize, true);
if (scaledBitmap != bitmap) {
bitmap.recycle();
@@ -235,7 +240,7 @@
}
@DataClass.Generated(
- time = 1698789991876L,
+ time = 1705615445673L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/core/java/android/content/pm/ArchivedActivityInfo.java",
inputSignatures = "private @android.annotation.NonNull java.lang.CharSequence mLabel\nprivate @android.annotation.NonNull android.content.ComponentName mComponentName\nprivate @android.annotation.Nullable android.graphics.drawable.Drawable mIcon\nprivate @android.annotation.Nullable android.graphics.drawable.Drawable mMonochromeIcon\n @android.annotation.NonNull android.content.pm.ArchivedActivityParcel getParcel()\npublic static android.graphics.Bitmap drawableToBitmap(android.graphics.drawable.Drawable)\npublic static android.graphics.Bitmap drawableToBitmap(android.graphics.drawable.Drawable,int)\npublic static byte[] bytesFromBitmap(android.graphics.Bitmap)\nprivate static android.graphics.drawable.Drawable drawableFromCompressedBitmap(byte[])\nclass ArchivedActivityInfo extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genBuilder=false, genConstructor=false, genSetters=true)")
diff --git a/services/core/java/com/android/server/pm/PackageArchiver.java b/services/core/java/com/android/server/pm/PackageArchiver.java
index 6d409cd..c1b3673 100644
--- a/services/core/java/com/android/server/pm/PackageArchiver.java
+++ b/services/core/java/com/android/server/pm/PackageArchiver.java
@@ -32,6 +32,7 @@
import static android.content.pm.PackageManager.DELETE_ARCHIVE;
import static android.content.pm.PackageManager.DELETE_KEEP_DATA;
import static android.content.pm.PackageManager.INSTALL_UNARCHIVE_DRAFT;
+import static android.graphics.drawable.AdaptiveIconDrawable.getExtraInsetFraction;
import static android.os.PowerExemptionManager.REASON_PACKAGE_UNARCHIVE;
import static android.os.PowerExemptionManager.TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
@@ -67,8 +68,11 @@
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
+import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.InsetDrawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Binder;
import android.os.Bundle;
@@ -381,9 +385,8 @@
verifyNotSystemApp(ps.getFlags());
verifyInstalled(ps, userId);
String responsibleInstallerPackage = getResponsibleInstallerPackage(ps);
- verifyInstaller(responsibleInstallerPackage, userId);
- ApplicationInfo installerInfo = snapshot.getApplicationInfo(
- responsibleInstallerPackage, /* flags= */ 0, userId);
+ ApplicationInfo installerInfo = verifyInstaller(
+ snapshot, responsibleInstallerPackage, userId);
verifyOptOutStatus(packageName,
UserHandle.getUid(userId, UserHandle.getUid(userId, ps.getAppId())));
@@ -423,10 +426,10 @@
List<ArchiveActivityInfo> archiveActivityInfos = new ArrayList<>(mainActivities.size());
for (int i = 0, size = mainActivities.size(); i < size; ++i) {
var mainActivity = mainActivities.get(i);
- Path iconPath = storeDrawable(
- packageName, mainActivity.getIcon(), userId, i, iconSize);
- Path monochromePath = storeDrawable(
- packageName, mainActivity.getMonochromeIcon(), userId, i, iconSize);
+ Path iconPath = storeAdaptiveDrawable(
+ packageName, mainActivity.getIcon(), userId, i * 2 + 0, iconSize);
+ Path monochromePath = storeAdaptiveDrawable(
+ packageName, mainActivity.getMonochromeIcon(), userId, i * 2 + 1, iconSize);
ArchiveActivityInfo activityInfo =
new ArchiveActivityInfo(
mainActivity.getLabel().toString(),
@@ -453,7 +456,8 @@
List<ArchiveActivityInfo> archiveActivityInfos = new ArrayList<>(mainActivities.size());
for (int i = 0, size = mainActivities.size(); i < size; i++) {
LauncherActivityInfo mainActivity = mainActivities.get(i);
- Path iconPath = storeIcon(packageName, mainActivity, userId, i, iconSize);
+ Path iconPath = storeIcon(packageName, mainActivity, userId, i * 2 + 0, iconSize);
+ // i * 2 + 1 reserved for monochromeIcon
ArchiveActivityInfo activityInfo =
new ArchiveActivityInfo(
mainActivity.getLabel().toString(),
@@ -497,8 +501,30 @@
return iconFile.toPath();
}
- private void verifyInstaller(String installerPackageName, int userId)
- throws PackageManager.NameNotFoundException {
+ /**
+ * Create an <a
+ * href="https://developer.android.com/develop/ui/views/launch/icon_design_adaptive">
+ * adaptive icon</a> from an icon.
+ * This is necessary so the icon can be displayed properly by different launchers.
+ */
+ private static Path storeAdaptiveDrawable(String packageName, @Nullable Drawable iconDrawable,
+ @UserIdInt int userId, int index, int iconSize) throws IOException {
+ if (iconDrawable == null) {
+ return null;
+ }
+
+ // see BaseIconFactory#createShapedIconBitmap
+ float inset = getExtraInsetFraction();
+ inset = inset / (1 + 2 * inset);
+ Drawable d = new AdaptiveIconDrawable(new ColorDrawable(Color.BLACK),
+ new InsetDrawable(iconDrawable/*d*/, inset, inset, inset, inset));
+
+ return storeDrawable(packageName, d, userId, index, iconSize);
+ }
+
+
+ private ApplicationInfo verifyInstaller(Computer snapshot, String installerPackageName,
+ int userId) throws PackageManager.NameNotFoundException {
if (TextUtils.isEmpty(installerPackageName)) {
throw new PackageManager.NameNotFoundException("No installer found");
}
@@ -507,6 +533,12 @@
&& !verifySupportsUnarchival(installerPackageName, userId)) {
throw new PackageManager.NameNotFoundException("Installer does not support unarchival");
}
+ ApplicationInfo appInfo = snapshot.getApplicationInfo(
+ installerPackageName, /* flags=*/ 0, userId);
+ if (appInfo == null) {
+ throw new PackageManager.NameNotFoundException("Failed to obtain Installer info");
+ }
+ return appInfo;
}
/**
@@ -572,7 +604,7 @@
}
try {
- verifyInstaller(getResponsibleInstallerPackage(ps), userId);
+ verifyInstaller(snapshot, getResponsibleInstallerPackage(ps), userId);
getLauncherActivityInfos(packageName, userId);
} catch (PackageManager.NameNotFoundException e) {
return false;
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageUserStateTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageUserStateTest.java
index 9780440..a185ad9 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageUserStateTest.java
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageUserStateTest.java
@@ -419,7 +419,7 @@
"installerTitle");
packageUserState.setArchiveState(archiveState);
assertEquals(archiveState, packageUserState.getArchiveState());
- assertTrue(archiveState.getArchiveTimeMillis() > currentTimeMillis);
+ assertTrue(archiveState.getArchiveTimeMillis() >= currentTimeMillis);
}
@Test