diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index c6cb779c4a..9569ec6b21 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2398,11 +2398,13 @@ public class Launcher extends Activity } } 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 @@ public class Launcher extends Activity } /** - * 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() { @@ -2432,8 +2433,7 @@ public class Launcher extends Activity } }.executeOnExecutor(Utilities.THREAD_POOL_EXECUTOR); } - removeWidgetToAutoAdvance(widgetInfo.hostView); - widgetInfo.hostView = null; + LauncherModel.deleteItemFromDatabase(this, widgetInfo); } @Override @@ -4001,6 +4001,15 @@ public class Launcher extends Activity + 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;