summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
authorRomain Guy <romainguy@android.com>2010-01-13 12:20:59 -0800
committerRomain Guy <romainguy@android.com>2010-01-13 12:20:59 -0800
commit629de3ef739883c0962423cc0c3a26299f162d3d (patch)
tree6475842d514351b0993979b231a943b1ea1b4f11 /src/com/android
parent5c16f3ecd6b47bff3abbe40deb3d39c66a3b0012 (diff)
downloadandroid_packages_apps_Trebuchet-629de3ef739883c0962423cc0c3a26299f162d3d.tar.gz
android_packages_apps_Trebuchet-629de3ef739883c0962423cc0c3a26299f162d3d.tar.bz2
android_packages_apps_Trebuchet-629de3ef739883c0962423cc0c3a26299f162d3d.zip
Remove widgets when the corresponding apk is uninstalled.
Bug #2298872
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/launcher2/LauncherAppWidgetInfo.java3
-rw-r--r--src/com/android/launcher2/LauncherModel.java43
-rw-r--r--src/com/android/launcher2/Workspace.java158
3 files changed, 121 insertions, 83 deletions
diff --git a/src/com/android/launcher2/LauncherAppWidgetInfo.java b/src/com/android/launcher2/LauncherAppWidgetInfo.java
index 25db72bed..a28973bc4 100644
--- a/src/com/android/launcher2/LauncherAppWidgetInfo.java
+++ b/src/com/android/launcher2/LauncherAppWidgetInfo.java
@@ -25,7 +25,8 @@ import android.content.ContentValues;
class LauncherAppWidgetInfo extends ItemInfo {
/**
- * Identifier for this widget when talking with {@link AppWidgetManager} for updates.
+ * Identifier for this widget when talking with
+ * {@link android.appwidget.AppWidgetManager} for updates.
*/
int appWidgetId;
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 29de3f7cc..7eb240faf 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -16,6 +16,8 @@
package com.android.launcher2;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentProviderClient;
@@ -605,6 +607,7 @@ public class LauncherModel extends BroadcastReceiver {
final Context context = mContext;
final ContentResolver contentResolver = context.getContentResolver();
final PackageManager manager = context.getPackageManager();
+ final AppWidgetManager widgets = AppWidgetManager.getInstance(context);
final boolean isSafeMode = manager.isSafeMode();
/* TODO
@@ -788,23 +791,33 @@ public class LauncherModel extends BroadcastReceiver {
case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
// Read all Launcher-specific widget details
int appWidgetId = c.getInt(appWidgetIdIndex);
- appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId);
- appWidgetInfo.id = c.getLong(idIndex);
- appWidgetInfo.screen = c.getInt(screenIndex);
- appWidgetInfo.cellX = c.getInt(cellXIndex);
- appWidgetInfo.cellY = c.getInt(cellYIndex);
- appWidgetInfo.spanX = c.getInt(spanXIndex);
- appWidgetInfo.spanY = c.getInt(spanYIndex);
+ id = c.getLong(idIndex);
- container = c.getInt(containerIndex);
- if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP) {
- Log.e(TAG, "Widget found where container "
- + "!= CONTAINER_DESKTOP -- ignoring!");
- continue;
+ final AppWidgetProviderInfo provider =
+ widgets.getAppWidgetInfo(appWidgetId);
+
+ if (!isSafeMode && (provider == null || provider.provider == null ||
+ provider.provider.getPackageName() == null)) {
+ itemsToRemove.add(id);
+ } else {
+ appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId);
+ appWidgetInfo.id = id;
+ appWidgetInfo.screen = c.getInt(screenIndex);
+ appWidgetInfo.cellX = c.getInt(cellXIndex);
+ appWidgetInfo.cellY = c.getInt(cellYIndex);
+ appWidgetInfo.spanX = c.getInt(spanXIndex);
+ appWidgetInfo.spanY = c.getInt(spanYIndex);
+
+ container = c.getInt(containerIndex);
+ if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP) {
+ Log.e(TAG, "Widget found where container "
+ + "!= CONTAINER_DESKTOP -- ignoring!");
+ continue;
+ }
+ appWidgetInfo.container = c.getInt(containerIndex);
+
+ mAppWidgets.add(appWidgetInfo);
}
- appWidgetInfo.container = c.getInt(containerIndex);
-
- mAppWidgets.add(appWidgetInfo);
break;
}
} catch (Exception e) {
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 21f90709b..9abf562d9 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -17,6 +17,8 @@
package com.android.launcher2;
import android.app.WallpaperManager;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
import android.content.Intent;
import android.content.ComponentName;
@@ -1158,84 +1160,106 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag
mAllowLongPress = allowLongPress;
}
- void removeItemsForPackage(String packageName) {
- final ArrayList<View> childrenToRemove = new ArrayList<View>();
+ void removeItemsForPackage(final String packageName) {
final int count = getChildCount();
final PackageManager manager = getContext().getPackageManager();
+ final AppWidgetManager widgets = AppWidgetManager.getInstance(getContext());
for (int i = 0; i < count; i++) {
final CellLayout layout = (CellLayout) getChildAt(i);
- int childCount = layout.getChildCount();
-
- childrenToRemove.clear();
-
- for (int j = 0; j < childCount; j++) {
- final View view = layout.getChildAt(j);
- Object tag = view.getTag();
-
- if (tag instanceof ApplicationInfo) {
- final ApplicationInfo info = (ApplicationInfo) tag;
- // We need to check for ACTION_MAIN otherwise getComponent() might
- // return null for some shortcuts (for instance, for shortcuts to
- // web pages.)
- final Intent intent = info.intent;
- final ComponentName name = intent.getComponent();
- if (Intent.ACTION_MAIN.equals(intent.getAction()) &&
- name != null && packageName.equals(name.getPackageName())) {
- LauncherModel.deleteItemFromDatabase(mLauncher, info);
- childrenToRemove.add(view);
- }
- } else if (tag instanceof UserFolderInfo) {
- final UserFolderInfo info = (UserFolderInfo) tag;
- final ArrayList<ApplicationInfo> contents = info.contents;
- final ArrayList<ApplicationInfo> toRemove = new ArrayList<ApplicationInfo>(1);
- final int contentsCount = contents.size();
- boolean removedFromFolder = false;
-
- for (int k = 0; k < contentsCount; k++) {
- final ApplicationInfo appInfo = contents.get(k);
- final Intent intent = appInfo.intent;
- final ComponentName name = intent.getComponent();
-
- if (Intent.ACTION_MAIN.equals(intent.getAction()) &&
- name != null && packageName.equals(name.getPackageName())) {
- toRemove.add(appInfo);
- LauncherModel.deleteItemFromDatabase(mLauncher, appInfo);
- removedFromFolder = true;
+ // Avoid ANRs by treating each screen separately
+ post(new Runnable() {
+ public void run() {
+ final ArrayList<View> childrenToRemove = new ArrayList<View>();
+ childrenToRemove.clear();
+
+ int childCount = layout.getChildCount();
+ for (int j = 0; j < childCount; j++) {
+ final View view = layout.getChildAt(j);
+ Object tag = view.getTag();
+
+ if (tag instanceof ApplicationInfo) {
+ final ApplicationInfo info = (ApplicationInfo) tag;
+ // We need to check for ACTION_MAIN otherwise getComponent() might
+ // return null for some shortcuts (for instance, for shortcuts to
+ // web pages.)
+ final Intent intent = info.intent;
+ final ComponentName name = intent.getComponent();
+
+ if (Intent.ACTION_MAIN.equals(intent.getAction()) &&
+ name != null && packageName.equals(name.getPackageName())) {
+ // TODO: This should probably be done on a worker thread
+ LauncherModel.deleteItemFromDatabase(mLauncher, info);
+ childrenToRemove.add(view);
+ }
+ } else if (tag instanceof UserFolderInfo) {
+ final UserFolderInfo info = (UserFolderInfo) tag;
+ final ArrayList<ApplicationInfo> contents = info.contents;
+ final ArrayList<ApplicationInfo> toRemove =
+ new ArrayList<ApplicationInfo>(1);
+ final int contentsCount = contents.size();
+ boolean removedFromFolder = false;
+
+ for (int k = 0; k < contentsCount; k++) {
+ final ApplicationInfo appInfo = contents.get(k);
+ final Intent intent = appInfo.intent;
+ final ComponentName name = intent.getComponent();
+
+ if (Intent.ACTION_MAIN.equals(intent.getAction()) &&
+ name != null && packageName.equals(name.getPackageName())) {
+ toRemove.add(appInfo);
+ // TODO: This should probably be done on a worker thread
+ LauncherModel.deleteItemFromDatabase(mLauncher, appInfo);
+ removedFromFolder = true;
+ }
+ }
+
+ contents.removeAll(toRemove);
+ if (removedFromFolder) {
+ final Folder folder = getOpenFolder();
+ if (folder != null) folder.notifyDataSetChanged();
+ }
+ } else if (tag instanceof LiveFolderInfo) {
+ final LiveFolderInfo info = (LiveFolderInfo) tag;
+ final Uri uri = info.uri;
+ final ProviderInfo providerInfo = manager.resolveContentProvider(
+ uri.getAuthority(), 0);
+
+ if (providerInfo == null ||
+ packageName.equals(providerInfo.packageName)) {
+ // TODO: This should probably be done on a worker thread
+ LauncherModel.deleteItemFromDatabase(mLauncher, info);
+ childrenToRemove.add(view);
+ }
+ } else if (tag instanceof LauncherAppWidgetInfo) {
+ final LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) tag;
+ final AppWidgetProviderInfo provider =
+ widgets.getAppWidgetInfo(info.appWidgetId);
+ if (provider == null ||
+ packageName.equals(provider.provider.getPackageName())) {
+ // TODO: This should probably be done on a worker thread
+ LauncherModel.deleteItemFromDatabase(mLauncher, info);
+ childrenToRemove.add(view);
+ }
}
}
-
- contents.removeAll(toRemove);
- if (removedFromFolder) {
- final Folder folder = getOpenFolder();
- if (folder != null) folder.notifyDataSetChanged();
+
+ childCount = childrenToRemove.size();
+ for (int j = 0; j < childCount; j++) {
+ View child = childrenToRemove.get(j);
+ layout.removeViewInLayout(child);
+ if (child instanceof DropTarget) {
+ mDragController.removeDropTarget((DropTarget)child);
+ }
}
- } else if (tag instanceof LiveFolderInfo) {
- final LiveFolderInfo info = (LiveFolderInfo) tag;
- final Uri uri = info.uri;
- final ProviderInfo providerInfo = manager.resolveContentProvider(
- uri.getAuthority(), 0);
- if (providerInfo == null || packageName.equals(providerInfo.packageName)) {
- LauncherModel.deleteItemFromDatabase(mLauncher, info);
- childrenToRemove.add(view);
+
+ if (childCount > 0) {
+ layout.requestLayout();
+ layout.invalidate();
}
}
- }
-
- childCount = childrenToRemove.size();
- for (int j = 0; j < childCount; j++) {
- View child = childrenToRemove.get(j);
- layout.removeViewInLayout(child);
- if (child instanceof DropTarget) {
- mDragController.removeDropTarget((DropTarget)child);
- }
- }
-
- if (childCount > 0) {
- layout.requestLayout();
- layout.invalidate();
- }
+ });
}
}