Reloading workspace when the shortcuts permission changes
am: 95f3d6ba2c
Change-Id: I90ca9f1380eee4c3e26f929614a1c77b2520b378
This commit is contained in:
@@ -1090,6 +1090,9 @@ public class Launcher extends Activity
|
|||||||
if (!isWorkspaceLoading()) {
|
if (!isWorkspaceLoading()) {
|
||||||
// Process any items that were added while Launcher was away.
|
// Process any items that were added while Launcher was away.
|
||||||
InstallShortcutReceiver.disableAndFlushInstallQueue(this);
|
InstallShortcutReceiver.disableAndFlushInstallQueue(this);
|
||||||
|
|
||||||
|
// Refresh shortcuts if the permission changed.
|
||||||
|
mModel.refreshShortcutsIfRequired();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldShowDiscoveryBounce()) {
|
if (shouldShowDiscoveryBounce()) {
|
||||||
|
|||||||
@@ -146,6 +146,20 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
// Maps all launcher activities to the id's of their shortcuts (if they have any).
|
// Maps all launcher activities to the id's of their shortcuts (if they have any).
|
||||||
private final MultiHashMap<ComponentKey, String> mBgDeepShortcutMap = new MultiHashMap<>();
|
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
|
// 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
|
// 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
|
// 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 (resetAllAppsLoaded) mAllAppsLoaded = false;
|
||||||
if (resetWorkspaceLoaded) mWorkspaceLoaded = false;
|
if (resetWorkspaceLoaded) mWorkspaceLoaded = false;
|
||||||
// Always reset deep shortcuts loaded.
|
// Always reset deep shortcuts loaded.
|
||||||
|
// TODO: why?
|
||||||
mDeepShortcutsLoaded = false;
|
mDeepShortcutsLoaded = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1299,6 +1314,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
// If there is already one running, tell it to stop.
|
// If there is already one running, tell it to stop.
|
||||||
stopLoaderLocked();
|
stopLoaderLocked();
|
||||||
mLoaderTask = new LoaderTask(mApp.getContext(), synchronousBindPage);
|
mLoaderTask = new LoaderTask(mApp.getContext(), synchronousBindPage);
|
||||||
|
// TODO: mDeepShortcutsLoaded does not need to be true for synchronous bind.
|
||||||
if (synchronousBindPage != PagedView.INVALID_RESTORE_PAGE && mAllAppsLoaded
|
if (synchronousBindPage != PagedView.INVALID_RESTORE_PAGE && mAllAppsLoaded
|
||||||
&& mWorkspaceLoaded && mDeepShortcutsLoaded && !mIsLoaderTaskRunning) {
|
&& mWorkspaceLoaded && mDeepShortcutsLoaded && !mIsLoaderTaskRunning) {
|
||||||
mLoaderTask.runBindSynchronousPage(synchronousBindPage);
|
mLoaderTask.runBindSynchronousPage(synchronousBindPage);
|
||||||
@@ -2793,11 +2809,14 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
}
|
}
|
||||||
if (!mDeepShortcutsLoaded) {
|
if (!mDeepShortcutsLoaded) {
|
||||||
mBgDeepShortcutMap.clear();
|
mBgDeepShortcutMap.clear();
|
||||||
for (UserHandleCompat user : mUserManager.getUserProfiles()) {
|
mHasShortcutHostPermission = mDeepShortcutManager.hasHostPermission();
|
||||||
if (mUserManager.isUserUnlocked(user)) {
|
if (mHasShortcutHostPermission) {
|
||||||
List<ShortcutInfoCompat> shortcuts = mDeepShortcutManager
|
for (UserHandleCompat user : mUserManager.getUserProfiles()) {
|
||||||
.queryForAllShortcuts(user);
|
if (mUserManager.isUserUnlocked(user)) {
|
||||||
updateDeepShortcutMap(null, user, shortcuts);
|
List<ShortcutInfoCompat> shortcuts = mDeepShortcutManager
|
||||||
|
.queryForAllShortcuts(user);
|
||||||
|
updateDeepShortcutMap(null, user, shortcuts);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
synchronized (LoaderTask.this) {
|
synchronized (LoaderTask.this) {
|
||||||
@@ -2862,6 +2881,18 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
runOnMainThread(r);
|
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.
|
* Called when the icons for packages have been updated in the icon cache.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -224,4 +224,16 @@ public class DeepShortcutManager {
|
|||||||
return Collections.EMPTY_LIST;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user