Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2f8a65c authored by Pinyao Ting's avatar Pinyao Ting Committed by android-build-team Robot
Browse files

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
(cherry picked from commit 4dedfc8b)
parent 84abc66f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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 {
+14 −0
Original line number Diff line number Diff line
@@ -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) {
+4 −1
Original line number Diff line number Diff line
@@ -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")