Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04731773 authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Deleting the unrestored widget id synchronously

> We are making the DB call (IO) on the UI thread which is costlier than
the AppWidgetHost call.
> The process can get killed after the broadcast receiver returns, which
can prevent these ids from getting deleted.

Change-Id: I47746cf03d0eae573b6baa25cde9e573fd1f1a60
parent b8f00da8
Loading
Loading
Loading
Loading
+3 −22
Original line number Original line Diff line number Diff line
@@ -9,17 +9,13 @@ import android.content.ContentValues;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.database.Cursor;
import android.database.Cursor;
import android.os.AsyncTask;
import android.util.Log;
import android.util.Log;


import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.LauncherSettings.Favorites;


import java.util.ArrayList;
import java.util.List;

public class AppWidgetsRestoredReceiver extends BroadcastReceiver {
public class AppWidgetsRestoredReceiver extends BroadcastReceiver {


    private static final String TAG = "AppWidgetsRestoredReceiver";
    private static final String TAG = "AWRestoredReceiver";


    @Override
    @Override
    public void onReceive(Context context, Intent intent) {
    public void onReceive(Context context, Intent intent) {
@@ -39,8 +35,8 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver {
     */
     */
    static void restoreAppWidgetIds(Context context, int[] oldWidgetIds, int[] newWidgetIds) {
    static void restoreAppWidgetIds(Context context, int[] oldWidgetIds, int[] newWidgetIds) {
        final ContentResolver cr = context.getContentResolver();
        final ContentResolver cr = context.getContentResolver();
        final List<Integer> idsToRemove = new ArrayList<Integer>();
        final AppWidgetManager widgets = AppWidgetManager.getInstance(context);
        final AppWidgetManager widgets = AppWidgetManager.getInstance(context);
        AppWidgetHost appWidgetHost = new AppWidgetHost(context, Launcher.APPWIDGET_HOST_ID);


        for (int i = 0; i < oldWidgetIds.length; i++) {
        for (int i = 0; i < oldWidgetIds.length; i++) {
            Log.i(TAG, "Widget state restore id " + oldWidgetIds[i] + " => " + newWidgetIds[i]);
            Log.i(TAG, "Widget state restore id " + oldWidgetIds[i] + " => " + newWidgetIds[i]);
@@ -69,28 +65,13 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver {
                try {
                try {
                    if (!cursor.moveToFirst()) {
                    if (!cursor.moveToFirst()) {
                        // The widget no long exists.
                        // The widget no long exists.
                        idsToRemove.add(newWidgetIds[i]);
                        appWidgetHost.deleteAppWidgetId(newWidgetIds[i]);
                    }
                    }
                } finally {
                } finally {
                    cursor.close();
                    cursor.close();
                }
                }
            }
            }
        }
        }
        // Unregister the widget IDs which are not present on the workspace. This could happen
        // when a widget place holder is removed from workspace, before this method is called.
        if (!idsToRemove.isEmpty()) {
            final AppWidgetHost appWidgetHost =
                    new AppWidgetHost(context, Launcher.APPWIDGET_HOST_ID);
            new AsyncTask<Void, Void, Void>() {
                public Void doInBackground(Void ... args) {
                    for (Integer id : idsToRemove) {
                        appWidgetHost.deleteAppWidgetId(id);
                        Log.e(TAG, "Widget no longer present, appWidgetId=" + id);
                    }
                    return null;
                }
            }.executeOnExecutor(Utilities.THREAD_POOL_EXECUTOR);
        }


        LauncherAppState app = LauncherAppState.getInstanceNoCreate();
        LauncherAppState app = LauncherAppState.getInstanceNoCreate();
        if (app != null) {
        if (app != null) {