Loading core/java/android/content/pm/ArchivedActivityParcel.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,12 @@ package android.content.pm; import android.content.ComponentName; /** @hide */ parcelable ArchivedActivityParcel { String title; ComponentName originalComponentName; // PNG compressed bitmaps. byte[] iconBitmap; byte[] monochromeIconBitmap; Loading core/proto/android/service/package.proto +3 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,9 @@ message PackageProto { // Only set if the app defined a monochrome icon. optional string monochrome_icon_bitmap_path = 3; // The component name of the original activity (pre-archival). optional string original_component_name = 4; } /** Information about main activities. */ Loading services/core/java/com/android/server/pm/PackageArchiver.java +14 −4 Original line number Diff line number Diff line Loading @@ -196,8 +196,12 @@ public class PackageArchiver { for (int i = 0, size = mainActivities.length; i < size; ++i) { var mainActivity = mainActivities[i]; Path iconPath = storeIconForParcel(packageName, mainActivity, userId, i); ArchiveActivityInfo activityInfo = new ArchiveActivityInfo( mainActivity.title, iconPath, null); ArchiveActivityInfo activityInfo = new ArchiveActivityInfo( mainActivity.title, mainActivity.originalComponentName, iconPath, null); archiveActivityInfos.add(activityInfo); } Loading @@ -215,8 +219,12 @@ public class PackageArchiver { for (int i = 0, size = mainActivities.size(); i < size; i++) { LauncherActivityInfo mainActivity = mainActivities.get(i); Path iconPath = storeIcon(packageName, mainActivity, userId, i); ArchiveActivityInfo activityInfo = new ArchiveActivityInfo( mainActivity.getLabel().toString(), iconPath, null); ArchiveActivityInfo activityInfo = new ArchiveActivityInfo( mainActivity.getLabel().toString(), mainActivity.getComponentName(), iconPath, null); archiveActivityInfos.add(activityInfo); } Loading Loading @@ -593,6 +601,7 @@ public class PackageArchiver { } var archivedActivity = new ArchivedActivityParcel(); archivedActivity.title = info.getTitle(); archivedActivity.originalComponentName = info.getOriginalComponentName(); archivedActivity.iconBitmap = bytesFromBitmapFile(info.getIconBitmap()); archivedActivity.monochromeIconBitmap = bytesFromBitmapFile( info.getMonochromeIconBitmap()); Loading Loading @@ -624,6 +633,7 @@ public class PackageArchiver { } var archivedActivity = new ArchivedActivityParcel(); archivedActivity.title = info.getLabel().toString(); archivedActivity.originalComponentName = info.getComponentName(); archivedActivity.iconBitmap = info.getActivityInfo().getIconResource() == 0 ? null : bytesFromBitmap( drawableToBitmap(info.getIcon(/* density= */ 0))); Loading services/core/java/com/android/server/pm/PackageSetting.java +3 −0 Original line number Diff line number Diff line Loading @@ -1228,6 +1228,9 @@ public class PackageSetting extends SettingBase implements PackageStateInternal long activityInfoToken = proto.start( PackageProto.UserInfoProto.ArchiveState.ACTIVITY_INFOS); proto.write(ArchiveActivityInfo.TITLE, activityInfo.getTitle()); proto.write( ArchiveActivityInfo.ORIGINAL_COMPONENT_NAME, activityInfo.getOriginalComponentName().flattenToString()); if (activityInfo.getIconBitmap() != null) { proto.write(ArchiveActivityInfo.ICON_BITMAP_PATH, activityInfo.getIconBitmap().toAbsolutePath().toString()); Loading services/core/java/com/android/server/pm/Settings.java +22 −5 Original line number Diff line number Diff line Loading @@ -368,6 +368,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile private static final String ATTR_VALUE = "value"; private static final String ATTR_FIRST_INSTALL_TIME = "first-install-time"; private static final String ATTR_ARCHIVE_ACTIVITY_TITLE = "activity-title"; private static final String ATTR_ARCHIVE_ORIGINAL_COMPONENT_NAME = "original-component-name"; private static final String ATTR_ARCHIVE_INSTALLER_TITLE = "installer-title"; private static final String ATTR_ARCHIVE_ICON_PATH = "icon-path"; private static final String ATTR_ARCHIVE_MONOCHROME_ICON_PATH = "monochrome-icon-path"; Loading Loading @@ -2079,6 +2080,8 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile if (tagName.equals(TAG_ARCHIVE_ACTIVITY_INFO)) { String title = parser.getAttributeValue(null, ATTR_ARCHIVE_ACTIVITY_TITLE); String originalComponentName = parser.getAttributeValue(null, ATTR_ARCHIVE_ORIGINAL_COMPONENT_NAME); String iconAttribute = parser.getAttributeValue(null, ATTR_ARCHIVE_ICON_PATH); Path iconPath = iconAttribute == null ? null : Path.of(iconAttribute); Loading @@ -2087,17 +2090,27 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile Path monochromeIconPath = monochromeAttribute == null ? null : Path.of( monochromeAttribute); if (title == null || iconPath == null) { Slog.wtf(TAG, TextUtils.formatSimple("Missing attributes in tag %s. %s: %s, %s: %s", TAG_ARCHIVE_ACTIVITY_INFO, ATTR_ARCHIVE_ACTIVITY_TITLE, title, if (title == null || originalComponentName == null || iconPath == null) { Slog.wtf( TAG, TextUtils.formatSimple( "Missing attributes in tag %s. %s: %s, %s: %s, %s: %s", TAG_ARCHIVE_ACTIVITY_INFO, ATTR_ARCHIVE_ACTIVITY_TITLE, title, ATTR_ARCHIVE_ORIGINAL_COMPONENT_NAME, originalComponentName, ATTR_ARCHIVE_ICON_PATH, iconPath)); continue; } activityInfos.add( new ArchiveState.ArchiveActivityInfo(title, iconPath, monochromeIconPath)); new ArchiveState.ArchiveActivityInfo( title, ComponentName.unflattenFromString(originalComponentName), iconPath, monochromeIconPath)); } } return activityInfos; Loading Loading @@ -2469,6 +2482,10 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile for (ArchiveState.ArchiveActivityInfo activityInfo : archiveState.getActivityInfos()) { serializer.startTag(null, TAG_ARCHIVE_ACTIVITY_INFO); serializer.attribute(null, ATTR_ARCHIVE_ACTIVITY_TITLE, activityInfo.getTitle()); serializer.attribute( null, ATTR_ARCHIVE_ORIGINAL_COMPONENT_NAME, activityInfo.getOriginalComponentName().flattenToString()); if (activityInfo.getIconBitmap() != null) { serializer.attribute(null, ATTR_ARCHIVE_ICON_PATH, activityInfo.getIconBitmap().toAbsolutePath().toString()); Loading Loading
core/java/android/content/pm/ArchivedActivityParcel.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,12 @@ package android.content.pm; import android.content.ComponentName; /** @hide */ parcelable ArchivedActivityParcel { String title; ComponentName originalComponentName; // PNG compressed bitmaps. byte[] iconBitmap; byte[] monochromeIconBitmap; Loading
core/proto/android/service/package.proto +3 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,9 @@ message PackageProto { // Only set if the app defined a monochrome icon. optional string monochrome_icon_bitmap_path = 3; // The component name of the original activity (pre-archival). optional string original_component_name = 4; } /** Information about main activities. */ Loading
services/core/java/com/android/server/pm/PackageArchiver.java +14 −4 Original line number Diff line number Diff line Loading @@ -196,8 +196,12 @@ public class PackageArchiver { for (int i = 0, size = mainActivities.length; i < size; ++i) { var mainActivity = mainActivities[i]; Path iconPath = storeIconForParcel(packageName, mainActivity, userId, i); ArchiveActivityInfo activityInfo = new ArchiveActivityInfo( mainActivity.title, iconPath, null); ArchiveActivityInfo activityInfo = new ArchiveActivityInfo( mainActivity.title, mainActivity.originalComponentName, iconPath, null); archiveActivityInfos.add(activityInfo); } Loading @@ -215,8 +219,12 @@ public class PackageArchiver { for (int i = 0, size = mainActivities.size(); i < size; i++) { LauncherActivityInfo mainActivity = mainActivities.get(i); Path iconPath = storeIcon(packageName, mainActivity, userId, i); ArchiveActivityInfo activityInfo = new ArchiveActivityInfo( mainActivity.getLabel().toString(), iconPath, null); ArchiveActivityInfo activityInfo = new ArchiveActivityInfo( mainActivity.getLabel().toString(), mainActivity.getComponentName(), iconPath, null); archiveActivityInfos.add(activityInfo); } Loading Loading @@ -593,6 +601,7 @@ public class PackageArchiver { } var archivedActivity = new ArchivedActivityParcel(); archivedActivity.title = info.getTitle(); archivedActivity.originalComponentName = info.getOriginalComponentName(); archivedActivity.iconBitmap = bytesFromBitmapFile(info.getIconBitmap()); archivedActivity.monochromeIconBitmap = bytesFromBitmapFile( info.getMonochromeIconBitmap()); Loading Loading @@ -624,6 +633,7 @@ public class PackageArchiver { } var archivedActivity = new ArchivedActivityParcel(); archivedActivity.title = info.getLabel().toString(); archivedActivity.originalComponentName = info.getComponentName(); archivedActivity.iconBitmap = info.getActivityInfo().getIconResource() == 0 ? null : bytesFromBitmap( drawableToBitmap(info.getIcon(/* density= */ 0))); Loading
services/core/java/com/android/server/pm/PackageSetting.java +3 −0 Original line number Diff line number Diff line Loading @@ -1228,6 +1228,9 @@ public class PackageSetting extends SettingBase implements PackageStateInternal long activityInfoToken = proto.start( PackageProto.UserInfoProto.ArchiveState.ACTIVITY_INFOS); proto.write(ArchiveActivityInfo.TITLE, activityInfo.getTitle()); proto.write( ArchiveActivityInfo.ORIGINAL_COMPONENT_NAME, activityInfo.getOriginalComponentName().flattenToString()); if (activityInfo.getIconBitmap() != null) { proto.write(ArchiveActivityInfo.ICON_BITMAP_PATH, activityInfo.getIconBitmap().toAbsolutePath().toString()); Loading
services/core/java/com/android/server/pm/Settings.java +22 −5 Original line number Diff line number Diff line Loading @@ -368,6 +368,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile private static final String ATTR_VALUE = "value"; private static final String ATTR_FIRST_INSTALL_TIME = "first-install-time"; private static final String ATTR_ARCHIVE_ACTIVITY_TITLE = "activity-title"; private static final String ATTR_ARCHIVE_ORIGINAL_COMPONENT_NAME = "original-component-name"; private static final String ATTR_ARCHIVE_INSTALLER_TITLE = "installer-title"; private static final String ATTR_ARCHIVE_ICON_PATH = "icon-path"; private static final String ATTR_ARCHIVE_MONOCHROME_ICON_PATH = "monochrome-icon-path"; Loading Loading @@ -2079,6 +2080,8 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile if (tagName.equals(TAG_ARCHIVE_ACTIVITY_INFO)) { String title = parser.getAttributeValue(null, ATTR_ARCHIVE_ACTIVITY_TITLE); String originalComponentName = parser.getAttributeValue(null, ATTR_ARCHIVE_ORIGINAL_COMPONENT_NAME); String iconAttribute = parser.getAttributeValue(null, ATTR_ARCHIVE_ICON_PATH); Path iconPath = iconAttribute == null ? null : Path.of(iconAttribute); Loading @@ -2087,17 +2090,27 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile Path monochromeIconPath = monochromeAttribute == null ? null : Path.of( monochromeAttribute); if (title == null || iconPath == null) { Slog.wtf(TAG, TextUtils.formatSimple("Missing attributes in tag %s. %s: %s, %s: %s", TAG_ARCHIVE_ACTIVITY_INFO, ATTR_ARCHIVE_ACTIVITY_TITLE, title, if (title == null || originalComponentName == null || iconPath == null) { Slog.wtf( TAG, TextUtils.formatSimple( "Missing attributes in tag %s. %s: %s, %s: %s, %s: %s", TAG_ARCHIVE_ACTIVITY_INFO, ATTR_ARCHIVE_ACTIVITY_TITLE, title, ATTR_ARCHIVE_ORIGINAL_COMPONENT_NAME, originalComponentName, ATTR_ARCHIVE_ICON_PATH, iconPath)); continue; } activityInfos.add( new ArchiveState.ArchiveActivityInfo(title, iconPath, monochromeIconPath)); new ArchiveState.ArchiveActivityInfo( title, ComponentName.unflattenFromString(originalComponentName), iconPath, monochromeIconPath)); } } return activityInfos; Loading Loading @@ -2469,6 +2482,10 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile for (ArchiveState.ArchiveActivityInfo activityInfo : archiveState.getActivityInfos()) { serializer.startTag(null, TAG_ARCHIVE_ACTIVITY_INFO); serializer.attribute(null, ATTR_ARCHIVE_ACTIVITY_TITLE, activityInfo.getTitle()); serializer.attribute( null, ATTR_ARCHIVE_ORIGINAL_COMPONENT_NAME, activityInfo.getOriginalComponentName().flattenToString()); if (activityInfo.getIconBitmap() != null) { serializer.attribute(null, ATTR_ARCHIVE_ICON_PATH, activityInfo.getIconBitmap().toAbsolutePath().toString()); Loading