From cdb3c0af1ab664291027bf296fe96bcea7880cdf Mon Sep 17 00:00:00 2001 From: Sihua Ma Date: Mon, 13 Feb 2023 15:12:32 -0800 Subject: [PATCH] Use app widget host instead of holder to get rid of deleteHost Also putting the calls to destroy() in try-finally blocks. Test: N/A Fix: 272535886 Change-Id: I57ecd90e412b3b8b59b4ed755a5d4191b05fd9b3 --- .../launcher3/AppWidgetsRestoredReceiver.java | 9 +-- .../android/launcher3/LauncherProvider.java | 59 ++++++++++--------- .../launcher3/provider/RestoreDbTask.java | 8 +-- .../widget/LauncherWidgetHolder.java | 7 --- 4 files changed, 39 insertions(+), 44 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java index eb6d096602..9d5b08eab5 100644 --- a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java +++ b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java @@ -2,6 +2,7 @@ package com.android.launcher3; import static android.os.Process.myUserHandle; +import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.BroadcastReceiver; @@ -51,10 +52,10 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { */ @WorkerThread public static void restoreAppWidgetIds(Context context, int[] oldWidgetIds, int[] newWidgetIds, - @NonNull LauncherWidgetHolder holder) { + @NonNull AppWidgetHost host) { if (WidgetsModel.GO_DISABLE_WIDGETS) { Log.e(TAG, "Skipping widget ID remap as widgets not supported"); - holder.deleteHost(); + host.deleteHost(); return; } if (!RestoreDbTask.isPending(context)) { @@ -63,7 +64,7 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { Log.e(TAG, "Skipping widget ID remap as DB already in use"); for (int widgetId : newWidgetIds) { Log.d(TAG, "Deleting widgetId: " + widgetId); - holder.deleteAppWidgetId(widgetId); + host.deleteAppWidgetId(widgetId); } return; } @@ -100,7 +101,7 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { try { if (!cursor.moveToFirst()) { // The widget no long exists. - holder.deleteAppWidgetId(newWidgetIds[i]); + host.deleteAppWidgetId(newWidgetIds[i]); } } finally { cursor.close(); diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index 767c3d986e..bccb894343 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -550,39 +550,42 @@ public class LauncherProvider extends ContentProvider { Log.d(TAG, "loading default workspace"); LauncherWidgetHolder widgetHolder = mOpenHelper.newLauncherWidgetHolder(); - AutoInstallsLayout loader = createWorkspaceLoaderFromAppRestriction(widgetHolder); - if (loader == null) { - loader = AutoInstallsLayout.get(getContext(), widgetHolder, mOpenHelper); - } - if (loader == null) { - final Partner partner = Partner.get(getContext().getPackageManager()); - if (partner != null) { - int workspaceResId = partner.getXmlResId(RES_PARTNER_DEFAULT_LAYOUT); - if (workspaceResId != 0) { - loader = new DefaultLayoutParser(getContext(), widgetHolder, - mOpenHelper, partner.getResources(), workspaceResId); + try { + AutoInstallsLayout loader = createWorkspaceLoaderFromAppRestriction(widgetHolder); + if (loader == null) { + loader = AutoInstallsLayout.get(getContext(), widgetHolder, mOpenHelper); + } + if (loader == null) { + final Partner partner = Partner.get(getContext().getPackageManager()); + if (partner != null) { + int workspaceResId = partner.getXmlResId(RES_PARTNER_DEFAULT_LAYOUT); + if (workspaceResId != 0) { + loader = new DefaultLayoutParser(getContext(), widgetHolder, + mOpenHelper, partner.getResources(), workspaceResId); + } } } - } - final boolean usingExternallyProvidedLayout = loader != null; - if (loader == null) { - loader = getDefaultLayoutParser(widgetHolder); - } + final boolean usingExternallyProvidedLayout = loader != null; + if (loader == null) { + loader = getDefaultLayoutParser(widgetHolder); + } - // There might be some partially restored DB items, due to buggy restore logic in - // previous versions of launcher. - mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase()); - // Populate favorites table with initial favorites - if ((mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(), loader) <= 0) - && usingExternallyProvidedLayout) { - // Unable to load external layout. Cleanup and load the internal layout. + // There might be some partially restored DB items, due to buggy restore logic in + // previous versions of launcher. mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase()); - mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(), - getDefaultLayoutParser(widgetHolder)); + // Populate favorites table with initial favorites + if ((mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(), loader) <= 0) + && usingExternallyProvidedLayout) { + // Unable to load external layout. Cleanup and load the internal layout. + mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase()); + mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(), + getDefaultLayoutParser(widgetHolder)); + } + clearFlagEmptyDbCreated(); + } finally { + widgetHolder.destroy(); } - clearFlagEmptyDbCreated(); - widgetHolder.destroy(); } } @@ -957,8 +960,6 @@ public class LauncherProvider extends ContentProvider { allWidgets = holder.getAppWidgetIds(); } catch (IncompatibleClassChangeError e) { Log.e(TAG, "getAppWidgetIds not supported", e); - // Necessary to destroy the holder to free up possible activity context - holder.destroy(); return; } final IntSet validWidgets = IntSet.wrap(LauncherDbUtils.queryIntArray(false, db, diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index 2a452be8dd..3a5ef10c59 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -21,8 +21,10 @@ import static com.android.launcher3.LauncherPrefs.APP_WIDGET_IDS; import static com.android.launcher3.LauncherPrefs.OLD_APP_WIDGET_IDS; import static com.android.launcher3.LauncherPrefs.RESTORE_DEVICE; import static com.android.launcher3.provider.LauncherDbUtils.dropTable; +import static com.android.launcher3.widget.LauncherWidgetHolder.APPWIDGET_HOST_ID; import android.app.backup.BackupManager; +import android.appwidget.AppWidgetHost; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; @@ -49,7 +51,6 @@ import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.LogConfig; -import com.android.launcher3.widget.LauncherWidgetHolder; import java.io.InvalidObjectException; import java.util.Arrays; @@ -354,12 +355,11 @@ public class RestoreDbTask { private void restoreAppWidgetIdsIfExists(Context context) { LauncherPrefs lp = LauncherPrefs.get(context); if (lp.has(APP_WIDGET_IDS, OLD_APP_WIDGET_IDS)) { - LauncherWidgetHolder holder = LauncherWidgetHolder.newInstance(context); + AppWidgetHost host = new AppWidgetHost(context, APPWIDGET_HOST_ID); AppWidgetsRestoredReceiver.restoreAppWidgetIds(context, IntArray.fromConcatString(lp.get(OLD_APP_WIDGET_IDS)).toArray(), IntArray.fromConcatString(lp.get(APP_WIDGET_IDS)).toArray(), - holder); - holder.destroy(); + host); } else { FileLog.d(TAG, "No app widget ids to restore."); } diff --git a/src/com/android/launcher3/widget/LauncherWidgetHolder.java b/src/com/android/launcher3/widget/LauncherWidgetHolder.java index bea7517c91..8e67eb110b 100644 --- a/src/com/android/launcher3/widget/LauncherWidgetHolder.java +++ b/src/com/android/launcher3/widget/LauncherWidgetHolder.java @@ -321,13 +321,6 @@ public class LauncherWidgetHolder { mFlags &= ~FLAG_LISTENING; } - /** - * Delete the host - */ - public void deleteHost() { - mWidgetHost.deleteHost(); - } - /** * @return The app widget ids */