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

Commit 6eac7881 authored by Sunny Goyal's avatar Sunny Goyal Committed by Android (Google) Code Review
Browse files

Merge "Reloading workspace when the shortcuts permission changes" into ub-launcher3-calgary

parents cb782bd4 95f3d6ba
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1090,6 +1090,9 @@ public class Launcher extends Activity
        if (!isWorkspaceLoading()) {
            // Process any items that were added while Launcher was away.
            InstallShortcutReceiver.disableAndFlushInstallQueue(this);

            // Refresh shortcuts if the permission changed.
            mModel.refreshShortcutsIfRequired();
        }

        if (shouldShowDiscoveryBounce()) {
+36 −5
Original line number Diff line number Diff line
@@ -146,6 +146,20 @@ public class LauncherModel extends BroadcastReceiver
    // Maps all launcher activities to the id's of their shortcuts (if they have any).
    private final MultiHashMap<ComponentKey, String> mBgDeepShortcutMap = new MultiHashMap<>();

    private boolean mHasShortcutHostPermission;
    // Runnable to check if the shortcuts permission has changed.
    private final Runnable mShortcutPermissionCheckRunnable = new Runnable() {
        @Override
        public void run() {
            if (mDeepShortcutsLoaded) {
                boolean hasShortcutHostPermission = mDeepShortcutManager.hasHostPermission();
                if (hasShortcutHostPermission != mHasShortcutHostPermission) {
                    mApp.reloadWorkspace();
                }
            }
        }
    };

    // The lock that must be acquired before referencing any static bg data structures.  Unlike
    // other locks, this one can generally be held long-term because we never expect any of these
    // static data structures to be referenced outside of the worker thread except on the first
@@ -1244,6 +1258,7 @@ public class LauncherModel extends BroadcastReceiver
            if (resetAllAppsLoaded) mAllAppsLoaded = false;
            if (resetWorkspaceLoaded) mWorkspaceLoaded = false;
            // Always reset deep shortcuts loaded.
            // TODO: why?
            mDeepShortcutsLoaded = false;
        }
    }
@@ -1299,6 +1314,7 @@ public class LauncherModel extends BroadcastReceiver
                // If there is already one running, tell it to stop.
                stopLoaderLocked();
                mLoaderTask = new LoaderTask(mApp.getContext(), synchronousBindPage);
                // TODO: mDeepShortcutsLoaded does not need to be true for synchronous bind.
                if (synchronousBindPage != PagedView.INVALID_RESTORE_PAGE && mAllAppsLoaded
                        && mWorkspaceLoaded && mDeepShortcutsLoaded && !mIsLoaderTaskRunning) {
                    mLoaderTask.runBindSynchronousPage(synchronousBindPage);
@@ -2793,6 +2809,8 @@ public class LauncherModel extends BroadcastReceiver
            }
            if (!mDeepShortcutsLoaded) {
                mBgDeepShortcutMap.clear();
                mHasShortcutHostPermission = mDeepShortcutManager.hasHostPermission();
                if (mHasShortcutHostPermission) {
                    for (UserHandleCompat user : mUserManager.getUserProfiles()) {
                        if (mUserManager.isUserUnlocked(user)) {
                            List<ShortcutInfoCompat> shortcuts = mDeepShortcutManager
@@ -2800,6 +2818,7 @@ public class LauncherModel extends BroadcastReceiver
                            updateDeepShortcutMap(null, user, shortcuts);
                        }
                    }
                }
                synchronized (LoaderTask.this) {
                    if (mStopped) {
                        return;
@@ -2862,6 +2881,18 @@ public class LauncherModel extends BroadcastReceiver
        runOnMainThread(r);
    }

    /**
     * Refreshes the cached shortcuts if the shortcut permission has changed.
     * Current implementation simply reloads the workspace, but it can be optimized to
     * use partial updates similar to {@link UserManagerCompat}
     */
    public void refreshShortcutsIfRequired() {
        if (Utilities.isNycMR1OrAbove()) {
            sWorker.removeCallbacks(mShortcutPermissionCheckRunnable);
            sWorker.post(mShortcutPermissionCheckRunnable);
        }
    }

    /**
     * Called when the icons for packages have been updated in the icon cache.
     */
+12 −0
Original line number Diff line number Diff line
@@ -224,4 +224,16 @@ public class DeepShortcutManager {
            return Collections.EMPTY_LIST;
        }
    }

    @TargetApi(25)
    public boolean hasHostPermission() {
        if (Utilities.isNycMR1OrAbove()) {
            try {
                return mLauncherApps.hasShortcutHostPermission();
            } catch (SecurityException|IllegalStateException e) {
                Log.e(TAG, "Failed to make shortcut manager call", e);
            }
        }
        return false;
    }
}