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:
Pinyao Ting
2021-03-30 14:34:04 -07:00
parent 4546fb3eb4
commit 4dedfc8ba3
3 changed files with 19 additions and 2 deletions

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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")