diff options
author | Robin Lee <rgl@google.com> | 2015-03-16 19:41:43 +0000 |
---|---|---|
committer | Robin Lee <rgl@google.com> | 2015-03-19 21:23:13 +0000 |
commit | 26ace12135a662ad864678c9fede9817e5c02b67 (patch) | |
tree | 213333d0209a2753c2e0028dab46f69a28c41e7e /src | |
parent | 0f93d5e718444fd636c84c239fcff4119e064864 (diff) | |
download | android_packages_apps_Trebuchet-26ace12135a662ad864678c9fede9817e5c02b67.tar.gz android_packages_apps_Trebuchet-26ace12135a662ad864678c9fede9817e5c02b67.tar.bz2 android_packages_apps_Trebuchet-26ace12135a662ad864678c9fede9817e5c02b67.zip |
Don't clobber widgets with the same component.
By not storing them in a HashMap keyed against ComponentName (which is
almost guaranteed to conflict with other widgets when managed profiles
are in play).
Bug: 19444068
Change-Id: I6ffce78e8aaf265196239670404cbdaff9fa09be
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher3/Launcher.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherBackupHelper.java | 9 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherModel.java | 47 | ||||
-rw-r--r-- | src/com/android/launcher3/Workspace.java | 3 |
4 files changed, 36 insertions, 25 deletions
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index d64296e79..cc63f3a4f 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3872,7 +3872,7 @@ public class Launcher extends Activity final Workspace workspace = mWorkspace; LauncherAppWidgetProviderInfo appWidgetInfo = - LauncherModel.getProviderInfo(this, item.providerName); + LauncherModel.getProviderInfo(this, item.providerName, item.user); if (!mIsSafeModeEnabled && ((item.restoreStatus & LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY) == 0) diff --git a/src/com/android/launcher3/LauncherBackupHelper.java b/src/com/android/launcher3/LauncherBackupHelper.java index 7849e5335..57f92bc20 100644 --- a/src/com/android/launcher3/LauncherBackupHelper.java +++ b/src/com/android/launcher3/LauncherBackupHelper.java @@ -668,7 +668,10 @@ public class LauncherBackupHelper implements BackupHelper { previewLoader.setPreviewSize( spanX * profile.cellWidthPx, spanY * profile.cellHeightPx); - writeRowToBackup(key, packWidget(dpi, previewLoader, mIconCache, provider), data); + UserHandleCompat user = UserHandleCompat.myUserHandle(); + writeRowToBackup(key, + packWidget(dpi, previewLoader, mIconCache, provider, user), + data); mKeys.add(key); backupWidgetCount ++; } else { @@ -978,9 +981,9 @@ public class LauncherBackupHelper implements BackupHelper { /** Serialize a widget for persistence, including a checksum wrapper. */ private Widget packWidget(int dpi, WidgetPreviewLoader previewLoader, IconCache iconCache, - ComponentName provider) { + ComponentName provider, UserHandleCompat user) { final LauncherAppWidgetProviderInfo info = - LauncherModel.getProviderInfo(mContext, provider); + LauncherModel.getProviderInfo(mContext, provider, user); Widget widget = new Widget(); widget.provider = provider.flattenToShortString(); widget.label = info.label; diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 1e16bafe8..135930146 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -58,6 +58,7 @@ import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.util.ComponentKey; import java.lang.ref.WeakReference; import java.net.URISyntaxException; @@ -166,7 +167,7 @@ public class LauncherModel extends BroadcastReceiver static final ArrayList<Long> sBgWorkspaceScreens = new ArrayList<Long>(); // sBgWidgetProviders is the set of widget providers including custom internal widgets - public static HashMap<ComponentName, LauncherAppWidgetProviderInfo> sBgWidgetProviders; + public static HashMap<ComponentKey, LauncherAppWidgetProviderInfo> sBgWidgetProviders; // sPendingPackages is a set of packages which could be on sdcard and are not available yet static final HashMap<UserHandleCompat, HashSet<String>> sPendingPackages = @@ -1872,6 +1873,7 @@ public class LauncherModel extends BroadcastReceiver LauncherAppWidgetInfo appWidgetInfo; int container; long id; + long serialNumber; Intent intent; UserHandleCompat user; @@ -1886,7 +1888,7 @@ public class LauncherModel extends BroadcastReceiver case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: id = c.getLong(idIndex); intentDescription = c.getString(intentIndex); - long serialNumber = c.getInt(profileIdIndex); + serialNumber = c.getInt(profileIdIndex); user = mUserManager.getUserForSerialNumber(serialNumber); int promiseType = c.getInt(restoredIndex); int disabledState = 0; @@ -2150,6 +2152,7 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET; int appWidgetId = c.getInt(appWidgetIdIndex); + serialNumber= c.getLong(profileIdIndex); String savedProvider = c.getString(appWidgetProviderIndex); id = c.getLong(idIndex); final ComponentName component = @@ -2164,7 +2167,8 @@ public class LauncherModel extends BroadcastReceiver final LauncherAppWidgetProviderInfo provider = LauncherModel.getProviderInfo(context, - ComponentName.unflattenFromString(savedProvider)); + ComponentName.unflattenFromString(savedProvider), + mUserManager.getUserForSerialNumber(serialNumber)); final boolean isProviderReady = isValidProvider(provider); if (!isSafeMode && !customWidget && @@ -3283,33 +3287,36 @@ public class LauncherModel extends BroadcastReceiver public static List<LauncherAppWidgetProviderInfo> getWidgetProviders(Context context, boolean refresh) { synchronized (sBgLock) { - if (sBgWidgetProviders != null && !refresh) { - return new ArrayList<LauncherAppWidgetProviderInfo>(sBgWidgetProviders.values()); - } - sBgWidgetProviders = new HashMap<ComponentName, LauncherAppWidgetProviderInfo>(); - List<AppWidgetProviderInfo> widgets = - AppWidgetManagerCompat.getInstance(context).getAllProviders(); - LauncherAppWidgetProviderInfo info; - for (AppWidgetProviderInfo pInfo : widgets) { - info = LauncherAppWidgetProviderInfo.fromProviderInfo(context, pInfo); - sBgWidgetProviders.put(info.provider, info); - } + if (sBgWidgetProviders == null || refresh) { + sBgWidgetProviders = new HashMap<>(); + AppWidgetManagerCompat wm = AppWidgetManagerCompat.getInstance(context); + LauncherAppWidgetProviderInfo info; + + List<AppWidgetProviderInfo> widgets = wm.getAllProviders(); + for (AppWidgetProviderInfo pInfo : widgets) { + info = LauncherAppWidgetProviderInfo.fromProviderInfo(context, pInfo); + UserHandleCompat user = wm.getUser(info); + sBgWidgetProviders.put(new ComponentKey(info.provider, user), info); + } - Collection<CustomAppWidget> customWidgets = Launcher.getCustomAppWidgets().values(); - for (CustomAppWidget widget : customWidgets) { - info = new LauncherAppWidgetProviderInfo(context, widget); - sBgWidgetProviders.put(info.provider, info); + Collection<CustomAppWidget> customWidgets = Launcher.getCustomAppWidgets().values(); + for (CustomAppWidget widget : customWidgets) { + info = new LauncherAppWidgetProviderInfo(context, widget); + UserHandleCompat user = wm.getUser(info); + sBgWidgetProviders.put(new ComponentKey(info.provider, user), info); + } } return new ArrayList<LauncherAppWidgetProviderInfo>(sBgWidgetProviders.values()); } } - public static LauncherAppWidgetProviderInfo getProviderInfo(Context ctx, ComponentName name) { + public static LauncherAppWidgetProviderInfo getProviderInfo(Context ctx, ComponentName name, + UserHandleCompat user) { synchronized (sBgLock) { if (sBgWidgetProviders == null) { getWidgetProviders(ctx, false /* refresh */); } - return sBgWidgetProviders.get(name); + return sBgWidgetProviders.get(new ComponentKey(name, user)); } } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 7ebdf3ace..7df801da5 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -4878,7 +4878,8 @@ public class Workspace extends SmoothPagedView DeferredWidgetRefresh widgetRefresh = new DeferredWidgetRefresh(changedInfo, mLauncher.getAppWidgetHost()); if (LauncherModel.getProviderInfo(getContext(), - changedInfo.get(0).providerName) != null) { + changedInfo.get(0).providerName, + changedInfo.get(0).user) != null) { // Re-inflate the widgets which have changed status widgetRefresh.run(); } else { |