From 1d99392dcb8c7b03cd2c9c7c681cf85b590d4369 Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Wed, 24 Mar 2021 11:45:01 -0700 Subject: [PATCH] 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 --- .../core/java/com/android/server/pm/ShortcutPackage.java | 2 ++ .../core/java/com/android/server/pm/ShortcutService.java | 2 +- services/core/java/com/android/server/pm/ShortcutUser.java | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 8c3c42374acb2..7ffa6a1fd9fc8 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -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); diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 0b21487088baa..e1d1c264e6669 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -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; diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java index 51cb995aac915..ce49d8894fdbf 100644 --- a/services/core/java/com/android/server/pm/ShortcutUser.java +++ b/services/core/java/com/android/server/pm/ShortcutUser.java @@ -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 -> {