diff options
Diffstat (limited to 'src/com/android/launcher3/compat')
9 files changed, 103 insertions, 141 deletions
diff --git a/src/com/android/launcher3/compat/AlphabeticIndexCompat.java b/src/com/android/launcher3/compat/AlphabeticIndexCompat.java index dfdcc7089..46c9006dd 100644 --- a/src/com/android/launcher3/compat/AlphabeticIndexCompat.java +++ b/src/com/android/launcher3/compat/AlphabeticIndexCompat.java @@ -3,7 +3,6 @@ package com.android.launcher3.compat; import android.content.Context; import android.icu.text.AlphabeticIndex; import android.os.LocaleList; -import android.util.Log; import com.android.launcher3.Utilities; @@ -12,28 +11,32 @@ import java.util.Locale; import androidx.annotation.NonNull; public class AlphabeticIndexCompat { - private static final String TAG = "AlphabeticIndexCompat"; private static final String MID_DOT = "\u2219"; - private final BaseIndex mBaseIndex; private final String mDefaultMiscLabel; + private final AlphabeticIndex.ImmutableIndex mBaseIndex; + public AlphabeticIndexCompat(Context context) { - BaseIndex index = null; + this(context.getResources().getConfiguration().getLocales()); + } - try { - index = new AlphabeticIndexVN(context); - } catch (Exception e) { - Log.d(TAG, "Unable to load the system index", e); - } + public AlphabeticIndexCompat(LocaleList locales) { + int localeCount = locales.size(); - mBaseIndex = index == null ? new BaseIndex() : index; + Locale primaryLocale = localeCount == 0 ? Locale.ENGLISH : locales.get(0); + AlphabeticIndex indexBuilder = new AlphabeticIndex(primaryLocale); + for (int i = 1; i < localeCount; i++) { + indexBuilder.addLabels(locales.get(i)); + } + indexBuilder.addLabels(Locale.ENGLISH); + mBaseIndex = indexBuilder.buildImmutableIndex(); - if (context.getResources().getConfiguration().locale - .getLanguage().equals(Locale.JAPANESE.getLanguage())) { + if (primaryLocale.getLanguage().equals(Locale.JAPANESE.getLanguage())) { // Japanese character 他 ("misc") mDefaultMiscLabel = "\u4ed6"; - // TODO(winsonc, omakoto): We need to handle Japanese sections better, especially the kanji + // TODO(winsonc, omakoto): We need to handle Japanese sections better, + // especially the kanji } else { // Dot mDefaultMiscLabel = MID_DOT; @@ -45,7 +48,7 @@ public class AlphabeticIndexCompat { */ public String computeSectionName(@NonNull CharSequence cs) { String s = Utilities.trim(cs); - String sectionName = mBaseIndex.getBucketLabel(mBaseIndex.getBucketIndex(s)); + String sectionName = mBaseIndex.getBucket(mBaseIndex.getBucketIndex(s)).getLabel(); if (Utilities.trim(sectionName).isEmpty() && s.length() > 0) { int c = s.codePointAt(0); boolean startsWithDigit = Character.isDigit(c); @@ -66,71 +69,4 @@ public class AlphabeticIndexCompat { } return sectionName; } - - /** - * Base class to support Alphabetic indexing if not supported by the framework. - * TODO(winsonc): disable for non-english locales - */ - private static class BaseIndex { - - private static final String BUCKETS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-"; - private static final int UNKNOWN_BUCKET_INDEX = BUCKETS.length() - 1; - - /** - * Returns the index of the bucket in which the given string should appear. - */ - protected int getBucketIndex(@NonNull String s) { - if (s.isEmpty()) { - return UNKNOWN_BUCKET_INDEX; - } - int index = BUCKETS.indexOf(s.substring(0, 1).toUpperCase()); - if (index != -1) { - return index; - } - return UNKNOWN_BUCKET_INDEX; - } - - /** - * Returns the label for the bucket at the given index (as returned by getBucketIndex). - */ - protected String getBucketLabel(int index) { - return BUCKETS.substring(index, index + 1); - } - } - - /** - * Implementation based on {@link AlphabeticIndex}. - */ - private static class AlphabeticIndexVN extends BaseIndex { - - private final AlphabeticIndex.ImmutableIndex mAlphabeticIndex; - - public AlphabeticIndexVN(Context context) { - LocaleList locales = context.getResources().getConfiguration().getLocales(); - int localeCount = locales.size(); - - Locale primaryLocale = localeCount == 0 ? Locale.ENGLISH : locales.get(0); - AlphabeticIndex indexBuilder = new AlphabeticIndex(primaryLocale); - for (int i = 1; i < localeCount; i++) { - indexBuilder.addLabels(locales.get(i)); - } - indexBuilder.addLabels(Locale.ENGLISH); - - mAlphabeticIndex = indexBuilder.buildImmutableIndex(); - } - - /** - * Returns the index of the bucket in which {@param s} should appear. - */ - protected int getBucketIndex(String s) { - return mAlphabeticIndex.getBucketIndex(s); - } - - /** - * Returns the label for the bucket at the given index - */ - protected String getBucketLabel(int index) { - return mAlphabeticIndex.getBucket(index).getLabel(); - } - } } diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java index 32432561b..fc5d11c23 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java @@ -23,19 +23,18 @@ import android.content.Context; import android.os.Bundle; import android.os.UserHandle; +import androidx.annotation.Nullable; + import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.Utilities; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.PackageUserKey; -import com.android.launcher3.widget.custom.CustomWidgetParser; +import com.android.launcher3.widget.custom.CustomWidgetManager; import java.util.HashMap; import java.util.List; -import androidx.annotation.Nullable; - public abstract class AppWidgetManagerCompat { private static final Object sInstanceLock = new Object(); @@ -63,11 +62,9 @@ public abstract class AppWidgetManagerCompat { } public LauncherAppWidgetProviderInfo getLauncherAppWidgetInfo(int appWidgetId) { - if (FeatureFlags.ENABLE_CUSTOM_WIDGETS - && appWidgetId <= LauncherAppWidgetInfo.CUSTOM_WIDGET_ID) { - return CustomWidgetParser.getWidgetProvider(mContext, appWidgetId); + if (appWidgetId <= LauncherAppWidgetInfo.CUSTOM_WIDGET_ID) { + return CustomWidgetManager.INSTANCE.get(mContext).getWidgetProvider(appWidgetId); } - AppWidgetProviderInfo info = mAppWidgetManager.getAppWidgetInfo(appWidgetId); return info == null ? null : LauncherAppWidgetProviderInfo.fromProviderInfo(mContext, info); } diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java index 106574832..c8b1f67c3 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java @@ -24,12 +24,15 @@ import android.os.Process; import android.os.UserHandle; import android.os.UserManager; +import androidx.annotation.Nullable; + import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.PackageUserKey; -import com.android.launcher3.widget.custom.CustomWidgetParser; +import com.android.launcher3.widget.custom.CustomAppWidgetProviderInfo; +import com.android.launcher3.widget.custom.CustomWidgetManager; import java.util.ArrayList; import java.util.Collections; @@ -37,8 +40,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; -import androidx.annotation.Nullable; - class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { private final UserManager mUserManager; @@ -54,14 +55,11 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { return Collections.emptyList(); } if (packageUser == null) { - ArrayList<AppWidgetProviderInfo> providers = new ArrayList<AppWidgetProviderInfo>(); + ArrayList<AppWidgetProviderInfo> providers = new ArrayList<>(); for (UserHandle user : mUserManager.getUserProfiles()) { providers.addAll(mAppWidgetManager.getInstalledProvidersForProfile(user)); } - - if (FeatureFlags.ENABLE_CUSTOM_WIDGETS) { - providers.addAll(CustomWidgetParser.getCustomWidgets(mContext)); - } + providers.addAll(getCustomWidgets()); return providers; } // Only get providers for the given package/user. @@ -74,9 +72,9 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { } } - if (FeatureFlags.ENABLE_CUSTOM_WIDGETS && Process.myUserHandle().equals(packageUser.mUser) + if (Process.myUserHandle().equals(packageUser.mUser) && mContext.getPackageName().equals(packageUser.mPackageName)) { - providers.addAll(CustomWidgetParser.getCustomWidgets(mContext)); + providers.addAll(getCustomWidgets()); } return providers; } @@ -87,9 +85,7 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { if (FeatureFlags.GO_DISABLE_WIDGETS) { return false; } - - if (FeatureFlags.ENABLE_CUSTOM_WIDGETS - && appWidgetId <= LauncherAppWidgetInfo.CUSTOM_WIDGET_ID) { + if (appWidgetId <= LauncherAppWidgetInfo.CUSTOM_WIDGET_ID) { return true; } return mAppWidgetManager.bindAppWidgetIdIfAllowed( @@ -108,9 +104,8 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { } } - if (FeatureFlags.ENABLE_CUSTOM_WIDGETS && Process.myUserHandle().equals(user)) { - for (LauncherAppWidgetProviderInfo info : - CustomWidgetParser.getCustomWidgets(mContext)) { + if (Process.myUserHandle().equals(user)) { + for (LauncherAppWidgetProviderInfo info : getCustomWidgets()) { if (info.provider.equals(provider)) { return info; } @@ -131,13 +126,13 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { result.put(new ComponentKey(info.provider, user), info); } } - - if (FeatureFlags.ENABLE_CUSTOM_WIDGETS) { - for (LauncherAppWidgetProviderInfo info : - CustomWidgetParser.getCustomWidgets(mContext)) { - result.put(new ComponentKey(info.provider, info.getProfile()), info); - } + for (LauncherAppWidgetProviderInfo info : getCustomWidgets()) { + result.put(new ComponentKey(info.provider, info.getProfile()), info); } return result; } + + List<CustomAppWidgetProviderInfo> getCustomWidgets() { + return CustomWidgetManager.INSTANCE.get(mContext).getCustomWidgets(); + } } diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompatVO.java b/src/com/android/launcher3/compat/AppWidgetManagerCompatVO.java index b7b0563ba..11ec333d1 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompatVO.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompatVO.java @@ -19,14 +19,14 @@ package com.android.launcher3.compat; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; +import androidx.annotation.Nullable; + import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.PackageUserKey; import java.util.Collections; import java.util.List; -import androidx.annotation.Nullable; - class AppWidgetManagerCompatVO extends AppWidgetManagerCompatVL { AppWidgetManagerCompatVO(Context context) { diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index 58fc73d23..39f69498b 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -22,30 +22,34 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageInstaller; +import android.content.pm.PackageInstaller.SessionCallback; import android.content.pm.ShortcutInfo; import android.graphics.Rect; import android.os.Bundle; import android.os.UserHandle; +import androidx.annotation.Nullable; + import com.android.launcher3.Utilities; +import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.PackageUserKey; import java.util.List; -import androidx.annotation.Nullable; - public abstract class LauncherAppsCompat { public interface OnAppsChangedCallbackCompat { - void onPackageRemoved(String packageName, UserHandle user); - void onPackageAdded(String packageName, UserHandle user); - void onPackageChanged(String packageName, UserHandle user); - void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing); - void onPackagesUnavailable(String[] packageNames, UserHandle user, boolean replacing); - void onPackagesSuspended(String[] packageNames, UserHandle user); - void onPackagesUnsuspended(String[] packageNames, UserHandle user); - void onShortcutsChanged(String packageName, List<ShortcutInfo> shortcuts, - UserHandle user); + default void onPackageRemoved(String packageName, UserHandle user) { } + default void onPackageAdded(String packageName, UserHandle user) { } + default void onPackageChanged(String packageName, UserHandle user) { } + default void onPackagesAvailable(String[] packageNames, UserHandle user, + boolean replacing) { } + default void onPackagesUnavailable(String[] packageNames, UserHandle user, + boolean replacing) { } + default void onPackagesSuspended(String[] packageNames, UserHandle user) { } + default void onPackagesUnsuspended(String[] packageNames, UserHandle user) { } + default void onShortcutsChanged(String packageName, List<ShortcutInfo> shortcuts, + UserHandle user) { } } protected LauncherAppsCompat() { @@ -88,4 +92,8 @@ public abstract class LauncherAppsCompat { @Nullable PackageUserKey packageUser); public abstract List<PackageInstaller.SessionInfo> getAllPackageInstallerSessions(); + + public abstract void registerSessionCallback(LooperExecutor executor, + SessionCallback sessionCallback); + public abstract void unregisterSessionCallback(SessionCallback sessionCallback); } diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java index 1885d8f03..281274ce0 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java @@ -23,6 +23,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; import android.content.pm.PackageInstaller; +import android.content.pm.PackageInstaller.SessionCallback; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; @@ -35,6 +36,7 @@ import android.util.Log; import com.android.launcher3.compat.ShortcutConfigActivityInfo.ShortcutConfigActivityInfoVL; import com.android.launcher3.testing.TestProtocol; +import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.PackageUserKey; import java.util.ArrayList; @@ -212,5 +214,17 @@ public class LauncherAppsCompatVL extends LauncherAppsCompat { public List<PackageInstaller.SessionInfo> getAllPackageInstallerSessions() { return mContext.getPackageManager().getPackageInstaller().getAllSessions(); } + + @Override + public void registerSessionCallback(LooperExecutor executor, SessionCallback sessionCallback) { + mContext.getPackageManager().getPackageInstaller().registerSessionCallback(sessionCallback, + executor.getHandler()); + } + + @Override + public void unregisterSessionCallback(SessionCallback sessionCallback) { + mContext.getPackageManager().getPackageInstaller() + .unregisterSessionCallback(sessionCallback); + } } diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java index 6e7a1bdcf..5e13d00b7 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java @@ -16,6 +16,8 @@ package com.android.launcher3.compat; +import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; + import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; @@ -30,19 +32,17 @@ import android.os.Parcelable; import android.os.Process; import android.os.UserHandle; +import androidx.annotation.Nullable; + import com.android.launcher3.LauncherAppState; -import com.android.launcher3.LauncherModel; import com.android.launcher3.WorkspaceItemInfo; import com.android.launcher3.compat.ShortcutConfigActivityInfo.ShortcutConfigActivityInfoVO; import com.android.launcher3.icons.LauncherIcons; -import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.PackageUserKey; import java.util.ArrayList; import java.util.List; -import androidx.annotation.Nullable; - @TargetApi(26) public class LauncherAppsCompatVO extends LauncherAppsCompatVL { @@ -120,7 +120,7 @@ public class LauncherAppsCompatVO extends LauncherAppsCompatVL { } } else { // Block the worker thread until the accept() is called. - new LooperExecutor(LauncherModel.getWorkerLooper()).execute(new Runnable() { + MODEL_EXECUTOR.execute(new Runnable() { @Override public void run() { try { diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVQ.java b/src/com/android/launcher3/compat/LauncherAppsCompatVQ.java index 0a1811e34..48805afa0 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVQ.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVQ.java @@ -18,8 +18,10 @@ package com.android.launcher3.compat; import android.annotation.TargetApi; import android.content.Context; -import android.content.Intent; import android.content.pm.PackageInstaller; +import android.content.pm.PackageInstaller.SessionCallback; + +import com.android.launcher3.util.LooperExecutor; import java.util.List; @@ -33,4 +35,14 @@ public class LauncherAppsCompatVQ extends LauncherAppsCompatVO { public List<PackageInstaller.SessionInfo> getAllPackageInstallerSessions() { return mLauncherApps.getAllPackageInstallerSessions(); } + + @Override + public void registerSessionCallback(LooperExecutor executor, SessionCallback sessionCallback) { + mLauncherApps.registerPackageInstallerSessionCallback(executor, sessionCallback); + } + + @Override + public void unregisterSessionCallback(SessionCallback sessionCallback) { + mLauncherApps.unregisterPackageInstallerSessionCallback(sessionCallback); + } } diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index 879d963c7..409b21ddc 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -16,13 +16,14 @@ package com.android.launcher3.compat; +import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; + import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller.SessionCallback; import android.content.pm.PackageInstaller.SessionInfo; import android.content.pm.PackageManager; -import android.os.Handler; import android.os.UserHandle; import android.text.TextUtils; import android.util.SparseArray; @@ -31,7 +32,6 @@ import com.android.launcher3.SessionCommitReceiver; import com.android.launcher3.Utilities; import com.android.launcher3.icons.IconCache; import com.android.launcher3.LauncherAppState; -import com.android.launcher3.LauncherModel; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; @@ -53,7 +53,6 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { @Thunk final PackageInstaller mInstaller; private final IconCache mCache; - private final Handler mWorker; private final Context mAppContext; private final HashMap<String,Boolean> mSessionVerifiedMap = new HashMap<>(); private final LauncherAppsCompat mLauncherApps; @@ -63,11 +62,10 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { mAppContext = context.getApplicationContext(); mInstaller = context.getPackageManager().getPackageInstaller(); mCache = LauncherAppState.getInstance(context).getIconCache(); - mWorker = new Handler(LauncherModel.getWorkerLooper()); - mInstaller.registerSessionCallback(mCallback, mWorker); mLauncherApps = LauncherAppsCompat.getInstance(context); - mPromiseIconIds = IntSet.wrap(IntArray.wrap(Utilities.getIntArrayFromString( - getPrefs(context).getString(PROMISE_ICON_IDS, "")))); + mLauncherApps.registerSessionCallback(MODEL_EXECUTOR, mCallback); + mPromiseIconIds = IntSet.wrap(IntArray.fromConcatString( + getPrefs(context).getString(PROMISE_ICON_IDS, ""))); cleanUpPromiseIconIds(); } @@ -127,7 +125,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { @Override public void onStop() { - mInstaller.unregisterSessionCallback(mCallback); + mLauncherApps.unregisterSessionCallback(mCallback); } @Thunk void sendUpdate(PackageInstallInfo info) { @@ -223,12 +221,14 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { private SessionInfo pushSessionDisplayToLauncher(int sessionId) { SessionInfo session = verify(mInstaller.getSessionInfo(sessionId)); if (session != null && session.getAppPackageName() != null) { + UserHandle user = getUserHandle(session); mActiveSessions.put(session.getSessionId(), - new PackageUserKey(session.getAppPackageName(), getUserHandle(session))); - addSessionInfoToCache(session, getUserHandle(session)); + new PackageUserKey(session.getAppPackageName(), user)); + addSessionInfoToCache(session, user); LauncherAppState app = LauncherAppState.getInstanceNoCreate(); if (app != null) { - app.getModel().updateSessionDisplayInfo(session.getAppPackageName()); + app.getModel().updateSessionDisplayInfo(session.getAppPackageName(), + user); } return session; } |