diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2016-11-15 19:07:31 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-11-15 19:07:32 +0000 |
commit | f8d5370a9f74127c20e1ecd371a68918fe1f14ce (patch) | |
tree | 096544e51b0cf365efe1f351d87201ee35f1e8bd /src/com | |
parent | 5202aa75045d2289b0ac6875a1caaeed52d4a406 (diff) | |
parent | 712ee53c67bbfb5ad4735217f3a9b063d9c60ad9 (diff) | |
download | android_packages_apps_Trebuchet-f8d5370a9f74127c20e1ecd371a68918fe1f14ce.tar.gz android_packages_apps_Trebuchet-f8d5370a9f74127c20e1ecd371a68918fe1f14ce.tar.bz2 android_packages_apps_Trebuchet-f8d5370a9f74127c20e1ecd371a68918fe1f14ce.zip |
Merge "Catching TransactionTooLargeException when binding widget." into ub-launcher3-master
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/launcher3/LauncherAppWidgetHost.java | 54 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherAppWidgetHostView.java | 10 | ||||
-rw-r--r-- | src/com/android/launcher3/Utilities.java | 7 | ||||
-rw-r--r-- | src/com/android/launcher3/model/WidgetsModel.java | 12 |
4 files changed, 57 insertions, 26 deletions
diff --git a/src/com/android/launcher3/LauncherAppWidgetHost.java b/src/com/android/launcher3/LauncherAppWidgetHost.java index d3e535002..657b024d9 100644 --- a/src/com/android/launcher3/LauncherAppWidgetHost.java +++ b/src/com/android/launcher3/LauncherAppWidgetHost.java @@ -20,10 +20,8 @@ import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; -import android.os.DeadObjectException; -import android.os.TransactionTooLargeException; +import android.util.SparseArray; import android.view.LayoutInflater; -import android.view.View; import java.util.ArrayList; @@ -36,6 +34,7 @@ import java.util.ArrayList; public class LauncherAppWidgetHost extends AppWidgetHost { private final ArrayList<Runnable> mProviderChangeListeners = new ArrayList<Runnable>(); + private final SparseArray<LauncherAppWidgetHostView> mViews = new SparseArray<>(); private Launcher mLauncher; @@ -45,9 +44,11 @@ public class LauncherAppWidgetHost extends AppWidgetHost { } @Override - protected AppWidgetHostView onCreateView(Context context, int appWidgetId, + protected LauncherAppWidgetHostView onCreateView(Context context, int appWidgetId, AppWidgetProviderInfo appWidget) { - return new LauncherAppWidgetHostView(context); + LauncherAppWidgetHostView view = new LauncherAppWidgetHostView(context); + mViews.put(appWidgetId, view); + return view; } @Override @@ -55,15 +56,13 @@ public class LauncherAppWidgetHost extends AppWidgetHost { try { super.startListening(); } catch (Exception e) { - if (e.getCause() instanceof TransactionTooLargeException || - e.getCause() instanceof DeadObjectException) { - // We're willing to let this slide. The exception is being caused by the list of - // RemoteViews which is being passed back. The startListening relationship will - // have been established by this point, and we will end up populating the - // widgets upon bind anyway. See issue 14255011 for more context. - } else { + if (!Utilities.isBinderSizeError(e)) { throw new RuntimeException(e); } + // We're willing to let this slide. The exception is being caused by the list of + // RemoteViews which is being passed back. The startListening relationship will + // have been established by this point, and we will end up populating the + // widgets upon bind anyway. See issue 14255011 for more context. } } @@ -98,7 +97,24 @@ public class LauncherAppWidgetHost extends AppWidgetHost { lahv.updateLastInflationOrientation(); return lahv; } else { - return super.createView(context, appWidgetId, appWidget); + try { + return super.createView(context, appWidgetId, appWidget); + } catch (Exception e) { + if (!Utilities.isBinderSizeError(e)) { + throw new RuntimeException(e); + } + + // If the exception was thrown while fetching the remote views, let the view stay. + // This will ensure that if the widget posts a valid update later, the view + // will update. + LauncherAppWidgetHostView view = mViews.get(appWidgetId); + if (view == null) { + view = onCreateView(mLauncher, appWidgetId, appWidget); + } + view.setAppWidget(appWidgetId, appWidget); + view.switchToErrorView(); + return view; + } } } @@ -114,4 +130,16 @@ public class LauncherAppWidgetHost extends AppWidgetHost { // launcher spans accordingly. info.initSpans(); } + + @Override + public void deleteAppWidgetId(int appWidgetId) { + super.deleteAppWidgetId(appWidgetId); + mViews.remove(appWidgetId); + } + + @Override + protected void clearViews() { + super.clearViews(); + mViews.clear(); + } } diff --git a/src/com/android/launcher3/LauncherAppWidgetHostView.java b/src/com/android/launcher3/LauncherAppWidgetHostView.java index b34d1ff99..a4ea44916 100644 --- a/src/com/android/launcher3/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/LauncherAppWidgetHostView.java @@ -77,7 +77,7 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc mContext = context; mLongPressHelper = new CheckLongPressHelper(this); mStylusEventHelper = new StylusEventHelper(new SimpleOnStylusPressListener(this), this); - mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mInflater = LayoutInflater.from(context); setAccessibilityDelegate(Launcher.getLauncher(context).getAccessibilityDelegate()); setBackgroundResource(R.drawable.widget_internal_focus_bg); @@ -316,6 +316,11 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc setSelected(childIsFocused); } + public void switchToErrorView() { + // Update the widget with 0 Layout id, to reset the view to error view. + updateAppWidget(new RemoteViews(getAppWidgetInfo().provider.getPackageName(), 0)); + } + @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { try { @@ -324,8 +329,7 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc post(new Runnable() { @Override public void run() { - // Update the widget with 0 Layout id, to reset the view to error view. - updateAppWidget(new RemoteViews(getAppWidgetInfo().provider.getPackageName(), 0)); + switchToErrorView(); } }); } diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index e82c32e89..416ca8e3e 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -38,7 +38,9 @@ import android.graphics.Paint; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; +import android.os.DeadObjectException; import android.os.PowerManager; +import android.os.TransactionTooLargeException; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; @@ -648,4 +650,9 @@ public final class Utilities { accessibilityManager.sendAccessibilityEvent(event); } } + + public static boolean isBinderSizeError(Exception e) { + return e.getCause() instanceof TransactionTooLargeException + || e.getCause() instanceof DeadObjectException; + } } diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java index 3953f3964..64043f484 100644 --- a/src/com/android/launcher3/model/WidgetsModel.java +++ b/src/com/android/launcher3/model/WidgetsModel.java @@ -6,17 +6,14 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.os.DeadObjectException; -import android.os.TransactionTooLargeException; import android.util.Log; import com.android.launcher3.AppFilter; import com.android.launcher3.IconCache; import com.android.launcher3.InvariantDeviceProfile; -import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetProviderInfo; -import com.android.launcher3.compat.AlphabeticIndexCompat; +import com.android.launcher3.Utilities; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.config.ProviderConfig; @@ -24,10 +21,7 @@ import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.Preconditions; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; -import java.util.List; /** * Widgets data model that is used by the adapters of the widget views and controllers. @@ -80,9 +74,7 @@ public class WidgetsModel { } setWidgetsAndShortcuts(widgetsAndShortcuts); } catch (Exception e) { - if (!ProviderConfig.IS_DOGFOOD_BUILD && - (e.getCause() instanceof TransactionTooLargeException || - e.getCause() instanceof DeadObjectException)) { + if (!ProviderConfig.IS_DOGFOOD_BUILD && Utilities.isBinderSizeError(e)) { // 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 |