Verify that the widget id is valid, before binding the widget
Bug: 23820213
Bug: 24054205
Bug: 24582322
Change-Id: I25a09b0a2a706812a7d82729b5dc554ffba84a2a
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index c6cb779..9569ec6 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -2398,11 +2398,13 @@
}
} else if (itemInfo instanceof LauncherAppWidgetInfo) {
final LauncherAppWidgetInfo widgetInfo = (LauncherAppWidgetInfo) itemInfo;
- unbindAppWidget(widgetInfo, deleteFromDb);
mWorkspace.removeWorkspaceItem(v);
+ removeWidgetToAutoAdvance(widgetInfo.hostView);
+ widgetInfo.hostView = null;
if (deleteFromDb) {
- LauncherModel.deleteItemFromDatabase(this, widgetInfo);
+ deleteWidgetInfo(widgetInfo);
}
+
} else {
return false;
}
@@ -2417,12 +2419,11 @@
}
/**
- * Unbinds any launcher references to the widget and deletes the app widget id.
+ * Deletes the widget info and the widget id.
*/
- private void unbindAppWidget(final LauncherAppWidgetInfo widgetInfo, boolean deleteAppWidgetId) {
+ private void deleteWidgetInfo(final LauncherAppWidgetInfo widgetInfo) {
final LauncherAppWidgetHost appWidgetHost = getAppWidgetHost();
- if (deleteAppWidgetId && appWidgetHost != null &&
- !widgetInfo.isCustomWidget() && widgetInfo.isWidgetIdValid()) {
+ if (appWidgetHost != null && !widgetInfo.isCustomWidget() && widgetInfo.isWidgetIdValid()) {
// Deleting an app widget ID is a void call but writes to disk before returning
// to the caller...
new AsyncTask<Void, Void, Void>() {
@@ -2432,8 +2433,7 @@
}
}.executeOnExecutor(Utilities.THREAD_POOL_EXECUTOR);
}
- removeWidgetToAutoAdvance(widgetInfo.hostView);
- widgetInfo.hostView = null;
+ LauncherModel.deleteItemFromDatabase(this, widgetInfo);
}
@Override
@@ -4001,6 +4001,15 @@
+ appWidgetInfo.provider);
}
+ // Verify that we own the widget
+ AppWidgetProviderInfo info = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
+ if (info == null || appWidgetInfo == null ||
+ !info.provider.equals(appWidgetInfo.provider)) {
+ Log.e(TAG, "Removing invalid widget: id=" + item.appWidgetId);
+ deleteWidgetInfo(item);
+ return;
+ }
+
item.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
item.minSpanX = appWidgetInfo.minSpanX;
item.minSpanY = appWidgetInfo.minSpanY;