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

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

Using WidgetInflater in loader task

This removes duplicate logic for widget inflation.
Since the widget inflation can now happen during loader,
the restore logging can also be moved completely to the loader

Bug: 318539160
Test: atest TaplBinderTests
Flag: None
Change-Id: If9f336e7bf49ee7df121d7d9852b674d98124895
parent 64614a1e
Loading
Loading
Loading
Loading
+3 −31
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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
@@ -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:
@@ -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;
                    }
@@ -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();
    }

@@ -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;
            }

+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
@@ -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(
@@ -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
    }

@@ -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
    }

+17 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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();
@@ -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;
@@ -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);
@@ -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);
        }
    }

    /**
@@ -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();
        }
    }

    /**
@@ -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);
        }
    }

+8 −10
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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 {
@@ -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();
+2 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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