diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher3/FocusHelper.java | 6 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherModel.java | 59 | ||||
-rw-r--r-- | src/com/android/launcher3/util/ComponentKey.java | 7 |
3 files changed, 54 insertions, 18 deletions
diff --git a/src/com/android/launcher3/FocusHelper.java b/src/com/android/launcher3/FocusHelper.java index e60704718..0dca07843 100644 --- a/src/com/android/launcher3/FocusHelper.java +++ b/src/com/android/launcher3/FocusHelper.java @@ -284,6 +284,12 @@ public class FocusHelper { if (workspace != null) { int pageIndex = workspace.getCurrentPage(); CellLayout topLayout = (CellLayout) workspace.getChildAt(pageIndex); + if (topLayout == null) { + // This is to guard against monkey actor test where the cell layout + // of the new pageIndex is null monkey issuing commands while + // animations happen. + return wasHandled; + } ShortcutAndWidgetContainer children = topLayout.getShortcutsAndWidgets(); final View newIcon = getIconInDirection(layout, children, -1, 1); // Select the first bubble text view in the current page of the workspace diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 2e5d4e9b3..ee35457b7 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -47,6 +47,7 @@ import android.os.Parcelable; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; +import android.os.TransactionTooLargeException; import android.provider.BaseColumns; import android.text.TextUtils; import android.util.Log; @@ -3338,27 +3339,51 @@ public class LauncherModel extends BroadcastReceiver public static List<LauncherAppWidgetProviderInfo> getWidgetProviders(Context context, boolean refresh) { - synchronized (sBgLock) { - if (sBgWidgetProviders == null || refresh) { - sBgWidgetProviders = new HashMap<>(); - AppWidgetManagerCompat wm = AppWidgetManagerCompat.getInstance(context); - LauncherAppWidgetProviderInfo info; + ArrayList<LauncherAppWidgetProviderInfo> results = + new ArrayList<LauncherAppWidgetProviderInfo>(); + try { + synchronized (sBgLock) { + if (sBgWidgetProviders == null || refresh) { + HashMap<ComponentKey, LauncherAppWidgetProviderInfo> tmpWidgetProviders + = new HashMap<>(); + AppWidgetManagerCompat wm = AppWidgetManagerCompat.getInstance(context); + LauncherAppWidgetProviderInfo info; + + List<AppWidgetProviderInfo> widgets = wm.getAllProviders(); + for (AppWidgetProviderInfo pInfo : widgets) { + info = LauncherAppWidgetProviderInfo.fromProviderInfo(context, pInfo); + UserHandleCompat user = wm.getUser(info); + tmpWidgetProviders.put(new ComponentKey(info.provider, user), info); + } - List<AppWidgetProviderInfo> widgets = wm.getAllProviders(); - for (AppWidgetProviderInfo pInfo : widgets) { - info = LauncherAppWidgetProviderInfo.fromProviderInfo(context, pInfo); - UserHandleCompat user = wm.getUser(info); - sBgWidgetProviders.put(new ComponentKey(info.provider, user), info); + Collection<CustomAppWidget> customWidgets = Launcher.getCustomAppWidgets().values(); + for (CustomAppWidget widget : customWidgets) { + info = new LauncherAppWidgetProviderInfo(context, widget); + UserHandleCompat user = wm.getUser(info); + tmpWidgetProviders.put(new ComponentKey(info.provider, user), info); + } + // Replace the global list at the very end, so that if there is an exception, + // previously loaded provider list is used. + sBgWidgetProviders = tmpWidgetProviders; } - - Collection<CustomAppWidget> customWidgets = Launcher.getCustomAppWidgets().values(); - for (CustomAppWidget widget : customWidgets) { - info = new LauncherAppWidgetProviderInfo(context, widget); - UserHandleCompat user = wm.getUser(info); - sBgWidgetProviders.put(new ComponentKey(info.provider, user), info); + results.addAll(sBgWidgetProviders.values()); + return results; + } + } catch (Exception e) { + if (e.getCause() instanceof TransactionTooLargeException) { + // the returned value may be incomplete and will not be refreshed until the next + // time Launcher starts. + // TODO: after figuring out a repro step, introduce a dirty bit to check when + // onResume is called to refresh the widget provider list. + synchronized (sBgLock) { + if (sBgWidgetProviders != null) { + results.addAll(sBgWidgetProviders.values()); + } + return results; } + } else { + throw e; } - return new ArrayList<LauncherAppWidgetProviderInfo>(sBgWidgetProviders.values()); } } diff --git a/src/com/android/launcher3/util/ComponentKey.java b/src/com/android/launcher3/util/ComponentKey.java index 0f17f009e..7a7ed4a4f 100644 --- a/src/com/android/launcher3/util/ComponentKey.java +++ b/src/com/android/launcher3/util/ComponentKey.java @@ -17,7 +17,7 @@ package com.android.launcher3.util; */ import android.content.ComponentName; - +import android.content.Context; import com.android.launcher3.compat.UserHandleCompat; import java.util.Arrays; @@ -38,6 +38,11 @@ public class ComponentKey { } + public ComponentKey(Context context, String componentKeyStr) { + // Do nothing + throw new UnsupportedOperationException(); + } + @Override public int hashCode() { return mHashCode; |