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
This commit is contained in:
Robin Lee
2015-03-16 19:41:43 +00:00
parent 0f93d5e718
commit 26ace12135
4 changed files with 36 additions and 25 deletions
+1 -1
View File
@@ -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)
@@ -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;
+27 -20
View File
@@ -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;
Collection<CustomAppWidget> customWidgets = Launcher.getCustomAppWidgets().values();
for (CustomAppWidget widget : customWidgets) {
info = new LauncherAppWidgetProviderInfo(context, widget);
sBgWidgetProviders.put(info.provider, 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);
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));
}
}
+2 -1
View File
@@ -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 {