Loading src/com/android/launcher3/Launcher.java +3 −31 Original line number Diff line number Diff line Loading @@ -52,7 +52,6 @@ import static com.android.launcher3.LauncherConstants.TraceEvents.ON_CREATE_EVT; import static com.android.launcher3.LauncherConstants.TraceEvents.ON_NEW_INTENT_EVT; import static com.android.launcher3.LauncherConstants.TraceEvents.ON_RESUME_EVT; import static com.android.launcher3.LauncherConstants.TraceEvents.ON_START_EVT; import static com.android.launcher3.LauncherPrefs.IS_FIRST_LOAD_AFTER_RESTORE; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET; Loading @@ -65,8 +64,6 @@ import static com.android.launcher3.LauncherState.NO_OFFSET; import static com.android.launcher3.LauncherState.NO_SCALE; import static com.android.launcher3.LauncherState.SPRING_LOADED; import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RESTORE_ERROR_BIND_FAILURE; import static com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RESTORE_ERROR_INVALID_LOCATION; import static com.android.launcher3.config.FeatureFlags.ENABLE_SMARTSPACE_REMOVAL; import static com.android.launcher3.config.FeatureFlags.FOLDABLE_SINGLE_PAGE; import static com.android.launcher3.config.FeatureFlags.MULTI_SELECT_EDIT_MODE; Loading Loading @@ -165,7 +162,6 @@ import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.PropertyListBuilder; import com.android.launcher3.apppairs.AppPairIcon; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger; import com.android.launcher3.celllayout.CellPosMapper; import com.android.launcher3.celllayout.CellPosMapper.CellPos; import com.android.launcher3.celllayout.CellPosMapper.TwoPanelCellPosMapper; Loading Loading @@ -2161,13 +2157,6 @@ public class Launcher extends StatefulActivity<LauncherState> int newItemsScreenId = -1; int end = items.size(); View newView = null; LauncherRestoreEventLogger restoreEventLogger = null; Boolean isRestoreFromBackup = (Boolean) LauncherPrefs.get(getApplicationContext()) .get(IS_FIRST_LOAD_AFTER_RESTORE); if (isRestoreFromBackup) { restoreEventLogger = LauncherRestoreEventLogger.Companion .newInstance(getApplicationContext()); } for (int i = 0; i < end; i++) { final ItemInfo item = items.get(i); // Short circuit if we are loading dock items for a configuration which has no dock Loading Loading @@ -2198,15 +2187,10 @@ public class Launcher extends StatefulActivity<LauncherState> } case ITEM_TYPE_APPWIDGET: case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: { view = inflateAppWidget((LauncherAppWidgetInfo) item, restoreEventLogger); view = inflateAppWidget((LauncherAppWidgetInfo) item); if (view == null) { continue; } // Widgets have more checks when inflating, so we have to wait until here // to mark restored, instead of logging in LoaderTask. if (restoreEventLogger != null) { restoreEventLogger.logSingleFavoritesItemRestored(item.itemType); } break; } default: Loading @@ -2230,10 +2214,6 @@ public class Launcher extends StatefulActivity<LauncherState> if (FeatureFlags.IS_STUDIO_BUILD) { throw (new RuntimeException(desc)); } else { if (restoreEventLogger != null) { restoreEventLogger.logSingleFavoritesItemRestoreFailed(item.itemType, RESTORE_ERROR_INVALID_LOCATION); } getModelWriter().deleteItemFromDatabase(item, desc); continue; } Loading Loading @@ -2292,9 +2272,6 @@ public class Launcher extends StatefulActivity<LauncherState> } else if (focusFirstItemForAccessibility && viewToFocus != null) { viewToFocus.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); } if (restoreEventLogger != null) { restoreEventLogger.reportLauncherRestoreResults(); } workspace.requestLayout(); } Loading @@ -2302,24 +2279,19 @@ public class Launcher extends StatefulActivity<LauncherState> * Add the views for a widget to the workspace. */ public void bindAppWidget(LauncherAppWidgetInfo item) { View view = inflateAppWidget(item, null); View view = inflateAppWidget(item); if (view != null) { mWorkspace.addInScreen(view, item); mWorkspace.requestLayout(); } } private View inflateAppWidget(LauncherAppWidgetInfo item, @Nullable LauncherRestoreEventLogger restoreEventLogger) { private View inflateAppWidget(LauncherAppWidgetInfo item) { TraceHelper.INSTANCE.beginSection("BIND_WIDGET_id=" + item.appWidgetId); try { InflationResult inflationResult = mWidgetInflater.inflateAppWidget(item); if (inflationResult.getType() == WidgetInflater.TYPE_DELETE) { getModelWriter().deleteItemFromDatabase(item, inflationResult.getReason()); if (restoreEventLogger != null) { restoreEventLogger.logSingleFavoritesItemRestoreFailed( ITEM_TYPE_APPWIDGET, RESTORE_ERROR_BIND_FAILURE); } return null; } Loading src/com/android/launcher3/backuprestore/LauncherRestoreEventLogger.kt +40 −13 Original line number Diff line number Diff line package com.android.launcher3.backuprestore import android.content.Context import androidx.annotation.StringDef import com.android.launcher3.LauncherSettings.Favorites import com.android.launcher3.R import com.android.launcher3.util.ResourceBasedOverride Loading @@ -11,19 +12,41 @@ import com.android.launcher3.util.ResourceBasedOverride */ open class LauncherRestoreEventLogger : ResourceBasedOverride { /** Enumeration of potential errors returned to calls of pause/resume app updates. */ @Retention(AnnotationRetention.SOURCE) @StringDef( RestoreError.PROFILE_DELETED, RestoreError.MISSING_INFO, RestoreError.MISSING_WIDGET_PROVIDER, RestoreError.INVALID_LOCATION, RestoreError.SHORTCUT_NOT_FOUND, RestoreError.APP_NOT_INSTALLED, RestoreError.WIDGETS_DISABLED, RestoreError.PROFILE_NOT_RESTORED, RestoreError.WIDGET_REMOVED, RestoreError.GRID_MIGRATION_FAILURE, RestoreError.NO_SEARCH_WIDGET, RestoreError.INVALID_WIDGET_ID ) annotation class RestoreError { companion object { const val TAG = "LauncherRestoreEventLogger" const val PROFILE_DELETED = "user_profile_deleted" const val MISSING_INFO = "missing_information_when_loading" const val MISSING_WIDGET_PROVIDER = "missing_widget_provider" const val INVALID_LOCATION = "invalid_size_or_location" const val SHORTCUT_NOT_FOUND = "shortcut_not_found" const val APP_NOT_INSTALLED = "app_not_installed" const val WIDGETS_DISABLED = "widgets_disabled" const val PROFILE_NOT_RESTORED = "profile_not_restored" const val WIDGET_REMOVED = "widget_not_found" const val GRID_MIGRATION_FAILURE = "grid_migration_failed" const val NO_SEARCH_WIDGET = "no_search_widget" const val INVALID_WIDGET_ID = "invalid_widget_id" } } // Restore Errors const val RESTORE_ERROR_PROFILE_DELETED = "user_profile_deleted" const val RESTORE_ERROR_MISSING_INFO = "missing_information_when_loading" const val RESTORE_ERROR_BIND_FAILURE = "binding_to_view_failed" const val RESTORE_ERROR_INVALID_LOCATION = "invalid_size_or_location" const val RESTORE_ERROR_SHORTCUT_NOT_FOUND = "shortcut_not_found" const val RESTORE_ERROR_APP_NOT_INSTALLED = "app_not_installed" const val RESTORE_ERROR_WIDGETS_DISABLED = "widgets_disabled" const val RESTORE_ERROR_PROFILE_NOT_RESTORED = "profile_not_restored" const val RESTORE_ERROR_WIDGET_REMOVED = "widget_not_found" companion object { const val TAG = "LauncherRestoreEventLogger" fun newInstance(context: Context?): LauncherRestoreEventLogger { return ResourceBasedOverride.Overrides.getObject( Loading Loading @@ -80,7 +103,7 @@ open class LauncherRestoreEventLogger : ResourceBasedOverride { * @param favoritesId The id of the item type from [Favorites] that was not restored. * @param error error type for why the data was not restored. */ open fun logSingleFavoritesItemRestoreFailed(favoritesId: Int, error: String?) { open fun logSingleFavoritesItemRestoreFailed(favoritesId: Int, @RestoreError error: String?) { // no-op } Loading @@ -91,7 +114,11 @@ open class LauncherRestoreEventLogger : ResourceBasedOverride { * @param count number of items that failed to restore. * @param error error type for why the data was not restored. */ open fun logFavoritesItemsRestoreFailed(favoritesId: Int, count: Int, error: String?) { open fun logFavoritesItemsRestoreFailed( favoritesId: Int, count: Int, @RestoreError error: String? ) { // no-op } Loading src/com/android/launcher3/model/LoaderCursor.java +17 −3 Original line number Diff line number Diff line Loading @@ -41,6 +41,8 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.icons.IconCache; import com.android.launcher3.logging.FileLog; Loading Loading @@ -70,6 +72,7 @@ public class LoaderCursor extends CursorWrapper { private final Context mContext; private final IconCache mIconCache; private final InvariantDeviceProfile mIDP; private final @Nullable LauncherRestoreEventLogger mRestoreEventLogger; private final IntArray mItemsToRemove = new IntArray(); private final IntArray mRestoredRows = new IntArray(); Loading Loading @@ -107,7 +110,8 @@ public class LoaderCursor extends CursorWrapper { public int itemType; public int restoreFlag; public LoaderCursor(Cursor cursor, LauncherAppState app, UserManagerState userManagerState) { public LoaderCursor(Cursor cursor, LauncherAppState app, UserManagerState userManagerState, @Nullable LauncherRestoreEventLogger restoreEventLogger) { super(cursor); mApp = app; Loading @@ -115,6 +119,7 @@ public class LoaderCursor extends CursorWrapper { mContext = app.getContext(); mIconCache = app.getIconCache(); mIDP = app.getInvariantDeviceProfile(); mRestoreEventLogger = restoreEventLogger; // Init column indices mIconIndex = getColumnIndexOrThrow(Favorites.ICON); Loading Loading @@ -390,9 +395,12 @@ public class LoaderCursor extends CursorWrapper { /** * Marks the current item for removal */ public void markDeleted(String reason) { public void markDeleted(String reason, @RestoreError String errorType) { FileLog.e(TAG, reason); mItemsToRemove.add(id); if (mRestoreEventLogger != null) { mRestoreEventLogger.logSingleFavoritesItemRestoreFailed(itemType, errorType); } } /** Loading Loading @@ -431,6 +439,9 @@ public class LoaderCursor extends CursorWrapper { mApp.getModel().getModelDbController().update(TABLE_NAME, values, Utilities.createDbSelectionQuery(Favorites._ID, mRestoredRows), null); } if (mRestoreEventLogger != null) { mRestoreEventLogger.reportLauncherRestoreResults(); } } /** Loading Loading @@ -473,8 +484,11 @@ public class LoaderCursor extends CursorWrapper { } if (checkItemPlacement(info, dataModel.isFirstPagePinnedItemEnabled)) { dataModel.addItem(mContext, info, false, logger); if (mRestoreEventLogger != null) { mRestoreEventLogger.logSingleFavoritesItemRestored(itemType); } } else { markDeleted("Item position overlap"); markDeleted("Item position overlap", RestoreError.INVALID_LOCATION); } } Loading src/com/android/launcher3/model/LoaderTask.java +8 −10 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ import com.android.launcher3.util.LooperIdleLock; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.widget.WidgetManagerHelper; import com.android.launcher3.widget.WidgetInflater; import java.util.ArrayList; import java.util.Collections; Loading Loading @@ -403,9 +403,8 @@ public class LoaderTask implements Runnable { @Nullable LauncherRestoreEventLogger restoreEventLogger) { final Context context = mApp.getContext(); final PackageManagerHelper pmHelper = new PackageManagerHelper(context); final boolean isSafeMode = pmHelper.isSafeMode(); final boolean isSdCardReady = Utilities.isBootCompleted(); final WidgetManagerHelper widgetHelper = new WidgetManagerHelper(context); final WidgetInflater widgetInflater = new WidgetInflater(context); ModelDbController dbController = mApp.getModel().getModelDbController(); dbController.tryMigrateDB(restoreEventLogger); Loading @@ -422,13 +421,12 @@ public class LoaderTask implements Runnable { FileLog.d(TAG, "loadWorkspace: Packages with active install sessions: " + installingPkgs.keySet().stream().map(info -> info.mPackageName).toList()); final PackageUserKey tempPackageKey = new PackageUserKey(null, null); mFirstScreenBroadcast = new FirstScreenBroadcast(installingPkgs); mShortcutKeyToPinnedShortcuts = new HashMap<>(); final LoaderCursor c = new LoaderCursor( dbController.query(TABLE_NAME, null, selection, null, null), mApp, mUserManagerState); mApp, mUserManagerState, mIsRestoreFromBackup ? restoreEventLogger : null); final Bundle extras = c.getExtras(); mDbName = extras == null ? null : extras.getString(ModelDbController.EXTRA_DB_NAME); try { Loading @@ -438,11 +436,11 @@ public class LoaderTask implements Runnable { List<IconRequestInfo<WorkspaceItemInfo>> iconRequestInfos = new ArrayList<>(); WorkspaceItemProcessor itemProcessor = new WorkspaceItemProcessor(c, memoryLogger, restoreEventLogger, mUserManagerState, mLauncherApps, mPendingPackages, mShortcutKeyToPinnedShortcuts, mApp, mIconCache, mBgDataModel, mWidgetProvidersMap, mIsRestoreFromBackup, installingPkgs, isSdCardReady, tempPackageKey, widgetHelper, pmHelper, iconRequestInfos, unlockedUsers, isSafeMode, allDeepShortcuts); mUserManagerState, mLauncherApps, mPendingPackages, mShortcutKeyToPinnedShortcuts, mApp, mBgDataModel, mWidgetProvidersMap, installingPkgs, isSdCardReady, widgetInflater, pmHelper, iconRequestInfos, unlockedUsers, allDeepShortcuts); while (!mStopped && c.moveToNext()) { itemProcessor.processItem(); Loading src/com/android/launcher3/model/ModelDbController.java +2 −2 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.Utilities; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError; import com.android.launcher3.logging.FileLog; import com.android.launcher3.pm.UserCache; import com.android.launcher3.provider.LauncherDbUtils; Loading @@ -89,7 +90,6 @@ public class ModelDbController { private static final String TAG = "LauncherProvider"; private static final String EMPTY_DATABASE_CREATED = "EMPTY_DATABASE_CREATED"; private static final String RESTORE_ERROR_GRID_MIGRATION_FAILURE = "grid_migration_failed"; public static final String EXTRA_DB_NAME = "db_name"; protected DatabaseHelper mOpenHelper; Loading Loading @@ -335,7 +335,7 @@ public class ModelDbController { restoreEventLogger.logFavoritesItemsRestoreFailed( cursor.getInt(cursor.getColumnIndexOrThrow(ITEM_TYPE)), cursor.getInt(cursor.getColumnIndexOrThrow("count")), RESTORE_ERROR_GRID_MIGRATION_FAILURE RestoreError.GRID_MIGRATION_FAILURE ); } while (cursor.moveToNext()); } Loading Loading
src/com/android/launcher3/Launcher.java +3 −31 Original line number Diff line number Diff line Loading @@ -52,7 +52,6 @@ import static com.android.launcher3.LauncherConstants.TraceEvents.ON_CREATE_EVT; import static com.android.launcher3.LauncherConstants.TraceEvents.ON_NEW_INTENT_EVT; import static com.android.launcher3.LauncherConstants.TraceEvents.ON_RESUME_EVT; import static com.android.launcher3.LauncherConstants.TraceEvents.ON_START_EVT; import static com.android.launcher3.LauncherPrefs.IS_FIRST_LOAD_AFTER_RESTORE; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET; Loading @@ -65,8 +64,6 @@ import static com.android.launcher3.LauncherState.NO_OFFSET; import static com.android.launcher3.LauncherState.NO_SCALE; import static com.android.launcher3.LauncherState.SPRING_LOADED; import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RESTORE_ERROR_BIND_FAILURE; import static com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RESTORE_ERROR_INVALID_LOCATION; import static com.android.launcher3.config.FeatureFlags.ENABLE_SMARTSPACE_REMOVAL; import static com.android.launcher3.config.FeatureFlags.FOLDABLE_SINGLE_PAGE; import static com.android.launcher3.config.FeatureFlags.MULTI_SELECT_EDIT_MODE; Loading Loading @@ -165,7 +162,6 @@ import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.PropertyListBuilder; import com.android.launcher3.apppairs.AppPairIcon; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger; import com.android.launcher3.celllayout.CellPosMapper; import com.android.launcher3.celllayout.CellPosMapper.CellPos; import com.android.launcher3.celllayout.CellPosMapper.TwoPanelCellPosMapper; Loading Loading @@ -2161,13 +2157,6 @@ public class Launcher extends StatefulActivity<LauncherState> int newItemsScreenId = -1; int end = items.size(); View newView = null; LauncherRestoreEventLogger restoreEventLogger = null; Boolean isRestoreFromBackup = (Boolean) LauncherPrefs.get(getApplicationContext()) .get(IS_FIRST_LOAD_AFTER_RESTORE); if (isRestoreFromBackup) { restoreEventLogger = LauncherRestoreEventLogger.Companion .newInstance(getApplicationContext()); } for (int i = 0; i < end; i++) { final ItemInfo item = items.get(i); // Short circuit if we are loading dock items for a configuration which has no dock Loading Loading @@ -2198,15 +2187,10 @@ public class Launcher extends StatefulActivity<LauncherState> } case ITEM_TYPE_APPWIDGET: case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: { view = inflateAppWidget((LauncherAppWidgetInfo) item, restoreEventLogger); view = inflateAppWidget((LauncherAppWidgetInfo) item); if (view == null) { continue; } // Widgets have more checks when inflating, so we have to wait until here // to mark restored, instead of logging in LoaderTask. if (restoreEventLogger != null) { restoreEventLogger.logSingleFavoritesItemRestored(item.itemType); } break; } default: Loading @@ -2230,10 +2214,6 @@ public class Launcher extends StatefulActivity<LauncherState> if (FeatureFlags.IS_STUDIO_BUILD) { throw (new RuntimeException(desc)); } else { if (restoreEventLogger != null) { restoreEventLogger.logSingleFavoritesItemRestoreFailed(item.itemType, RESTORE_ERROR_INVALID_LOCATION); } getModelWriter().deleteItemFromDatabase(item, desc); continue; } Loading Loading @@ -2292,9 +2272,6 @@ public class Launcher extends StatefulActivity<LauncherState> } else if (focusFirstItemForAccessibility && viewToFocus != null) { viewToFocus.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); } if (restoreEventLogger != null) { restoreEventLogger.reportLauncherRestoreResults(); } workspace.requestLayout(); } Loading @@ -2302,24 +2279,19 @@ public class Launcher extends StatefulActivity<LauncherState> * Add the views for a widget to the workspace. */ public void bindAppWidget(LauncherAppWidgetInfo item) { View view = inflateAppWidget(item, null); View view = inflateAppWidget(item); if (view != null) { mWorkspace.addInScreen(view, item); mWorkspace.requestLayout(); } } private View inflateAppWidget(LauncherAppWidgetInfo item, @Nullable LauncherRestoreEventLogger restoreEventLogger) { private View inflateAppWidget(LauncherAppWidgetInfo item) { TraceHelper.INSTANCE.beginSection("BIND_WIDGET_id=" + item.appWidgetId); try { InflationResult inflationResult = mWidgetInflater.inflateAppWidget(item); if (inflationResult.getType() == WidgetInflater.TYPE_DELETE) { getModelWriter().deleteItemFromDatabase(item, inflationResult.getReason()); if (restoreEventLogger != null) { restoreEventLogger.logSingleFavoritesItemRestoreFailed( ITEM_TYPE_APPWIDGET, RESTORE_ERROR_BIND_FAILURE); } return null; } Loading
src/com/android/launcher3/backuprestore/LauncherRestoreEventLogger.kt +40 −13 Original line number Diff line number Diff line package com.android.launcher3.backuprestore import android.content.Context import androidx.annotation.StringDef import com.android.launcher3.LauncherSettings.Favorites import com.android.launcher3.R import com.android.launcher3.util.ResourceBasedOverride Loading @@ -11,19 +12,41 @@ import com.android.launcher3.util.ResourceBasedOverride */ open class LauncherRestoreEventLogger : ResourceBasedOverride { /** Enumeration of potential errors returned to calls of pause/resume app updates. */ @Retention(AnnotationRetention.SOURCE) @StringDef( RestoreError.PROFILE_DELETED, RestoreError.MISSING_INFO, RestoreError.MISSING_WIDGET_PROVIDER, RestoreError.INVALID_LOCATION, RestoreError.SHORTCUT_NOT_FOUND, RestoreError.APP_NOT_INSTALLED, RestoreError.WIDGETS_DISABLED, RestoreError.PROFILE_NOT_RESTORED, RestoreError.WIDGET_REMOVED, RestoreError.GRID_MIGRATION_FAILURE, RestoreError.NO_SEARCH_WIDGET, RestoreError.INVALID_WIDGET_ID ) annotation class RestoreError { companion object { const val TAG = "LauncherRestoreEventLogger" const val PROFILE_DELETED = "user_profile_deleted" const val MISSING_INFO = "missing_information_when_loading" const val MISSING_WIDGET_PROVIDER = "missing_widget_provider" const val INVALID_LOCATION = "invalid_size_or_location" const val SHORTCUT_NOT_FOUND = "shortcut_not_found" const val APP_NOT_INSTALLED = "app_not_installed" const val WIDGETS_DISABLED = "widgets_disabled" const val PROFILE_NOT_RESTORED = "profile_not_restored" const val WIDGET_REMOVED = "widget_not_found" const val GRID_MIGRATION_FAILURE = "grid_migration_failed" const val NO_SEARCH_WIDGET = "no_search_widget" const val INVALID_WIDGET_ID = "invalid_widget_id" } } // Restore Errors const val RESTORE_ERROR_PROFILE_DELETED = "user_profile_deleted" const val RESTORE_ERROR_MISSING_INFO = "missing_information_when_loading" const val RESTORE_ERROR_BIND_FAILURE = "binding_to_view_failed" const val RESTORE_ERROR_INVALID_LOCATION = "invalid_size_or_location" const val RESTORE_ERROR_SHORTCUT_NOT_FOUND = "shortcut_not_found" const val RESTORE_ERROR_APP_NOT_INSTALLED = "app_not_installed" const val RESTORE_ERROR_WIDGETS_DISABLED = "widgets_disabled" const val RESTORE_ERROR_PROFILE_NOT_RESTORED = "profile_not_restored" const val RESTORE_ERROR_WIDGET_REMOVED = "widget_not_found" companion object { const val TAG = "LauncherRestoreEventLogger" fun newInstance(context: Context?): LauncherRestoreEventLogger { return ResourceBasedOverride.Overrides.getObject( Loading Loading @@ -80,7 +103,7 @@ open class LauncherRestoreEventLogger : ResourceBasedOverride { * @param favoritesId The id of the item type from [Favorites] that was not restored. * @param error error type for why the data was not restored. */ open fun logSingleFavoritesItemRestoreFailed(favoritesId: Int, error: String?) { open fun logSingleFavoritesItemRestoreFailed(favoritesId: Int, @RestoreError error: String?) { // no-op } Loading @@ -91,7 +114,11 @@ open class LauncherRestoreEventLogger : ResourceBasedOverride { * @param count number of items that failed to restore. * @param error error type for why the data was not restored. */ open fun logFavoritesItemsRestoreFailed(favoritesId: Int, count: Int, error: String?) { open fun logFavoritesItemsRestoreFailed( favoritesId: Int, count: Int, @RestoreError error: String? ) { // no-op } Loading
src/com/android/launcher3/model/LoaderCursor.java +17 −3 Original line number Diff line number Diff line Loading @@ -41,6 +41,8 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.icons.IconCache; import com.android.launcher3.logging.FileLog; Loading Loading @@ -70,6 +72,7 @@ public class LoaderCursor extends CursorWrapper { private final Context mContext; private final IconCache mIconCache; private final InvariantDeviceProfile mIDP; private final @Nullable LauncherRestoreEventLogger mRestoreEventLogger; private final IntArray mItemsToRemove = new IntArray(); private final IntArray mRestoredRows = new IntArray(); Loading Loading @@ -107,7 +110,8 @@ public class LoaderCursor extends CursorWrapper { public int itemType; public int restoreFlag; public LoaderCursor(Cursor cursor, LauncherAppState app, UserManagerState userManagerState) { public LoaderCursor(Cursor cursor, LauncherAppState app, UserManagerState userManagerState, @Nullable LauncherRestoreEventLogger restoreEventLogger) { super(cursor); mApp = app; Loading @@ -115,6 +119,7 @@ public class LoaderCursor extends CursorWrapper { mContext = app.getContext(); mIconCache = app.getIconCache(); mIDP = app.getInvariantDeviceProfile(); mRestoreEventLogger = restoreEventLogger; // Init column indices mIconIndex = getColumnIndexOrThrow(Favorites.ICON); Loading Loading @@ -390,9 +395,12 @@ public class LoaderCursor extends CursorWrapper { /** * Marks the current item for removal */ public void markDeleted(String reason) { public void markDeleted(String reason, @RestoreError String errorType) { FileLog.e(TAG, reason); mItemsToRemove.add(id); if (mRestoreEventLogger != null) { mRestoreEventLogger.logSingleFavoritesItemRestoreFailed(itemType, errorType); } } /** Loading Loading @@ -431,6 +439,9 @@ public class LoaderCursor extends CursorWrapper { mApp.getModel().getModelDbController().update(TABLE_NAME, values, Utilities.createDbSelectionQuery(Favorites._ID, mRestoredRows), null); } if (mRestoreEventLogger != null) { mRestoreEventLogger.reportLauncherRestoreResults(); } } /** Loading Loading @@ -473,8 +484,11 @@ public class LoaderCursor extends CursorWrapper { } if (checkItemPlacement(info, dataModel.isFirstPagePinnedItemEnabled)) { dataModel.addItem(mContext, info, false, logger); if (mRestoreEventLogger != null) { mRestoreEventLogger.logSingleFavoritesItemRestored(itemType); } } else { markDeleted("Item position overlap"); markDeleted("Item position overlap", RestoreError.INVALID_LOCATION); } } Loading
src/com/android/launcher3/model/LoaderTask.java +8 −10 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ import com.android.launcher3.util.LooperIdleLock; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.widget.WidgetManagerHelper; import com.android.launcher3.widget.WidgetInflater; import java.util.ArrayList; import java.util.Collections; Loading Loading @@ -403,9 +403,8 @@ public class LoaderTask implements Runnable { @Nullable LauncherRestoreEventLogger restoreEventLogger) { final Context context = mApp.getContext(); final PackageManagerHelper pmHelper = new PackageManagerHelper(context); final boolean isSafeMode = pmHelper.isSafeMode(); final boolean isSdCardReady = Utilities.isBootCompleted(); final WidgetManagerHelper widgetHelper = new WidgetManagerHelper(context); final WidgetInflater widgetInflater = new WidgetInflater(context); ModelDbController dbController = mApp.getModel().getModelDbController(); dbController.tryMigrateDB(restoreEventLogger); Loading @@ -422,13 +421,12 @@ public class LoaderTask implements Runnable { FileLog.d(TAG, "loadWorkspace: Packages with active install sessions: " + installingPkgs.keySet().stream().map(info -> info.mPackageName).toList()); final PackageUserKey tempPackageKey = new PackageUserKey(null, null); mFirstScreenBroadcast = new FirstScreenBroadcast(installingPkgs); mShortcutKeyToPinnedShortcuts = new HashMap<>(); final LoaderCursor c = new LoaderCursor( dbController.query(TABLE_NAME, null, selection, null, null), mApp, mUserManagerState); mApp, mUserManagerState, mIsRestoreFromBackup ? restoreEventLogger : null); final Bundle extras = c.getExtras(); mDbName = extras == null ? null : extras.getString(ModelDbController.EXTRA_DB_NAME); try { Loading @@ -438,11 +436,11 @@ public class LoaderTask implements Runnable { List<IconRequestInfo<WorkspaceItemInfo>> iconRequestInfos = new ArrayList<>(); WorkspaceItemProcessor itemProcessor = new WorkspaceItemProcessor(c, memoryLogger, restoreEventLogger, mUserManagerState, mLauncherApps, mPendingPackages, mShortcutKeyToPinnedShortcuts, mApp, mIconCache, mBgDataModel, mWidgetProvidersMap, mIsRestoreFromBackup, installingPkgs, isSdCardReady, tempPackageKey, widgetHelper, pmHelper, iconRequestInfos, unlockedUsers, isSafeMode, allDeepShortcuts); mUserManagerState, mLauncherApps, mPendingPackages, mShortcutKeyToPinnedShortcuts, mApp, mBgDataModel, mWidgetProvidersMap, installingPkgs, isSdCardReady, widgetInflater, pmHelper, iconRequestInfos, unlockedUsers, allDeepShortcuts); while (!mStopped && c.moveToNext()) { itemProcessor.processItem(); Loading
src/com/android/launcher3/model/ModelDbController.java +2 −2 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.Utilities; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError; import com.android.launcher3.logging.FileLog; import com.android.launcher3.pm.UserCache; import com.android.launcher3.provider.LauncherDbUtils; Loading @@ -89,7 +90,6 @@ public class ModelDbController { private static final String TAG = "LauncherProvider"; private static final String EMPTY_DATABASE_CREATED = "EMPTY_DATABASE_CREATED"; private static final String RESTORE_ERROR_GRID_MIGRATION_FAILURE = "grid_migration_failed"; public static final String EXTRA_DB_NAME = "db_name"; protected DatabaseHelper mOpenHelper; Loading Loading @@ -335,7 +335,7 @@ public class ModelDbController { restoreEventLogger.logFavoritesItemsRestoreFailed( cursor.getInt(cursor.getColumnIndexOrThrow(ITEM_TYPE)), cursor.getInt(cursor.getColumnIndexOrThrow("count")), RESTORE_ERROR_GRID_MIGRATION_FAILURE RestoreError.GRID_MIGRATION_FAILURE ); } while (cursor.moveToNext()); } Loading