Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8efd54f authored by Rohit Goyal's avatar Rohit Goyal
Browse files

Integrate storage of originalComponentName field for ArchiveActivityInfo

Test: atest PackageManagerSettingsTests, PackageUserStateTest, PackageArchiverTest
Bug: 302113871
Change-Id: Iaf633f774519088ab5f1697394a865c489f21c7c
parent 95e3464b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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. */
+14 −4
Original line number Diff line number Diff line
@@ -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);
            }

@@ -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);
        }

@@ -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());
@@ -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)));
+3 −0
Original line number Diff line number Diff line
@@ -1201,6 +1201,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());
+22 −5
Original line number Diff line number Diff line
@@ -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";
@@ -2068,6 +2069,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);
@@ -2076,17 +2079,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;
@@ -2458,6 +2471,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