Abandon in-flight app-search session when user stops

This is an attempt to fix an issue observed in automation test where
when user is stopeed immediately after it started, ShortcutManager is
still processing the unlock event which eventually leads to error in
creating folder for a stopped user in icing.

Bug: 183618378
Test: To be verified in TreeHugger
Change-Id: I7ae541edc0b9724b8dc7885b70f4f754c2e6da2c
This commit is contained in:
Pinyao Ting
2021-03-24 11:45:01 -07:00
parent f41fa968d8
commit 1d99392dcb
3 changed files with 9 additions and 1 deletions

View File

@@ -2408,6 +2408,8 @@ class ShortcutPackage extends ShortcutPackageItem {
mAppSearchSession = session;
return cb.apply(mAppSearchSession);
} catch (Exception e) {
Slog.e(TAG, "Failed to initiate app search for shortcut package "
+ getPackageName() + " user " + mShortcutUser.getUserId(), e);
return AndroidFuture.completedFuture(null);
} finally {
Binder.restoreCallingIdentity(callingIdentity);

View File

@@ -342,7 +342,7 @@ public class ShortcutService extends IShortcutService.Stub {
private final IPackageManager mIPackageManager;
private final PackageManagerInternal mPackageManagerInternal;
private final UserManagerInternal mUserManagerInternal;
final UserManagerInternal mUserManagerInternal;
private final UsageStatsManagerInternal mUsageStatsManagerInternal;
private final ActivityManagerInternal mActivityManagerInternal;
private final IUriGrantsManager mUriGrantsManager;

View File

@@ -722,6 +722,12 @@ class ShortcutUser {
future.completeExceptionally(new RuntimeException("app search manager is null"));
return future;
}
if (!mService.mUserManagerInternal.isUserUnlockingOrUnlocked(getUserId())) {
// In rare cases the user might be stopped immediate after it started, in these cases
// any on-going session will need to be abandoned.
future.completeExceptionally(new RuntimeException("User " + getUserId() + " is "));
return future;
}
final long callingIdentity = Binder.clearCallingIdentity();
try {
mAppSearchManager.createSearchSession(searchContext, mExecutor, result -> {