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

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

Caching widget labels in icon cache to avoid lookup at startup

Change-Id: Ie026ee47905454bd70e774d422cd7fe142aec7e2
parent 08a915c0
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -2,11 +2,15 @@ package com.android.launcher3;

import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Parcel;
import android.os.UserHandle;

import com.android.launcher3.icons.ComponentWithLabel;

/**
 * This class is a thin wrapper around the framework AppWidgetProviderInfo class. This class affords
@@ -14,7 +18,8 @@ import android.os.Parcel;
 * (who's implementation is owned by the launcher). This object represents a widget type / class,
 * as opposed to a widget instance, and so should not be confused with {@link LauncherAppWidgetInfo}
 */
public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo {
public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo
        implements ComponentWithLabel {

    public static final String CLS_CUSTOM_WIDGET_PREFIX = "#custom-widget-";

@@ -102,4 +107,14 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo {
            return 0;
        }
    }

    @Override
    public final ComponentName getComponent() {
        return provider;
    }

    @Override
    public final UserHandle getUser() {
        return getProfile();
    }
}
+13 −0
Original line number Diff line number Diff line
@@ -599,6 +599,19 @@ public class LauncherModel extends BroadcastReceiver
                CacheDataUpdatedTask.OP_CACHE_UPDATE, user, updatedPackages));
    }

    /**
     * Called when the labels for the widgets has updated in the icon cache.
     */
    public void onWidgetLabelsUpdated(HashSet<String> updatedPackages, UserHandle user) {
        enqueueModelUpdateTask(new BaseModelUpdateTask() {
            @Override
            public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
                dataModel.widgetsModel.onPackageIconsUpdated(updatedPackages, user, app);
                bindUpdatedWidgets(dataModel);
            }
        });
    }

    public void enqueueModelUpdateTask(ModelUpdateTask task) {
        task.init(mApp, this, sBgDataModel, mBgAllAppsList, mUiExecutor);
        runOnWorkerThread(task);
+1 −1
Original line number Diff line number Diff line
@@ -200,7 +200,7 @@ public class LauncherAppsCompatVL extends LauncherAppsCompat {
                pm.queryIntentActivities(new Intent(Intent.ACTION_CREATE_SHORTCUT), 0)) {
            if (packageUser == null || packageUser.mPackageName
                    .equals(info.activityInfo.packageName)) {
                result.add(new ShortcutConfigActivityInfoVL(info.activityInfo, pm));
                result.add(new ShortcutConfigActivityInfoVL(info.activityInfo));
            }
        }
        return result;
+10 −12
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.os.UserHandle;
import android.util.Log;
import android.widget.Toast;

import com.android.launcher3.icons.ComponentWithLabel;
import com.android.launcher3.icons.IconCache;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.R;
@@ -40,7 +41,7 @@ import com.android.launcher3.ShortcutInfo;
/**
 * Wrapper class for representing a shortcut configure activity.
 */
public abstract class ShortcutConfigActivityInfo {
public abstract class ShortcutConfigActivityInfo implements ComponentWithLabel {

    private static final String TAG = "SCActivityInfo";

@@ -52,10 +53,12 @@ public abstract class ShortcutConfigActivityInfo {
        mUser = user;
    }

    @Override
    public ComponentName getComponent() {
        return mCn;
    }

    @Override
    public UserHandle getUser() {
        return mUser;
    }
@@ -64,8 +67,6 @@ public abstract class ShortcutConfigActivityInfo {
        return LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
    }

    public abstract CharSequence getLabel();

    public abstract Drawable getFullResIcon(IconCache cache);

    /**
@@ -94,8 +95,8 @@ public abstract class ShortcutConfigActivityInfo {
    }

    /**
     * Returns true if various properties ({@link #getLabel()}, {@link #getFullResIcon}) can
     * be safely persisted.
     * Returns true if various properties ({@link #getLabel(PackageManager)},
     * {@link #getFullResIcon}) can be safely persisted.
     */
    public boolean isPersistable() {
        return true;
@@ -104,18 +105,15 @@ public abstract class ShortcutConfigActivityInfo {
    static class ShortcutConfigActivityInfoVL extends ShortcutConfigActivityInfo {

        private final ActivityInfo mInfo;
        private final PackageManager mPm;


        public ShortcutConfigActivityInfoVL(ActivityInfo info, PackageManager pm) {
        public ShortcutConfigActivityInfoVL(ActivityInfo info) {
            super(new ComponentName(info.packageName, info.name), Process.myUserHandle());
            mInfo = info;
            mPm = pm;
        }

        @Override
        public CharSequence getLabel() {
            return mInfo.loadLabel(mPm);
        public CharSequence getLabel(PackageManager pm) {
            return mInfo.loadLabel(pm);
        }

        @Override
@@ -135,7 +133,7 @@ public abstract class ShortcutConfigActivityInfo {
        }

        @Override
        public CharSequence getLabel() {
        public CharSequence getLabel(PackageManager pm) {
            return mInfo.getLabel();
        }

+28 −12
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.view.MotionEvent;
@@ -46,6 +47,7 @@ import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherAppWidgetHost;
import com.android.launcher3.LauncherAppWidgetProviderInfo;
import com.android.launcher3.LauncherModel;
import com.android.launcher3.R;
import com.android.launcher3.compat.AppWidgetManagerCompat;
import com.android.launcher3.compat.LauncherAppsCompatVO;
@@ -54,6 +56,8 @@ import com.android.launcher3.shortcuts.ShortcutInfoCompat;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
import com.android.launcher3.util.InstantAppResolver;
import com.android.launcher3.util.LooperExecutor;
import com.android.launcher3.util.Provider;
import com.android.launcher3.widget.PendingAddShortcutInfo;
import com.android.launcher3.widget.PendingAddWidgetInfo;
import com.android.launcher3.widget.WidgetHostViewLoader;
@@ -78,7 +82,6 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
    // Widget request specific options.
    private LauncherAppWidgetHost mAppWidgetHost;
    private AppWidgetManagerCompat mAppWidgetManager;
    private PendingAddWidgetInfo mPendingWidgetInfo;
    private int mPendingBindWidgetId;
    private Bundle mWidgetOptions;

@@ -189,10 +192,9 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
    private void setupShortcut() {
        PinShortcutRequestActivityInfo shortcutInfo =
                new PinShortcutRequestActivityInfo(mRequest, this);
        WidgetItem item = new WidgetItem(shortcutInfo);
        mWidgetCell.getWidgetView().setTag(new PendingAddShortcutInfo(shortcutInfo));
        mWidgetCell.applyFromCellItem(item, mApp.getWidgetCache());
        mWidgetCell.ensurePreview();
        applyWidgetItemAsync(
                () -> new WidgetItem(shortcutInfo, mApp.getIconCache(), getPackageManager()));
    }

    private boolean setupWidget() {
@@ -207,16 +209,30 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
        mAppWidgetManager = AppWidgetManagerCompat.getInstance(this);
        mAppWidgetHost = new LauncherAppWidgetHost(this);

        mPendingWidgetInfo = new PendingAddWidgetInfo(widgetInfo);
        mPendingWidgetInfo.spanX = Math.min(mIdp.numColumns, widgetInfo.spanX);
        mPendingWidgetInfo.spanY = Math.min(mIdp.numRows, widgetInfo.spanY);
        mWidgetOptions = WidgetHostViewLoader.getDefaultOptionsForWidget(this, mPendingWidgetInfo);
        PendingAddWidgetInfo pendingInfo = new PendingAddWidgetInfo(widgetInfo);
        pendingInfo.spanX = Math.min(mIdp.numColumns, widgetInfo.spanX);
        pendingInfo.spanY = Math.min(mIdp.numRows, widgetInfo.spanY);
        mWidgetOptions = WidgetHostViewLoader.getDefaultOptionsForWidget(this, pendingInfo);
        mWidgetCell.getWidgetView().setTag(pendingInfo);

        applyWidgetItemAsync(() -> new WidgetItem(widgetInfo, mIdp, mApp.getIconCache()));
        return true;
    }

        WidgetItem item = new WidgetItem(widgetInfo, getPackageManager(), mIdp);
        mWidgetCell.getWidgetView().setTag(mPendingWidgetInfo);
    private void applyWidgetItemAsync(final Provider<WidgetItem> itemProvider) {
        new AsyncTask<Void, Void, WidgetItem>() {
            @Override
            protected WidgetItem doInBackground(Void... voids) {
                return itemProvider.get();
            }

            @Override
            protected void onPostExecute(WidgetItem item) {
                mWidgetCell.applyFromCellItem(item, mApp.getWidgetCache());
                mWidgetCell.ensurePreview();
        return true;
            }
        }.executeOnExecutor(new LooperExecutor(LauncherModel.getWorkerLooper()));
        // TODO: Create a worker looper executor and reuse that everywhere.
    }

    /**
Loading