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

Commit fac592f6 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Fix issue with apps restored to lower versions.

When restoring to a new device, if a restored app is not compatible
with the old version (e.g. lower version or different signature),
then we won't restore shortcuts, which is working as expected.

However when it happens, the shortcut manager forgot to "un-shadow"
the package information, causing the app to not have shortcuts at all.

Test: adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest1 -w com.android.frameworks.servicestests

Bug 32999759

Change-Id: I89832360114de0ce1c57d763bcaccab4fdb87b6d
parent de098d01
Loading
Loading
Loading
Loading
+18 −14
Original line number Original line Diff line number Diff line
@@ -106,27 +106,31 @@ abstract class ShortcutPackageItem {
            }
            }
            return; // Not installed, no need to restore yet.
            return; // Not installed, no need to restore yet.
        }
        }
        boolean blockRestore = false;
        if (!mPackageInfo.hasSignatures()) {
        if (!mPackageInfo.hasSignatures()) {
            s.wtf("Attempted to restore package " + mPackageName + ", user=" + mPackageUserId
            s.wtf("Attempted to restore package " + mPackageName + ", user=" + mPackageUserId
                    + " but signatures not found in the restore data.");
                    + " but signatures not found in the restore data.");
            onRestoreBlocked();
            blockRestore = true;
            return;
        }
        }

        if (!blockRestore) {
            final PackageInfo pi = s.getPackageInfoWithSignatures(mPackageName, mPackageUserId);
            final PackageInfo pi = s.getPackageInfoWithSignatures(mPackageName, mPackageUserId);
            if (!mPackageInfo.canRestoreTo(s, pi)) {
            if (!mPackageInfo.canRestoreTo(s, pi)) {
                // Package is now installed, but can't restore.  Let the subclass do the cleanup.
                // Package is now installed, but can't restore.  Let the subclass do the cleanup.
            onRestoreBlocked();
                blockRestore = true;
            return;
            }
            }
        }
        if (blockRestore) {
            onRestoreBlocked();
        } else {
            if (ShortcutService.DEBUG) {
            if (ShortcutService.DEBUG) {
                Slog.d(TAG, String.format("Restored package: %s/%d on user %d", mPackageName,
                Slog.d(TAG, String.format("Restored package: %s/%d on user %d", mPackageName,
                        mPackageUserId, getOwnerUserId()));
                        mPackageUserId, getOwnerUserId()));
            }
            }


            onRestored();
            onRestored();
        }


        // Now the package is not shadow.
        // Either way, it's no longer a shadow.
        mPackageInfo.setShadow(false);
        mPackageInfo.setShadow(false);


        s.scheduleSaveUser(mPackageUserId);
        s.scheduleSaveUser(mPackageUserId);
+10 −0
Original line number Original line Diff line number Diff line
@@ -3739,6 +3739,16 @@ public class ShortcutService extends IShortcutService.Stub {
        }
        }
    }
    }


    @VisibleForTesting
    ShortcutLauncher getLauncherShortcutForTest(String packageName, int userId) {
        synchronized (mLock) {
            final ShortcutUser user = mUsers.get(userId);
            if (user == null) return null;

            return user.getAllLaunchersForTest().get(PackageWithUser.of(userId, packageName));
        }
    }

    /**
    /**
     * Control whether {@link #verifyStates} should be performed.  We always perform it during unit
     * Control whether {@link #verifyStates} should be performed.  We always perform it during unit
     * tests.
     * tests.
+9 −0
Original line number Original line Diff line number Diff line
@@ -4938,6 +4938,9 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
            assertEquals(0, mManager.getDynamicShortcuts().size());
            assertEquals(0, mManager.getDynamicShortcuts().size());
            assertEquals(0, mManager.getPinnedShortcuts().size());
            assertEquals(0, mManager.getPinnedShortcuts().size());
        });
        });
        assertFalse(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, USER_0)
                .getPackageInfo().isShadow());



        installPackage(USER_0, CALLING_PACKAGE_2);
        installPackage(USER_0, CALLING_PACKAGE_2);
        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
@@ -4946,6 +4949,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
                    mManager.getPinnedShortcuts()),
                    mManager.getPinnedShortcuts()),
                    "s1", "s2", "s3");
                    "s1", "s2", "s3");
        });
        });
        assertFalse(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, USER_0)
                .getPackageInfo().isShadow());


        installPackage(USER_0, LAUNCHER_1);
        installPackage(USER_0, LAUNCHER_1);
        runWithCaller(LAUNCHER_1, USER_0, () -> {
        runWithCaller(LAUNCHER_1, USER_0, () -> {
@@ -5069,6 +5074,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
                    mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
                    mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
                    /* empty */);
                    /* empty */);
        });
        });
        assertFalse(mService.getLauncherShortcutForTest(LAUNCHER_1, USER_0)
                .getPackageInfo().isShadow());


        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
            assertEquals(0, mManager.getDynamicShortcuts().size());
            assertEquals(0, mManager.getDynamicShortcuts().size());
@@ -5091,6 +5098,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
                    mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
                    mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
                    /* empty */);
                    /* empty */);
        });
        });
        assertFalse(mService.getLauncherShortcutForTest(LAUNCHER_2, USER_0)
                .getPackageInfo().isShadow());


        installPackage(USER_0, CALLING_PACKAGE_3);
        installPackage(USER_0, CALLING_PACKAGE_3);
        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {