Adding support for storing keywords in iconCache

Change-Id: I1183e63a6556ebfb3eee5df23d149e09728193a9
Merged-In: I1183e63a6556ebfb3eee5df23d149e09728193a9
(cherry picked from commit e529a86fbd)
This commit is contained in:
Sunny Goyal 2019-08-06 09:48:36 -07:00 committed by Alex Mang
parent 22edac9bf5
commit 934ebd087b
14 changed files with 124 additions and 79 deletions

View File

@ -36,12 +36,16 @@ import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.LocaleList;
import android.os.Looper; import android.os.Looper;
import android.os.Process; import android.os.Process;
import android.os.UserHandle; import android.os.UserHandle;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.launcher3.icons.BaseIconFactory; import com.android.launcher3.icons.BaseIconFactory;
import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.BitmapInfo;
import com.android.launcher3.icons.BitmapRenderer; import com.android.launcher3.icons.BitmapRenderer;
@ -57,8 +61,6 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Supplier; import java.util.function.Supplier;
import androidx.annotation.NonNull;
public abstract class BaseIconCache { public abstract class BaseIconCache {
private static final String TAG = "BaseIconCache"; private static final String TAG = "BaseIconCache";
@ -84,6 +86,7 @@ public abstract class BaseIconCache {
protected int mIconDpi; protected int mIconDpi;
protected IconDB mIconDb; protected IconDB mIconDb;
protected LocaleList mLocaleList = LocaleList.getEmptyLocaleList();
protected String mSystemState = ""; protected String mSystemState = "";
private final String mDbFileName; private final String mDbFileName;
@ -227,12 +230,12 @@ public abstract class BaseIconCache {
/** /**
* Refreshes the system state definition used to check the validity of the cache. It * Refreshes the system state definition used to check the validity of the cache. It
* incorporates all the properties that can affect the cache like locale and system-version. * incorporates all the properties that can affect the cache like the list of enabled locale
* and system-version.
*/ */
private void updateSystemState() { private void updateSystemState() {
final String locale = mLocaleList = mContext.getResources().getConfiguration().getLocales();
mContext.getResources().getConfiguration().getLocales().toLanguageTags(); mSystemState = mLocaleList.toLanguageTags() + "," + Build.VERSION.SDK_INT;
mSystemState = locale + "," + Build.VERSION.SDK_INT;
} }
protected String getIconSystemState(String packageName) { protected String getIconSystemState(String packageName) {
@ -269,7 +272,7 @@ public abstract class BaseIconCache {
mCache.put(key, entry); mCache.put(key, entry);
ContentValues values = newContentValues(entry, entry.title.toString(), ContentValues values = newContentValues(entry, entry.title.toString(),
componentName.getPackageName()); componentName.getPackageName(), cachingLogic.getKeywords(object, mLocaleList));
addIconToDB(values, componentName, info, userSerial); addIconToDB(values, componentName, info, userSerial);
} }
@ -445,7 +448,7 @@ public abstract class BaseIconCache {
// Add the icon in the DB here, since these do not get written during // Add the icon in the DB here, since these do not get written during
// package updates. // package updates.
ContentValues values = newContentValues( ContentValues values = newContentValues(
iconInfo, entry.title.toString(), packageName); iconInfo, entry.title.toString(), packageName, null);
addIconToDB(values, cacheKey.componentName, info, getSerialNumberForUser(user)); addIconToDB(values, cacheKey.componentName, info, getSerialNumberForUser(user));
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
@ -504,23 +507,35 @@ public abstract class BaseIconCache {
return false; return false;
} }
static final class IconDB extends SQLiteCacheHelper { /**
private final static int RELEASE_VERSION = 26; * Returns a cursor for an arbitrary query to the cache db
*/
public synchronized Cursor queryCacheDb(String[] columns, String selection,
String[] selectionArgs) {
return mIconDb.query(columns, selection, selectionArgs);
}
public final static String TABLE_NAME = "icons"; /**
public final static String COLUMN_ROWID = "rowid"; * Cache class to store the actual entries on disk
public final static String COLUMN_COMPONENT = "componentName"; */
public final static String COLUMN_USER = "profileId"; public static final class IconDB extends SQLiteCacheHelper {
public final static String COLUMN_LAST_UPDATED = "lastUpdated"; private static final int RELEASE_VERSION = 27;
public final static String COLUMN_VERSION = "version";
public final static String COLUMN_ICON = "icon";
public final static String COLUMN_ICON_COLOR = "icon_color";
public final static String COLUMN_LABEL = "label";
public final static String COLUMN_SYSTEM_STATE = "system_state";
public final static String[] COLUMNS_HIGH_RES = new String[] { public static final String TABLE_NAME = "icons";
public static final String COLUMN_ROWID = "rowid";
public static final String COLUMN_COMPONENT = "componentName";
public static final String COLUMN_USER = "profileId";
public static final String COLUMN_LAST_UPDATED = "lastUpdated";
public static final String COLUMN_VERSION = "version";
public static final String COLUMN_ICON = "icon";
public static final String COLUMN_ICON_COLOR = "icon_color";
public static final String COLUMN_LABEL = "label";
public static final String COLUMN_SYSTEM_STATE = "system_state";
public static final String COLUMN_KEYWORDS = "keywords";
public static final String[] COLUMNS_HIGH_RES = new String[] {
IconDB.COLUMN_ICON_COLOR, IconDB.COLUMN_LABEL, IconDB.COLUMN_ICON }; IconDB.COLUMN_ICON_COLOR, IconDB.COLUMN_LABEL, IconDB.COLUMN_ICON };
public final static String[] COLUMNS_LOW_RES = new String[] { public static final String[] COLUMNS_LOW_RES = new String[] {
IconDB.COLUMN_ICON_COLOR, IconDB.COLUMN_LABEL }; IconDB.COLUMN_ICON_COLOR, IconDB.COLUMN_LABEL };
public IconDB(Context context, String dbFileName, int iconPixelSize) { public IconDB(Context context, String dbFileName, int iconPixelSize) {
@ -529,21 +544,23 @@ public abstract class BaseIconCache {
@Override @Override
protected void onCreateTable(SQLiteDatabase db) { protected void onCreateTable(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " ("
COLUMN_COMPONENT + " TEXT NOT NULL, " + + COLUMN_COMPONENT + " TEXT NOT NULL, "
COLUMN_USER + " INTEGER NOT NULL, " + + COLUMN_USER + " INTEGER NOT NULL, "
COLUMN_LAST_UPDATED + " INTEGER NOT NULL DEFAULT 0, " + + COLUMN_LAST_UPDATED + " INTEGER NOT NULL DEFAULT 0, "
COLUMN_VERSION + " INTEGER NOT NULL DEFAULT 0, " + + COLUMN_VERSION + " INTEGER NOT NULL DEFAULT 0, "
COLUMN_ICON + " BLOB, " + + COLUMN_ICON + " BLOB, "
COLUMN_ICON_COLOR + " INTEGER NOT NULL DEFAULT 0, " + + COLUMN_ICON_COLOR + " INTEGER NOT NULL DEFAULT 0, "
COLUMN_LABEL + " TEXT, " + + COLUMN_LABEL + " TEXT, "
COLUMN_SYSTEM_STATE + " TEXT, " + + COLUMN_SYSTEM_STATE + " TEXT, "
"PRIMARY KEY (" + COLUMN_COMPONENT + ", " + COLUMN_USER + ") " + + COLUMN_KEYWORDS + " TEXT, "
");"); + "PRIMARY KEY (" + COLUMN_COMPONENT + ", " + COLUMN_USER + ") "
+ ");");
} }
} }
private ContentValues newContentValues(BitmapInfo bitmapInfo, String label, String packageName) { private ContentValues newContentValues(BitmapInfo bitmapInfo, String label,
String packageName, @Nullable String keywords) {
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
values.put(IconDB.COLUMN_ICON, values.put(IconDB.COLUMN_ICON,
bitmapInfo.isLowRes() ? null : GraphicsUtils.flattenBitmap(bitmapInfo.icon)); bitmapInfo.isLowRes() ? null : GraphicsUtils.flattenBitmap(bitmapInfo.icon));
@ -551,7 +568,7 @@ public abstract class BaseIconCache {
values.put(IconDB.COLUMN_LABEL, label); values.put(IconDB.COLUMN_LABEL, label);
values.put(IconDB.COLUMN_SYSTEM_STATE, getIconSystemState(packageName)); values.put(IconDB.COLUMN_SYSTEM_STATE, getIconSystemState(packageName));
values.put(IconDB.COLUMN_KEYWORDS, keywords);
return values; return values;
} }

View File

@ -17,8 +17,11 @@ package com.android.launcher3.icons.cache;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.os.LocaleList;
import android.os.UserHandle; import android.os.UserHandle;
import androidx.annotation.Nullable;
import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.BitmapInfo;
public interface CachingLogic<T> { public interface CachingLogic<T> {
@ -30,4 +33,12 @@ public interface CachingLogic<T> {
CharSequence getLabel(T object); CharSequence getLabel(T object);
void loadIcon(Context context, T object, BitmapInfo target); void loadIcon(Context context, T object, BitmapInfo target);
/**
* Provides a option list of keywords to associate with this object
*/
@Nullable
default String getKeywords(T object, LocaleList localeList) {
return null;
}
} }

View File

@ -16,6 +16,8 @@
package com.android.quickstep; package com.android.quickstep;
import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.view.View; import android.view.View;
@ -47,8 +49,7 @@ public class TaskOverlayFactory implements ResourceBasedOverride {
}; };
public static final MainThreadInitializedObject<TaskOverlayFactory> INSTANCE = public static final MainThreadInitializedObject<TaskOverlayFactory> INSTANCE =
new MainThreadInitializedObject<>(c -> Overrides.getObject(TaskOverlayFactory.class, forOverride(TaskOverlayFactory.class, R.string.task_overlay_factory_class);
c, R.string.task_overlay_factory_class));
public List<TaskSystemShortcut> getEnabledShortcuts(TaskView taskView) { public List<TaskSystemShortcut> getEnabledShortcuts(TaskView taskView) {
final ArrayList<TaskSystemShortcut> shortcuts = new ArrayList<>(); final ArrayList<TaskSystemShortcut> shortcuts = new ArrayList<>();

View File

@ -16,15 +16,12 @@
package com.android.quickstep; package com.android.quickstep;
import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId; import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SUPPORTS_WINDOW_CORNERS;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_WINDOW_CORNER_RADIUS;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.content.ComponentCallbacks2; import android.content.ComponentCallbacks2;
import android.content.Context; import android.content.Context;
import android.os.Build; import android.os.Build;
import android.os.Bundle;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.Process; import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
@ -35,7 +32,6 @@ import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListener;
import java.util.ArrayList; import java.util.ArrayList;
@ -52,7 +48,7 @@ public class RecentsModel extends TaskStackChangeListener {
// We do not need any synchronization for this variable as its only written on UI thread. // We do not need any synchronization for this variable as its only written on UI thread.
public static final MainThreadInitializedObject<RecentsModel> INSTANCE = public static final MainThreadInitializedObject<RecentsModel> INSTANCE =
new MainThreadInitializedObject<>(c -> new RecentsModel(c)); new MainThreadInitializedObject<>(RecentsModel::new);
private final List<TaskThumbnailChangeListener> mThumbnailChangeListeners = new ArrayList<>(); private final List<TaskThumbnailChangeListener> mThumbnailChangeListeners = new ArrayList<>();
private final Context mContext; private final Context mContext;

View File

@ -72,6 +72,7 @@
<string name="system_shortcut_factory_class" translatable="false"></string> <string name="system_shortcut_factory_class" translatable="false"></string>
<string name="app_launch_tracker_class" translatable="false"></string> <string name="app_launch_tracker_class" translatable="false"></string>
<string name="test_information_handler_class" translatable="false"></string> <string name="test_information_handler_class" translatable="false"></string>
<string name="launcher_activity_logic_class" translatable="false"></string>
<!-- Package name of the default wallpaper picker. --> <!-- Package name of the default wallpaper picker. -->
<string name="wallpaper_picker_package" translatable="false"></string> <string name="wallpaper_picker_package" translatable="false"></string>

View File

@ -1,16 +1,17 @@
package com.android.launcher3; package com.android.launcher3;
import android.content.Context; import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherActivityInfo;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.ResourceBasedOverride; import com.android.launcher3.util.ResourceBasedOverride;
public class IconProvider implements ResourceBasedOverride { public class IconProvider implements ResourceBasedOverride {
public static IconProvider newInstance(Context context) { public static MainThreadInitializedObject<IconProvider> INSTANCE =
return Overrides.getObject(IconProvider.class, context, R.string.icon_provider_class); forOverride(IconProvider.class, R.string.icon_provider_class);
}
public IconProvider() { } public IconProvider() { }

View File

@ -19,14 +19,12 @@ package com.android.launcher3;
import static com.android.launcher3.InvariantDeviceProfile.CHANGE_FLAG_ICON_PARAMS; import static com.android.launcher3.InvariantDeviceProfile.CHANGE_FLAG_ICON_PARAMS;
import static com.android.launcher3.util.SecureSettingsObserver.newNotificationSettingsObserver; import static com.android.launcher3.util.SecureSettingsObserver.newNotificationSettingsObserver;
import android.app.KeyguardManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentProviderClient; import android.content.ContentProviderClient;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.Handler; import android.os.Handler;
import android.os.Process;
import android.util.Log; import android.util.Log;
import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.LauncherAppsCompat;
@ -46,7 +44,7 @@ public class LauncherAppState {
// We do not need any synchronization for this variable as its only written on UI thread. // We do not need any synchronization for this variable as its only written on UI thread.
private static final MainThreadInitializedObject<LauncherAppState> INSTANCE = private static final MainThreadInitializedObject<LauncherAppState> INSTANCE =
new MainThreadInitializedObject<>((c) -> new LauncherAppState(c)); new MainThreadInitializedObject<>(LauncherAppState::new);
private final Context mContext; private final Context mContext;
private final LauncherModel mModel; private final LauncherModel mModel;

View File

@ -17,6 +17,7 @@
package com.android.launcher3.graphics; package com.android.launcher3.graphics;
import static com.android.launcher3.graphics.IconShape.getShapePath; import static com.android.launcher3.graphics.IconShape.getShapePath;
import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import android.content.Context; import android.content.Context;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
@ -31,6 +32,8 @@ import android.os.Process;
import android.os.UserHandle; import android.os.UserHandle;
import android.util.ArrayMap; import android.util.ArrayMap;
import androidx.annotation.UiThread;
import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.FastBitmapDrawable;
import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.ItemInfoWithIcon;
import com.android.launcher3.R; import com.android.launcher3.R;
@ -38,16 +41,13 @@ import com.android.launcher3.icons.BitmapInfo;
import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.ResourceBasedOverride; import com.android.launcher3.util.ResourceBasedOverride;
import androidx.annotation.UiThread;
/** /**
* Factory for creating new drawables. * Factory for creating new drawables.
*/ */
public class DrawableFactory implements ResourceBasedOverride { public class DrawableFactory implements ResourceBasedOverride {
public static final MainThreadInitializedObject<DrawableFactory> INSTANCE = public static final MainThreadInitializedObject<DrawableFactory> INSTANCE =
new MainThreadInitializedObject<>(c -> Overrides.getObject(DrawableFactory.class, forOverride(DrawableFactory.class, R.string.drawable_factory_class);
c.getApplicationContext(), R.string.drawable_factory_class));
protected final UserHandle mMyUser = Process.myUserHandle(); protected final UserHandle mMyUser = Process.myUserHandle();
protected final ArrayMap<UserHandle, Bitmap> mUserBadges = new ArrayMap<>(); protected final ArrayMap<UserHandle, Bitmap> mUserBadges = new ArrayMap<>();

View File

@ -29,6 +29,8 @@ import android.os.Process;
import android.os.UserHandle; import android.os.UserHandle;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull;
import com.android.launcher3.AppInfo; import com.android.launcher3.AppInfo;
import com.android.launcher3.IconProvider; import com.android.launcher3.IconProvider;
import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.InvariantDeviceProfile;
@ -36,8 +38,8 @@ import com.android.launcher3.ItemInfoWithIcon;
import com.android.launcher3.LauncherFiles; import com.android.launcher3.LauncherFiles;
import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel;
import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.MainThreadExecutor;
import com.android.launcher3.WorkspaceItemInfo;
import com.android.launcher3.Utilities; import com.android.launcher3.Utilities;
import com.android.launcher3.WorkspaceItemInfo;
import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.LauncherAppsCompat;
import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.compat.UserManagerCompat;
import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic; import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic;
@ -50,8 +52,6 @@ import com.android.launcher3.util.Preconditions;
import java.util.function.Supplier; import java.util.function.Supplier;
import androidx.annotation.NonNull;
/** /**
* Cache of application icons. Icons can be made from any thread. * Cache of application icons. Icons can be made from any thread.
*/ */
@ -75,11 +75,11 @@ public class IconCache extends BaseIconCache {
super(context, LauncherFiles.APP_ICONS_DB, LauncherModel.getWorkerLooper(), super(context, LauncherFiles.APP_ICONS_DB, LauncherModel.getWorkerLooper(),
inv.fillResIconDpi, inv.iconBitmapSize, true /* inMemoryCache */); inv.fillResIconDpi, inv.iconBitmapSize, true /* inMemoryCache */);
mComponentWithLabelCachingLogic = new ComponentCachingLogic(context); mComponentWithLabelCachingLogic = new ComponentCachingLogic(context);
mLauncherActivityInfoCachingLogic = new LauncherActivtiyCachingLogic(this); mLauncherActivityInfoCachingLogic = LauncherActivityCachingLogic.newInstance(context);
mLauncherApps = LauncherAppsCompat.getInstance(mContext); mLauncherApps = LauncherAppsCompat.getInstance(mContext);
mUserManager = UserManagerCompat.getInstance(mContext); mUserManager = UserManagerCompat.getInstance(mContext);
mInstantAppResolver = InstantAppResolver.newInstance(mContext); mInstantAppResolver = InstantAppResolver.newInstance(mContext);
mIconProvider = IconProvider.newInstance(context); mIconProvider = IconProvider.INSTANCE.get(context);
} }
@Override @Override

View File

@ -20,14 +20,23 @@ import android.content.Context;
import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherActivityInfo;
import android.os.UserHandle; import android.os.UserHandle;
import com.android.launcher3.IconProvider;
import com.android.launcher3.R;
import com.android.launcher3.icons.cache.CachingLogic; import com.android.launcher3.icons.cache.CachingLogic;
import com.android.launcher3.util.ResourceBasedOverride;
public class LauncherActivtiyCachingLogic implements CachingLogic<LauncherActivityInfo> { /**
* Caching logic for LauncherActivityInfo.
*/
public class LauncherActivityCachingLogic
implements CachingLogic<LauncherActivityInfo>, ResourceBasedOverride {
private final IconCache mCache; /**
* Creates and returns a new instance
public LauncherActivtiyCachingLogic(IconCache cache) { */
mCache = cache; public static LauncherActivityCachingLogic newInstance(Context context) {
return Overrides.getObject(LauncherActivityCachingLogic.class, context,
R.string.launcher_activity_logic_class);
} }
@Override @Override
@ -49,8 +58,10 @@ public class LauncherActivtiyCachingLogic implements CachingLogic<LauncherActivi
public void loadIcon(Context context, LauncherActivityInfo object, public void loadIcon(Context context, LauncherActivityInfo object,
BitmapInfo target) { BitmapInfo target) {
LauncherIcons li = LauncherIcons.obtain(context); LauncherIcons li = LauncherIcons.obtain(context);
li.createBadgedIconBitmap(mCache.getFullResIcon(object), li.createBadgedIconBitmap(
IconProvider.INSTANCE.get(context)
.getIcon(object, li.mFillResIconDpi, true /* flattenDrawable */),
object.getUser(), object.getApplicationInfo().targetSdkVersion).applyTo(target); object.getUser(), object.getApplicationInfo().targetSdkVersion).applyTo(target);
li.recycle(); li.recycle();
} }
} }

View File

@ -15,18 +15,18 @@
*/ */
package com.android.launcher3.model; package com.android.launcher3.model;
import static com.android.launcher3.util.ResourceBasedOverride.Overrides.getObject; import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import android.content.ComponentName; import android.content.ComponentName;
import android.os.UserHandle; import android.os.UserHandle;
import androidx.annotation.Nullable;
import com.android.launcher3.R; import com.android.launcher3.R;
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.ResourceBasedOverride; import com.android.launcher3.util.ResourceBasedOverride;
import androidx.annotation.Nullable;
/** /**
* Callback for receiving various app launch events * Callback for receiving various app launch events
*/ */
@ -43,8 +43,7 @@ public class AppLaunchTracker implements ResourceBasedOverride {
public static final MainThreadInitializedObject<AppLaunchTracker> INSTANCE = public static final MainThreadInitializedObject<AppLaunchTracker> INSTANCE =
new MainThreadInitializedObject<>(c -> forOverride(AppLaunchTracker.class, R.string.app_launch_tracker_class);
getObject(AppLaunchTracker.class, c, R.string.app_launch_tracker_class));
public void onStartShortcut(String packageName, String shortcutId, UserHandle user, public void onStartShortcut(String packageName, String shortcutId, UserHandle user,
@Nullable String container) { } @Nullable String container) { }

View File

@ -49,8 +49,8 @@ import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherAppWidgetInfo;
import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel;
import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings;
import com.android.launcher3.WorkspaceItemInfo;
import com.android.launcher3.Utilities; import com.android.launcher3.Utilities;
import com.android.launcher3.WorkspaceItemInfo;
import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.AppWidgetManagerCompat;
import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.LauncherAppsCompat;
import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.PackageInstallerCompat;
@ -61,7 +61,7 @@ import com.android.launcher3.folder.FolderIconPreviewVerifier;
import com.android.launcher3.icons.ComponentWithLabel; import com.android.launcher3.icons.ComponentWithLabel;
import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic; import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic;
import com.android.launcher3.icons.IconCache; import com.android.launcher3.icons.IconCache;
import com.android.launcher3.icons.LauncherActivtiyCachingLogic; import com.android.launcher3.icons.LauncherActivityCachingLogic;
import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.icons.cache.IconCacheUpdateHandler; import com.android.launcher3.icons.cache.IconCacheUpdateHandler;
import com.android.launcher3.logging.FileLog; import com.android.launcher3.logging.FileLog;
@ -196,7 +196,7 @@ public class LoaderTask implements Runnable {
IconCacheUpdateHandler updateHandler = mIconCache.getUpdateHandler(); IconCacheUpdateHandler updateHandler = mIconCache.getUpdateHandler();
setIgnorePackages(updateHandler); setIgnorePackages(updateHandler);
updateHandler.updateIcons(allActivityList, updateHandler.updateIcons(allActivityList,
new LauncherActivtiyCachingLogic(mApp.getIconCache()), LauncherActivityCachingLogic.newInstance(mApp.getContext()),
mApp.getModel()::onPackageIconsUpdated); mApp.getModel()::onPackageIconsUpdated);
// Take a break // Take a break

View File

@ -15,6 +15,10 @@
*/ */
package com.android.launcher3.popup; package com.android.launcher3.popup;
import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import androidx.annotation.NonNull;
import com.android.launcher3.ItemInfo; import com.android.launcher3.ItemInfo;
import com.android.launcher3.Launcher; import com.android.launcher3.Launcher;
import com.android.launcher3.R; import com.android.launcher3.R;
@ -24,13 +28,10 @@ import com.android.launcher3.util.ResourceBasedOverride;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
public class SystemShortcutFactory implements ResourceBasedOverride { public class SystemShortcutFactory implements ResourceBasedOverride {
public static final MainThreadInitializedObject<SystemShortcutFactory> INSTANCE = public static final MainThreadInitializedObject<SystemShortcutFactory> INSTANCE =
new MainThreadInitializedObject<>(c -> Overrides.getObject( forOverride(SystemShortcutFactory.class, R.string.system_shortcut_factory_class);
SystemShortcutFactory.class, c, R.string.system_shortcut_factory_class));
/** Note that these are in order of priority. */ /** Note that these are in order of priority. */
private final SystemShortcut[] mAllShortcuts; private final SystemShortcut[] mAllShortcuts;

View File

@ -18,12 +18,13 @@ package com.android.launcher3.util;
import android.content.Context; import android.content.Context;
import android.os.Looper; import android.os.Looper;
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.MainThreadExecutor;
import com.android.launcher3.util.ResourceBasedOverride.Overrides;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import androidx.annotation.VisibleForTesting;
/** /**
* Utility class for defining singletons which are initiated on main thread. * Utility class for defining singletons which are initiated on main thread.
*/ */
@ -60,6 +61,14 @@ public class MainThreadInitializedObject<T> {
mValue = value; mValue = value;
} }
/**
* Initializes a provider based on resource overrides
*/
public static <T extends ResourceBasedOverride> MainThreadInitializedObject<T> forOverride(
Class<T> clazz, int resourceId) {
return new MainThreadInitializedObject<>(c -> Overrides.getObject(clazz, c, resourceId));
}
public interface ObjectProvider<T> { public interface ObjectProvider<T> {
T get(Context context); T get(Context context);