summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLouis Begin <w15621@motorola.com>2016-08-15 15:18:41 -0700
committerSunny Goyal <sunnygoyal@google.com>2016-08-16 12:43:05 -0700
commita9c21c624ca15fe7aa5e65e17cdd9fb26d1ec691 (patch)
tree60aa35fe9c92880962471c89f02a5c7f6b9de38b /src
parentb9b41b835ede0d1d3dc0f050e174150ff5084692 (diff)
downloadandroid_packages_apps_Trebuchet-a9c21c624ca15fe7aa5e65e17cdd9fb26d1ec691.tar.gz
android_packages_apps_Trebuchet-a9c21c624ca15fe7aa5e65e17cdd9fb26d1ec691.tar.bz2
android_packages_apps_Trebuchet-a9c21c624ca15fe7aa5e65e17cdd9fb26d1ec691.zip
Improve handling of external deletion in LauncherProvider.delete
When deleting a widget, ensure that we also delete the corresponding widget from the system server Bug 30835877 Change-Id: I7d539c2d37ef53086d09ae128f7278941f804aeb
Diffstat (limited to 'src')
-rw-r--r--src/com/android/launcher3/LauncherProvider.java29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index eee562781..f3d949326 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -67,6 +67,7 @@ import com.android.launcher3.util.Thunk;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Locale;
public class LauncherProvider extends ContentProvider {
private static final String TAG = "LauncherProvider";
@@ -313,10 +314,32 @@ public class LauncherProvider extends ContentProvider {
SqlArguments args = new SqlArguments(uri, selection, selectionArgs);
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- int count = db.delete(args.table, args.where, args.args);
- if (count > 0) notifyListeners();
- reloadLauncherIfExternal();
+ if (Binder.getCallingPid() != Process.myPid()
+ && Favorites.TABLE_NAME.equalsIgnoreCase(args.table)) {
+ String widgetSelection = TextUtils.isEmpty(args.where) ? "1=1" : args.where;
+ widgetSelection = String.format(Locale.ENGLISH, "%1$s = %2$d AND ( %3$s )",
+ Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_APPWIDGET, widgetSelection);
+ try (Cursor c = db.query(Favorites.TABLE_NAME, new String[] { Favorites.APPWIDGET_ID },
+ widgetSelection, args.args, null, null, null)) {
+ AppWidgetHost host = new AppWidgetHost(getContext(), Launcher.APPWIDGET_HOST_ID);
+ while (c.moveToNext()) {
+ int widgetId = c.getInt(0);
+ if (widgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
+ try {
+ host.deleteAppWidgetId(widgetId);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Error deleting widget id " + widgetId, e);
+ }
+ }
+ }
+ }
+ }
+ int count = db.delete(args.table, args.where, args.args);
+ if (count > 0) {
+ notifyListeners();
+ reloadLauncherIfExternal();
+ }
return count;
}