Fixes an issue in shortcut persistence.
Currently after reboot the shortcuts previously saved in AppSearch could be lost since ShortcutService never calls AppSearchSession#close. Closing the session upon device shutdown fixes the issue. Also, removes the exception where calling AppSearchSession#close gives rise to IllegalArgumentException when the call wasn't made from a binder thread. Since ShortcutService runs in the system process, it is expected that calling AppSearchSession#close doesn't goes through binder. Bug: 183982287 Test: flash, pin shortcuts, reboot, observe Test: atest ShortcutManagerTest1 ShortcutManagerTest2 ShortcutManagerTest3 ShortcutManagerTest4 ShortcutManagerTest5 ShortcutManagerTest6 ShortcutManagerTest7 ShortcutManagerTest8 ShortcutManagerTest9 ShortcutManagerTest10 ShortcutManagerTest11 Test: atest CtsShortcutManagerTestCases Change-Id: I61bc4354735770630965ca4f81314d23671165d0
This commit is contained in:
@@ -640,7 +640,7 @@ public class AppSearchManagerService extends SystemService {
|
||||
|
||||
@Override
|
||||
public void persistToDisk(@UserIdInt int userId) {
|
||||
int callingUid = Binder.getCallingUidOrThrow();
|
||||
int callingUid = Binder.getCallingUid();
|
||||
int callingUserId = handleIncomingUser(userId, callingUid);
|
||||
final long callingIdentity = Binder.clearCallingIdentity();
|
||||
try {
|
||||
|
||||
@@ -2419,6 +2419,20 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
}
|
||||
}
|
||||
|
||||
void closeAppSearchSession() {
|
||||
synchronized (mLock) {
|
||||
if (mAppSearchSession != null) {
|
||||
final long callingIdentity = Binder.clearCallingIdentity();
|
||||
try {
|
||||
mAppSearchSession.close();
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(callingIdentity);
|
||||
}
|
||||
}
|
||||
mAppSearchSession = null;
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private AndroidFuture<AppSearchSession> setupSchema(
|
||||
@NonNull final AppSearchSession session) {
|
||||
|
||||
@@ -1050,7 +1050,10 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
file.failWrite(os);
|
||||
}
|
||||
|
||||
getUserShortcutsLocked(userId).logSharingShortcutStats(mMetricsLogger);
|
||||
final ShortcutUser user = getUserShortcutsLocked(userId);
|
||||
// Close AppSearchSession to flush pending changes.
|
||||
user.forAllPackages(ShortcutPackage::closeAppSearchSession);
|
||||
user.logSharingShortcutStats(mMetricsLogger);
|
||||
}
|
||||
|
||||
@GuardedBy("mLock")
|
||||
|
||||
Reference in New Issue
Block a user