Always scan all apps after each OTA for manifest shortcuts

(W/ reverting Ia05363b30a5eeb989dc4c44cf5dbd71cde96de96)

Test: FrameworksServicesTests

Bug 32590013

Change-Id: I8f45c330d0b102a6a112e774205e6611c1c61af3
This commit is contained in:
Makoto Onuki
2016-11-03 15:59:01 -07:00
parent 12a0f1190c
commit 248a0ef3aa
4 changed files with 36 additions and 57 deletions

View File

@@ -635,11 +635,7 @@ class ShortcutPackage extends ShortcutPackageItem {
return false; // Shouldn't happen.
}
// Always scan the settings app, since its version code is the same for DR and MR1.
// TODO Fix it properly: b/32554059
final boolean isSettings = "com.android.settings".equals(getPackageName());
if (!isNewApp && !forceRescan && !isSettings) {
if (!isNewApp && !forceRescan) {
// Return if the package hasn't changed, ie:
// - version code hasn't change
// - lastUpdateTime hasn't change
@@ -656,11 +652,6 @@ class ShortcutPackage extends ShortcutPackageItem {
return false;
}
}
if (isSettings) {
if (ShortcutService.DEBUG) {
Slog.d(TAG, "Always scan settings.");
}
}
} finally {
s.logDurationStat(Stats.PACKAGE_UPDATE_CHECK, start);
}

View File

@@ -2667,8 +2667,7 @@ public class ShortcutService extends IShortcutService.Stub {
}
}
rescanUpdatedPackagesLocked(ownerUserId, user.getLastAppScanTime(),
/* forceRescan=*/ false);
rescanUpdatedPackagesLocked(ownerUserId, user.getLastAppScanTime());
}
} finally {
logDurationStat(Stats.CHECK_PACKAGE_CHANGES, start);
@@ -2676,8 +2675,7 @@ public class ShortcutService extends IShortcutService.Stub {
verifyStates();
}
private void rescanUpdatedPackagesLocked(@UserIdInt int userId, long lastScanTime,
boolean forceRescan) {
private void rescanUpdatedPackagesLocked(@UserIdInt int userId, long lastScanTime) {
final ShortcutUser user = getUserShortcutsLocked(userId);
// Note after each OTA, we'll need to rescan all system apps, as their lastUpdateTime
@@ -2689,7 +2687,8 @@ public class ShortcutService extends IShortcutService.Stub {
// Then for each installed app, publish manifest shortcuts when needed.
forUpdatedPackages(userId, lastScanTime, afterOta, ai -> {
user.attemptToRestoreIfNeededAndSave(this, ai.packageName, userId);
user.rescanPackageIfNeeded(ai.packageName, forceRescan);
user.rescanPackageIfNeeded(ai.packageName, /* forceRescan= */ true);
});
// Write the time just before the scan, because there may be apps that have just
@@ -2937,32 +2936,26 @@ public class ShortcutService extends IShortcutService.Stub {
private void forUpdatedPackages(@UserIdInt int userId, long lastScanTime, boolean afterOta,
Consumer<ApplicationInfo> callback) {
if (DEBUG) {
Slog.d(TAG, "forUpdatedPackages for user " + userId + ", lastScanTime=" + lastScanTime);
Slog.d(TAG, "forUpdatedPackages for user " + userId + ", lastScanTime=" + lastScanTime
+ " afterOta=" + afterOta);
}
final List<PackageInfo> list = getInstalledPackages(userId);
for (int i = list.size() - 1; i >= 0; i--) {
final PackageInfo pi = list.get(i);
// If the package has been updated since the last scan time, then scan it.
// Also if it's a system app with no update, lastUpdateTime is not reliable, so
// just scan it.
if (pi.lastUpdateTime >= lastScanTime
|| (afterOta && isPureSystemApp(pi.applicationInfo))) {
// Also if it's right after an OTA, always re-scan all apps anyway, since the
// shortcut parser might have changed.
if (afterOta || (pi.lastUpdateTime >= lastScanTime)) {
if (DEBUG) {
Slog.d(TAG, "Found updated package " + pi.packageName);
Slog.d(TAG, "Found updated package " + pi.packageName
+ " updateTime=" + pi.lastUpdateTime);
}
callback.accept(pi.applicationInfo);
}
}
}
/**
* @return true if it's a system app with no updates.
*/
private boolean isPureSystemApp(ApplicationInfo ai) {
return ai.isSystemApp() && !ai.isUpdatedSystemApp();
}
private boolean isApplicationFlagSet(@NonNull String packageName, int userId, int flags) {
final ApplicationInfo ai = injectApplicationInfoWithUninstalled(packageName, userId);
return (ai != null) && ((ai.flags & flags) == flags);
@@ -3213,8 +3206,8 @@ public class ShortcutService extends IShortcutService.Stub {
// Rescan all packages to re-publish manifest shortcuts and do other checks.
rescanUpdatedPackagesLocked(userId,
0, // lastScanTime = 0; rescan all packages.
/* forceRescan= */ true);
0 // lastScanTime = 0; rescan all packages.
);
saveUserLocked(userId);
}

View File

@@ -737,6 +737,10 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
// Start the service.
initService();
setCaller(CALLING_PACKAGE_1);
if (ENABLE_DUMP) {
Log.d(TAG, "setUp done");
}
}
private static boolean b(Boolean value) {

View File

@@ -4181,7 +4181,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertEquals(START_TIME,
findShortcut(shortcuts.getValue(), "s4").getLastChangedTimestamp());
// Next, send unlock even on user-10. Now we scan packages on this user and send a
// Next, send an unlock event on user-10. Now we scan packages on this user and send a
// notification to the launcher.
mInjectedCurrentTimeMillis = START_TIME + 200;
@@ -4222,9 +4222,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
updatePackageVersion(CALLING_PACKAGE_2, 10);
// Then send the broadcast, to only user-0.
mService.mPackageMonitor.onReceive(getTestContext(),
mService.mPackageMonitor.onReceive(getTestContext(),
genPackageUpdateIntent(CALLING_PACKAGE_2, USER_0));
mService.checkPackageChanges(USER_10);
waitOnMainThread();
@@ -4395,7 +4394,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
// Next.
// Update the build finger print. All system apps will be scanned now.
// Update the build finger print. All apps will be scanned now.
mInjectedBuildFingerprint = "update1";
mInjectedCurrentTimeMillis += 1000;
mService.checkPackageChanges(USER_0);
@@ -4406,12 +4405,11 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
assertWith(getCallerShortcuts())
.isEmpty();
.haveIds("ms1");
});
// Next.
// Update manifest shortcuts.
mInjectedBuildFingerprint = "update2";
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
R.xml.shortcut_2);
@@ -4421,44 +4419,29 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
mInjectedCurrentTimeMillis += 1000;
mService.checkPackageChanges(USER_0);
// Fingerprint hasn't changed, so CALLING_PACKAGE_1 wasn't scanned.
// Fingerprint hasn't changed, so there packages weren't scanned.
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertWith(getCallerShortcuts())
.haveIds("ms1");
});
runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
assertWith(getCallerShortcuts())
.isEmpty();
.haveIds("ms1");
});
// Update the fingerprint, but CALLING_PACKAGE_1's version code hasn't changed, so
// still not scanned.
// Update the fingerprint. CALLING_PACKAGE_1's version code hasn't changed, but we scan
// all apps anyway.
mInjectedBuildFingerprint = "update2";
mInjectedCurrentTimeMillis += 1000;
mService.checkPackageChanges(USER_0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertWith(getCallerShortcuts())
.haveIds("ms1");
});
runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
assertWith(getCallerShortcuts())
.isEmpty();
});
// Now update the version code, so CALLING_PACKAGE_1 is scanned again.
mInjectedBuildFingerprint = "update3";
mInjectedCurrentTimeMillis += 1000;
updatePackageVersion(CALLING_PACKAGE_1, 1);
mService.checkPackageChanges(USER_0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertWith(getCallerShortcuts())
.haveIds("ms1", "ms2");
});
runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
assertWith(getCallerShortcuts())
.isEmpty();
.haveIds("ms1", "ms2");
});
// Make sure getLastAppScanTime / getLastAppScanOsFingerprint are persisted.
@@ -5721,6 +5704,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
R.xml.shortcut_5);
// Unlock user-0.
mInjectedCurrentTimeMillis += 100;
mService.handleUnlockUser(USER_0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
@@ -5750,6 +5734,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
uninstallPackage(USER_10, CALLING_PACKAGE_1);
uninstallPackage(USER_10, CALLING_PACKAGE_3);
mInjectedCurrentTimeMillis += 100;
mService.handleUnlockUser(USER_10);
runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
@@ -5774,6 +5759,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// hasn't changed.
shutdownServices();
mInjectedCurrentTimeMillis += 100;
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
R.xml.shortcut_5);
@@ -5785,7 +5772,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
mService.handleUnlockUser(USER_0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled( // FAIL
mManager.getManifestShortcuts()))),
"ms1");
assertEmpty(mManager.getPinnedShortcuts());
@@ -5808,6 +5795,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// Do it again, but this time we change the app version, so we do detect the changes.
shutdownServices();
mInjectedCurrentTimeMillis += 100;
updatePackageVersion(CALLING_PACKAGE_1, 1);
updatePackageLastUpdateTime(CALLING_PACKAGE_3, 1);
@@ -5870,6 +5859,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
shutdownServices();
mInjectedCurrentTimeMillis += 100;
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
R.xml.shortcut_0);