diff options
| author | 2022-12-05 18:32:05 -0800 | |
|---|---|---|
| committer | 2022-12-05 18:32:05 -0800 | |
| commit | 44c34326ef042d849a23939d3198bc7fe354cea3 (patch) | |
| tree | 319882ce4db08df2c35a329e52ca44d8375d50fa /java/src | |
| parent | bb41b308393d013f98b8c94aa2b7b18bd18d2138 (diff) | |
Load app icons defensively
Use a placeholder when an app icon or a direct share icon loading failed
with an exception.
Bug: 260924828
Test: functionality smoke test
Test: manual test with simulate exceptions
Test: atest IntentResolverUnitTests
Change-Id: Id3e4311c6bcc23a78043622b018c410985c8b701
Diffstat (limited to 'java/src')
| -rw-r--r-- | java/src/com/android/intentresolver/ChooserListAdapter.java | 23 | ||||
| -rw-r--r-- | java/src/com/android/intentresolver/ResolverListAdapter.java | 27 | 
2 files changed, 38 insertions, 12 deletions
diff --git a/java/src/com/android/intentresolver/ChooserListAdapter.java b/java/src/com/android/intentresolver/ChooserListAdapter.java index 59d1a6e3..b9a78402 100644 --- a/java/src/com/android/intentresolver/ChooserListAdapter.java +++ b/java/src/com/android/intentresolver/ChooserListAdapter.java @@ -259,8 +259,7 @@ public class ChooserListAdapter extends ResolverListAdapter {          final ViewHolder holder = (ViewHolder) view.getTag();          if (info == null) { -            holder.icon.setImageDrawable( -                    mContext.getDrawable(R.drawable.resolver_icon_placeholder)); +            holder.icon.setImageDrawable(loadIconPlaceholder());              return;          } @@ -657,11 +656,21 @@ public class ChooserListAdapter extends ResolverListAdapter {          @Override          protected Drawable doInBackground(Void... voids) { -            return getChooserTargetIconDrawable( -                    mContext, -                    mTargetInfo.getChooserTargetIcon(), -                    mTargetInfo.getChooserTargetComponentName(), -                    mTargetInfo.getDirectShareShortcutInfo()); +            Drawable drawable; +            try { +                drawable = getChooserTargetIconDrawable( +                        mContext, +                        mTargetInfo.getChooserTargetIcon(), +                        mTargetInfo.getChooserTargetComponentName(), +                        mTargetInfo.getDirectShareShortcutInfo()); +            } catch (Exception e) { +                Log.e(TAG, +                        "Failed to load shortcut icon for " +                                + mTargetInfo.getChooserTargetComponentName(), +                        e); +                drawable = loadIconPlaceholder(); +            } +            return drawable;          }          @Override diff --git a/java/src/com/android/intentresolver/ResolverListAdapter.java b/java/src/com/android/intentresolver/ResolverListAdapter.java index 9f654594..28bbfc50 100644 --- a/java/src/com/android/intentresolver/ResolverListAdapter.java +++ b/java/src/com/android/intentresolver/ResolverListAdapter.java @@ -677,8 +677,7 @@ public class ResolverListAdapter extends BaseAdapter {      protected void onBindView(View view, TargetInfo info, int position) {          final ViewHolder holder = (ViewHolder) view.getTag();          if (info == null) { -            holder.icon.setImageDrawable( -                    mContext.getDrawable(R.drawable.resolver_icon_placeholder)); +            holder.icon.setImageDrawable(loadIconPlaceholder());              holder.bindLabel("", "", false);              return;          } @@ -704,7 +703,7 @@ public class ResolverListAdapter extends BaseAdapter {      protected final void loadIcon(DisplayResolveInfo info) {          LoadIconTask task = mIconLoaders.get(info);          if (task == null) { -            task = new LoadIconTask((DisplayResolveInfo) info); +            task = new LoadIconTask(info);              mIconLoaders.put(info, task);              task.execute();          } @@ -779,13 +778,25 @@ public class ResolverListAdapter extends BaseAdapter {          return makePresentationGetter(ri).getIcon(getUserHandle());      } +    protected final Drawable loadIconPlaceholder() { +        return mContext.getDrawable(R.drawable.resolver_icon_placeholder); +    } +      void loadFilteredItemIconTaskAsync(@NonNull ImageView iconView) {          final DisplayResolveInfo iconInfo = getFilteredItem();          if (iconView != null && iconInfo != null) {              new AsyncTask<Void, Void, Drawable>() {                  @Override                  protected Drawable doInBackground(Void... params) { -                    return loadIconForResolveInfo(iconInfo.getResolveInfo()); +                    Drawable drawable; +                    try { +                        drawable = loadIconForResolveInfo(iconInfo.getResolveInfo()); +                    } catch (Exception e) { +                        ComponentName componentName = iconInfo.getResolvedComponentName(); +                        Log.e(TAG, "Failed to load app icon for " + componentName, e); +                        drawable = loadIconPlaceholder(); +                    } +                    return drawable;                  }                  @Override @@ -1021,7 +1032,13 @@ public class ResolverListAdapter extends BaseAdapter {          @Override          protected Drawable doInBackground(Void... params) { -            return loadIconForResolveInfo(mResolveInfo); +            try { +                return loadIconForResolveInfo(mResolveInfo); +            } catch (Exception e) { +                ComponentName componentName = mDisplayResolveInfo.getResolvedComponentName(); +                Log.e(TAG, "Failed to load app icon for " + componentName, e); +                return loadIconPlaceholder(); +            }          }          @Override  |