summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/android/launcher3/FocusHelper.java6
-rw-r--r--src/com/android/launcher3/LauncherModel.java59
-rw-r--r--src/com/android/launcher3/util/ComponentKey.java7
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;