Loading iconloaderlib/src/com/android/launcher3/icons/cache/BaseIconCache.java +54 −37 Original line number Diff line number Diff line Loading @@ -36,12 +36,16 @@ import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; import android.os.LocaleList; import android.os.Looper; import android.os.Process; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.icons.BaseIconFactory; import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.BitmapRenderer; Loading @@ -57,8 +61,6 @@ import java.util.Map; import java.util.Set; import java.util.function.Supplier; import androidx.annotation.NonNull; public abstract class BaseIconCache { private static final String TAG = "BaseIconCache"; Loading @@ -84,6 +86,7 @@ public abstract class BaseIconCache { protected int mIconDpi; protected IconDB mIconDb; protected LocaleList mLocaleList = LocaleList.getEmptyLocaleList(); protected String mSystemState = ""; private final String mDbFileName; Loading Loading @@ -227,12 +230,12 @@ public abstract class BaseIconCache { /** * 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() { final String locale = mContext.getResources().getConfiguration().getLocales().toLanguageTags(); mSystemState = locale + "," + Build.VERSION.SDK_INT; mLocaleList = mContext.getResources().getConfiguration().getLocales(); mSystemState = mLocaleList.toLanguageTags() + "," + Build.VERSION.SDK_INT; } protected String getIconSystemState(String packageName) { Loading Loading @@ -269,7 +272,7 @@ public abstract class BaseIconCache { mCache.put(key, entry); ContentValues values = newContentValues(entry, entry.title.toString(), componentName.getPackageName()); componentName.getPackageName(), cachingLogic.getKeywords(object, mLocaleList)); addIconToDB(values, componentName, info, userSerial); } Loading Loading @@ -445,7 +448,7 @@ public abstract class BaseIconCache { // Add the icon in the DB here, since these do not get written during // package updates. ContentValues values = newContentValues( iconInfo, entry.title.toString(), packageName); iconInfo, entry.title.toString(), packageName, null); addIconToDB(values, cacheKey.componentName, info, getSerialNumberForUser(user)); } catch (NameNotFoundException e) { Loading Loading @@ -504,23 +507,35 @@ public abstract class BaseIconCache { return false; } static final class IconDB extends SQLiteCacheHelper { private final static int RELEASE_VERSION = 26; public final static String TABLE_NAME = "icons"; public final static String COLUMN_ROWID = "rowid"; public final static String COLUMN_COMPONENT = "componentName"; public final static String COLUMN_USER = "profileId"; public final static String COLUMN_LAST_UPDATED = "lastUpdated"; 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"; /** * 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[] COLUMNS_HIGH_RES = new String[] { /** * Cache class to store the actual entries on disk */ public static final class IconDB extends SQLiteCacheHelper { private static final int RELEASE_VERSION = 27; 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 }; 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 }; public IconDB(Context context, String dbFileName, int iconPixelSize) { Loading @@ -529,21 +544,23 @@ public abstract class BaseIconCache { @Override protected void onCreateTable(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + COLUMN_COMPONENT + " TEXT NOT NULL, " + COLUMN_USER + " INTEGER NOT NULL, " + COLUMN_LAST_UPDATED + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_VERSION + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_ICON + " BLOB, " + COLUMN_ICON_COLOR + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_LABEL + " TEXT, " + COLUMN_SYSTEM_STATE + " TEXT, " + "PRIMARY KEY (" + COLUMN_COMPONENT + ", " + COLUMN_USER + ") " + ");"); } } private ContentValues newContentValues(BitmapInfo bitmapInfo, String label, String packageName) { db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + COLUMN_COMPONENT + " TEXT NOT NULL, " + COLUMN_USER + " INTEGER NOT NULL, " + COLUMN_LAST_UPDATED + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_VERSION + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_ICON + " BLOB, " + COLUMN_ICON_COLOR + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_LABEL + " TEXT, " + COLUMN_SYSTEM_STATE + " TEXT, " + COLUMN_KEYWORDS + " TEXT, " + "PRIMARY KEY (" + COLUMN_COMPONENT + ", " + COLUMN_USER + ") " + ");"); } } private ContentValues newContentValues(BitmapInfo bitmapInfo, String label, String packageName, @Nullable String keywords) { ContentValues values = new ContentValues(); values.put(IconDB.COLUMN_ICON, bitmapInfo.isLowRes() ? null : GraphicsUtils.flattenBitmap(bitmapInfo.icon)); Loading @@ -551,7 +568,7 @@ public abstract class BaseIconCache { values.put(IconDB.COLUMN_LABEL, label); values.put(IconDB.COLUMN_SYSTEM_STATE, getIconSystemState(packageName)); values.put(IconDB.COLUMN_KEYWORDS, keywords); return values; } Loading iconloaderlib/src/com/android/launcher3/icons/cache/CachingLogic.java +11 −0 Original line number Diff line number Diff line Loading @@ -17,8 +17,11 @@ package com.android.launcher3.icons.cache; import android.content.ComponentName; import android.content.Context; import android.os.LocaleList; import android.os.UserHandle; import androidx.annotation.Nullable; import com.android.launcher3.icons.BitmapInfo; public interface CachingLogic<T> { Loading @@ -30,4 +33,12 @@ public interface CachingLogic<T> { CharSequence getLabel(T object); 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; } } quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java +3 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.quickstep; import static com.android.launcher3.util.MainThreadInitializedObject.forOverride; import android.graphics.Matrix; import android.view.View; Loading Loading @@ -47,8 +49,7 @@ public class TaskOverlayFactory implements ResourceBasedOverride { }; public static final MainThreadInitializedObject<TaskOverlayFactory> INSTANCE = new MainThreadInitializedObject<>(c -> Overrides.getObject(TaskOverlayFactory.class, c, R.string.task_overlay_factory_class)); forOverride(TaskOverlayFactory.class, R.string.task_overlay_factory_class); public List<TaskSystemShortcut> getEnabledShortcuts(TaskView taskView) { final ArrayList<TaskSystemShortcut> shortcuts = new ArrayList<>(); Loading quickstep/src/com/android/quickstep/RecentsModel.java +1 −5 Original line number Diff line number Diff line Loading @@ -16,15 +16,12 @@ package com.android.quickstep; 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.app.ActivityManager; import android.content.ComponentCallbacks2; import android.content.Context; import android.os.Build; import android.os.Bundle; import android.os.HandlerThread; import android.os.Process; import android.os.RemoteException; Loading @@ -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.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; Loading @@ -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. 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 Context mContext; Loading res/values/config.xml +1 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ <string name="system_shortcut_factory_class" translatable="false"></string> <string name="app_launch_tracker_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. --> <string name="wallpaper_picker_package" translatable="false"></string> Loading Loading
iconloaderlib/src/com/android/launcher3/icons/cache/BaseIconCache.java +54 −37 Original line number Diff line number Diff line Loading @@ -36,12 +36,16 @@ import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; import android.os.LocaleList; import android.os.Looper; import android.os.Process; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.icons.BaseIconFactory; import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.BitmapRenderer; Loading @@ -57,8 +61,6 @@ import java.util.Map; import java.util.Set; import java.util.function.Supplier; import androidx.annotation.NonNull; public abstract class BaseIconCache { private static final String TAG = "BaseIconCache"; Loading @@ -84,6 +86,7 @@ public abstract class BaseIconCache { protected int mIconDpi; protected IconDB mIconDb; protected LocaleList mLocaleList = LocaleList.getEmptyLocaleList(); protected String mSystemState = ""; private final String mDbFileName; Loading Loading @@ -227,12 +230,12 @@ public abstract class BaseIconCache { /** * 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() { final String locale = mContext.getResources().getConfiguration().getLocales().toLanguageTags(); mSystemState = locale + "," + Build.VERSION.SDK_INT; mLocaleList = mContext.getResources().getConfiguration().getLocales(); mSystemState = mLocaleList.toLanguageTags() + "," + Build.VERSION.SDK_INT; } protected String getIconSystemState(String packageName) { Loading Loading @@ -269,7 +272,7 @@ public abstract class BaseIconCache { mCache.put(key, entry); ContentValues values = newContentValues(entry, entry.title.toString(), componentName.getPackageName()); componentName.getPackageName(), cachingLogic.getKeywords(object, mLocaleList)); addIconToDB(values, componentName, info, userSerial); } Loading Loading @@ -445,7 +448,7 @@ public abstract class BaseIconCache { // Add the icon in the DB here, since these do not get written during // package updates. ContentValues values = newContentValues( iconInfo, entry.title.toString(), packageName); iconInfo, entry.title.toString(), packageName, null); addIconToDB(values, cacheKey.componentName, info, getSerialNumberForUser(user)); } catch (NameNotFoundException e) { Loading Loading @@ -504,23 +507,35 @@ public abstract class BaseIconCache { return false; } static final class IconDB extends SQLiteCacheHelper { private final static int RELEASE_VERSION = 26; public final static String TABLE_NAME = "icons"; public final static String COLUMN_ROWID = "rowid"; public final static String COLUMN_COMPONENT = "componentName"; public final static String COLUMN_USER = "profileId"; public final static String COLUMN_LAST_UPDATED = "lastUpdated"; 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"; /** * 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[] COLUMNS_HIGH_RES = new String[] { /** * Cache class to store the actual entries on disk */ public static final class IconDB extends SQLiteCacheHelper { private static final int RELEASE_VERSION = 27; 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 }; 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 }; public IconDB(Context context, String dbFileName, int iconPixelSize) { Loading @@ -529,21 +544,23 @@ public abstract class BaseIconCache { @Override protected void onCreateTable(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + COLUMN_COMPONENT + " TEXT NOT NULL, " + COLUMN_USER + " INTEGER NOT NULL, " + COLUMN_LAST_UPDATED + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_VERSION + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_ICON + " BLOB, " + COLUMN_ICON_COLOR + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_LABEL + " TEXT, " + COLUMN_SYSTEM_STATE + " TEXT, " + "PRIMARY KEY (" + COLUMN_COMPONENT + ", " + COLUMN_USER + ") " + ");"); } } private ContentValues newContentValues(BitmapInfo bitmapInfo, String label, String packageName) { db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + COLUMN_COMPONENT + " TEXT NOT NULL, " + COLUMN_USER + " INTEGER NOT NULL, " + COLUMN_LAST_UPDATED + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_VERSION + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_ICON + " BLOB, " + COLUMN_ICON_COLOR + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_LABEL + " TEXT, " + COLUMN_SYSTEM_STATE + " TEXT, " + COLUMN_KEYWORDS + " TEXT, " + "PRIMARY KEY (" + COLUMN_COMPONENT + ", " + COLUMN_USER + ") " + ");"); } } private ContentValues newContentValues(BitmapInfo bitmapInfo, String label, String packageName, @Nullable String keywords) { ContentValues values = new ContentValues(); values.put(IconDB.COLUMN_ICON, bitmapInfo.isLowRes() ? null : GraphicsUtils.flattenBitmap(bitmapInfo.icon)); Loading @@ -551,7 +568,7 @@ public abstract class BaseIconCache { values.put(IconDB.COLUMN_LABEL, label); values.put(IconDB.COLUMN_SYSTEM_STATE, getIconSystemState(packageName)); values.put(IconDB.COLUMN_KEYWORDS, keywords); return values; } Loading
iconloaderlib/src/com/android/launcher3/icons/cache/CachingLogic.java +11 −0 Original line number Diff line number Diff line Loading @@ -17,8 +17,11 @@ package com.android.launcher3.icons.cache; import android.content.ComponentName; import android.content.Context; import android.os.LocaleList; import android.os.UserHandle; import androidx.annotation.Nullable; import com.android.launcher3.icons.BitmapInfo; public interface CachingLogic<T> { Loading @@ -30,4 +33,12 @@ public interface CachingLogic<T> { CharSequence getLabel(T object); 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; } }
quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java +3 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.quickstep; import static com.android.launcher3.util.MainThreadInitializedObject.forOverride; import android.graphics.Matrix; import android.view.View; Loading Loading @@ -47,8 +49,7 @@ public class TaskOverlayFactory implements ResourceBasedOverride { }; public static final MainThreadInitializedObject<TaskOverlayFactory> INSTANCE = new MainThreadInitializedObject<>(c -> Overrides.getObject(TaskOverlayFactory.class, c, R.string.task_overlay_factory_class)); forOverride(TaskOverlayFactory.class, R.string.task_overlay_factory_class); public List<TaskSystemShortcut> getEnabledShortcuts(TaskView taskView) { final ArrayList<TaskSystemShortcut> shortcuts = new ArrayList<>(); Loading
quickstep/src/com/android/quickstep/RecentsModel.java +1 −5 Original line number Diff line number Diff line Loading @@ -16,15 +16,12 @@ package com.android.quickstep; 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.app.ActivityManager; import android.content.ComponentCallbacks2; import android.content.Context; import android.os.Build; import android.os.Bundle; import android.os.HandlerThread; import android.os.Process; import android.os.RemoteException; Loading @@ -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.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; Loading @@ -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. 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 Context mContext; Loading
res/values/config.xml +1 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ <string name="system_shortcut_factory_class" translatable="false"></string> <string name="app_launch_tracker_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. --> <string name="wallpaper_picker_package" translatable="false"></string> Loading