Moved AsyncImageView out of downloads

This CL moves AsyncImageView to components/browser_ui/widget, which
includes moving AutoAnimatorDrawable, ForegroundRounderCornerImageView,
and unavailable/waiting drawable XML files.

Bug: 1134412
Change-Id: I0466620ec4571a75f9839fa575b9d07f1f201b40
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2444172
Reviewed-by: Theresa  <twellington@chromium.org>
Commit-Queue: Shakti Sahu <shaktisahu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#814637}
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 618af25..9e5dd7e 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -632,12 +632,7 @@
   "java/src/org/chromium/chrome/browser/download/home/list/mutator/PrefetchListPaginator.java",
   "java/src/org/chromium/chrome/browser/download/home/list/mutator/ScoreComparator.java",
   "java/src/org/chromium/chrome/browser/download/home/list/view/AspectRatioFrameLayout.java",
-  "java/src/org/chromium/chrome/browser/download/home/list/view/AsyncImageView.java",
-  "java/src/org/chromium/chrome/browser/download/home/list/view/AutoAnimatorDrawable.java",
   "java/src/org/chromium/chrome/browser/download/home/list/view/CircularProgressView.java",
-  "java/src/org/chromium/chrome/browser/download/home/list/view/ForegroundDrawableCompat.java",
-  "java/src/org/chromium/chrome/browser/download/home/list/view/ForegroundRoundedCornerImageView.java",
-  "java/src/org/chromium/chrome/browser/download/home/list/view/UiUtils.java",
   "java/src/org/chromium/chrome/browser/download/home/metrics/FileExtensions.java",
   "java/src/org/chromium/chrome/browser/download/home/metrics/FilterChangeLogger.java",
   "java/src/org/chromium/chrome/browser/download/home/metrics/OfflineItemStartupLogger.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressImageViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressImageViewHolder.java
index 8d5b941..6878847e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressImageViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressImageViewHolder.java
@@ -9,9 +9,11 @@
 import android.view.ViewGroup;
 import android.widget.ImageView;
 
+import androidx.appcompat.content.res.AppCompatResources;
+
 import org.chromium.chrome.browser.download.R;
 import org.chromium.chrome.browser.download.home.list.ListItem;
-import org.chromium.chrome.browser.download.home.list.view.AutoAnimatorDrawable;
+import org.chromium.components.browser_ui.widget.async_image.AutoAnimatorDrawable;
 import org.chromium.ui.modelutil.PropertyModel;
 
 /**
@@ -35,9 +37,8 @@
         super(view, true /* constrainCaption */);
 
         mPlaceholder = view.findViewById(R.id.placeholder);
-        mPlaceholder.setImageDrawable(AutoAnimatorDrawable.wrap(
-                org.chromium.chrome.browser.download.home.list.view.UiUtils.getDrawable(
-                        view.getContext(), R.drawable.async_image_view_waiting)));
+        mPlaceholder.setImageDrawable(AutoAnimatorDrawable.wrap(AppCompatResources.getDrawable(
+                view.getContext(), R.drawable.async_image_view_waiting)));
     }
 
     // InProgressViewHolder implementation.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/OfflineItemViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/OfflineItemViewHolder.java
index 5d862416..2ab691a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/OfflineItemViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/OfflineItemViewHolder.java
@@ -19,9 +19,9 @@
 import org.chromium.chrome.browser.download.home.list.ListItem;
 import org.chromium.chrome.browser.download.home.list.ListProperties;
 import org.chromium.chrome.browser.download.home.list.UiUtils;
-import org.chromium.chrome.browser.download.home.list.view.AsyncImageView;
 import org.chromium.chrome.browser.download.home.metrics.UmaUtils;
 import org.chromium.chrome.browser.download.home.view.SelectionView;
+import org.chromium.components.browser_ui.widget.async_image.AsyncImageView;
 import org.chromium.components.browser_ui.widget.listmenu.BasicListMenu;
 import org.chromium.components.browser_ui.widget.listmenu.ListMenu;
 import org.chromium.components.browser_ui.widget.listmenu.ListMenuButton;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/CircularProgressView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/CircularProgressView.java
index 25c7350..685e732 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/CircularProgressView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/CircularProgressView.java
@@ -17,6 +17,9 @@
 
 import org.chromium.base.MathUtils;
 import org.chromium.chrome.browser.download.R;
+import org.chromium.components.browser_ui.widget.async_image.AutoAnimatorDrawable;
+import org.chromium.components.browser_ui.widget.async_image.ForegroundDrawableCompat;
+import org.chromium.ui.UiUtils;
 import org.chromium.ui.widget.ChromeImageButton;
 
 import java.lang.annotation.Retention;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/UiUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/UiUtils.java
deleted file mode 100644
index 6c3586e..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/UiUtils.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.download.home.list.view;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-
-import androidx.annotation.DrawableRes;
-import androidx.annotation.Nullable;
-import androidx.annotation.StyleableRes;
-import androidx.appcompat.content.res.AppCompatResources;
-
-/** A set of helper methods to make interacting with the Android UI easier. */
-public final class UiUtils {
-    private UiUtils() {}
-
-    /**
-     * Loads a {@link Drawable} from an attribute.  Uses {@link AppCompatResources} to support all
-     * modern {@link Drawable} types.
-     * @return A new {@link Drawable} or {@code null} if the attribute wasn't set.
-     */
-    public static @Nullable Drawable getDrawable(
-            Context context, @Nullable TypedArray attrs, @StyleableRes int attrId) {
-        if (attrs == null) return null;
-
-        @DrawableRes
-        int resId = attrs.getResourceId(attrId, -1);
-        if (resId == -1) return null;
-        return UiUtils.getDrawable(context, resId);
-    }
-
-    /**
-     * Loads a {@link Drawable} from a resource Id.  Uses {@link AppCompatResources} to support all
-     * modern {@link Drawable} types.
-     * @return A new {@link Drawable}.
-     */
-    public static Drawable getDrawable(Context context, @DrawableRes int resId) {
-        return AppCompatResources.getDrawable(context, resId);
-    }
-}
\ No newline at end of file
diff --git a/chrome/browser/download/android/BUILD.gn b/chrome/browser/download/android/BUILD.gn
index 48c98d3..9eb6e8d 100644
--- a/chrome/browser/download/android/BUILD.gn
+++ b/chrome/browser/download/android/BUILD.gn
@@ -178,8 +178,6 @@
     "java/res/drawable-xxhdpi/ic_refresh_white_36dp.png",
     "java/res/drawable-xxxhdpi/ic_refresh_white_24dp.png",
     "java/res/drawable-xxxhdpi/ic_refresh_white_36dp.png",
-    "java/res/drawable/async_image_view_unavailable.xml",
-    "java/res/drawable/async_image_view_waiting.xml",
     "java/res/drawable/circular_progress_bar_background_large.xml",
     "java/res/drawable/circular_progress_bar_background_small.xml",
     "java/res/drawable/circular_progress_bar_determinate_large.xml",
diff --git a/chrome/browser/download/android/java/res/layout/download_manager_audio.xml b/chrome/browser/download/android/java/res/layout/download_manager_audio.xml
index 7d8438d..f5929ee 100644
--- a/chrome/browser/download/android/java/res/layout/download_manager_audio.xml
+++ b/chrome/browser/download/android/java/res/layout/download_manager_audio.xml
@@ -12,7 +12,7 @@
     android:layout_height="114dp"
     android:background="@drawable/hairline_border_card_background">
 
-    <org.chromium.chrome.browser.download.home.list.view.AsyncImageView
+    <org.chromium.components.browser_ui.widget.async_image.AsyncImageView
         android:id="@+id/thumbnail"
         android:layout_width="80dp"
         android:layout_height="80dp"
diff --git a/chrome/browser/download/android/java/res/layout/download_manager_generic_item.xml b/chrome/browser/download/android/java/res/layout/download_manager_generic_item.xml
index ff12878..b0be30c 100644
--- a/chrome/browser/download/android/java/res/layout/download_manager_generic_item.xml
+++ b/chrome/browser/download/android/java/res/layout/download_manager_generic_item.xml
@@ -16,7 +16,7 @@
     app:columnCount="3"
     app:rowCount="2">
 
-    <org.chromium.chrome.browser.download.home.list.view.AsyncImageView
+    <org.chromium.components.browser_ui.widget.async_image.AsyncImageView
         android:id="@+id/thumbnail"
         android:layout_width="36dp"
         android:layout_height="36dp"
diff --git a/chrome/browser/download/android/java/res/layout/download_manager_image_item.xml b/chrome/browser/download/android/java/res/layout/download_manager_image_item.xml
index bc60f4a..11074b42 100644
--- a/chrome/browser/download/android/java/res/layout/download_manager_image_item.xml
+++ b/chrome/browser/download/android/java/res/layout/download_manager_image_item.xml
@@ -13,7 +13,7 @@
     android:clickable="true"
     android:background="@color/default_bg_color_secondary" >
 
-    <org.chromium.chrome.browser.download.home.list.view.AsyncImageView
+    <org.chromium.components.browser_ui.widget.async_image.AsyncImageView
         android:id="@+id/thumbnail"
         android:layout_width="match_parent"
         android:background="@color/modern_grey_300"
diff --git a/chrome/browser/download/android/java/res/layout/download_manager_in_progress_video_item.xml b/chrome/browser/download/android/java/res/layout/download_manager_in_progress_video_item.xml
index be6377a..76a5ef0 100644
--- a/chrome/browser/download/android/java/res/layout/download_manager_in_progress_video_item.xml
+++ b/chrome/browser/download/android/java/res/layout/download_manager_in_progress_video_item.xml
@@ -15,7 +15,7 @@
     app:rowCount="2">
 
     <!-- Set the src attribute in Java to wrap the drawable properly. -->
-    <org.chromium.chrome.browser.download.home.list.view.ForegroundRoundedCornerImageView
+    <org.chromium.components.browser_ui.widget.async_image.ForegroundRoundedCornerImageView
         android:id="@+id/thumbnail"
         android:layout_width="match_parent"
         android:layout_height="200dp"
diff --git a/chrome/browser/download/android/java/res/layout/download_manager_prefetch_article.xml b/chrome/browser/download/android/java/res/layout/download_manager_prefetch_article.xml
index f815ac63..b7e509e 100644
--- a/chrome/browser/download/android/java/res/layout/download_manager_prefetch_article.xml
+++ b/chrome/browser/download/android/java/res/layout/download_manager_prefetch_article.xml
@@ -15,7 +15,7 @@
     app:columnCount="4"
     app:rowCount="4">
 
-    <org.chromium.chrome.browser.download.home.list.view.AsyncImageView
+    <org.chromium.components.browser_ui.widget.async_image.AsyncImageView
         android:id="@+id/thumbnail"
         android:layout_width="113dp"
         android:layout_height="112dp"
diff --git a/chrome/browser/download/android/java/res/layout/download_manager_prefetch_grouped_item.xml b/chrome/browser/download/android/java/res/layout/download_manager_prefetch_grouped_item.xml
index 9a0351f..46c1dd0 100644
--- a/chrome/browser/download/android/java/res/layout/download_manager_prefetch_grouped_item.xml
+++ b/chrome/browser/download/android/java/res/layout/download_manager_prefetch_grouped_item.xml
@@ -14,7 +14,7 @@
     android:background="@drawable/group_card_item_border"
     android:paddingStart="@dimen/card_padding">
 
-    <org.chromium.chrome.browser.download.home.list.view.AsyncImageView
+    <org.chromium.components.browser_ui.widget.async_image.AsyncImageView
         android:id="@+id/thumbnail"
         android:layout_width="80dp"
         android:layout_height="80dp"
diff --git a/chrome/browser/download/android/java/res/layout/download_manager_video_item.xml b/chrome/browser/download/android/java/res/layout/download_manager_video_item.xml
index ffad416..3757165 100644
--- a/chrome/browser/download/android/java/res/layout/download_manager_video_item.xml
+++ b/chrome/browser/download/android/java/res/layout/download_manager_video_item.xml
@@ -15,7 +15,7 @@
     app:columnCount="1"
     app:rowCount="2">
 
-    <org.chromium.chrome.browser.download.home.list.view.AsyncImageView
+    <org.chromium.components.browser_ui.widget.async_image.AsyncImageView
         android:id="@+id/thumbnail"
         android:layout_width="match_parent"
         android:layout_height="200dp"
diff --git a/chrome/browser/download/android/java/res/values-v17/attrs.xml b/chrome/browser/download/android/java/res/values-v17/attrs.xml
index 4b5e921..f8b0349f 100644
--- a/chrome/browser/download/android/java/res/values-v17/attrs.xml
+++ b/chrome/browser/download/android/java/res/values-v17/attrs.xml
@@ -11,13 +11,6 @@
         <attr name="pauseSrc" format="reference" />
         <attr name="retrySrc" format="reference" />
     </declare-styleable>
-    <declare-styleable name="AsyncImageView">
-        <attr name="unavailableSrc" format="reference" />
-        <attr name="waitingSrc" format="reference" />
-    </declare-styleable>
-    <declare-styleable name="ForegroundRoundedCornerImageView">
-        <attr name="foregroundCompat" format="reference" />
-    </declare-styleable>
     <declare-styleable name="AspectRatioFrameLayout_Layout">
         <attr name="layout_aspectRatio" format="fraction" />
     </declare-styleable>
diff --git a/chrome/browser/download/android/java/res/values-v17/styles.xml b/chrome/browser/download/android/java/res/values-v17/styles.xml
index bd0ee25..40de5e36 100644
--- a/chrome/browser/download/android/java/res/values-v17/styles.xml
+++ b/chrome/browser/download/android/java/res/values-v17/styles.xml
@@ -71,10 +71,6 @@
         <item name="retrySrc">@drawable/ic_refresh_white_36dp</item>
         <item name="pauseSrc">@drawable/ic_pause_white_36dp</item>
     </style>
-    <style name="AsyncImageView">
-        <item name="unavailableSrc">@drawable/async_image_view_unavailable</item>
-        <item name="waitingSrc">@drawable/async_image_view_waiting</item>
-    </style>
     <style name="LargeMediaPlayButton">
         <item name="android:layout_width">60dp</item>
         <item name="android:layout_height">60dp</item>
diff --git a/components/browser_ui/widget/android/BUILD.gn b/components/browser_ui/widget/android/BUILD.gn
index 9436060..f1e5c45 100644
--- a/components/browser_ui/widget/android/BUILD.gn
+++ b/components/browser_ui/widget/android/BUILD.gn
@@ -40,6 +40,10 @@
     "java/src/org/chromium/components/browser_ui/widget/animation/CancelAwareAnimatorListener.java",
     "java/src/org/chromium/components/browser_ui/widget/animation/FocusAnimator.java",
     "java/src/org/chromium/components/browser_ui/widget/animation/Interpolators.java",
+    "java/src/org/chromium/components/browser_ui/widget/async_image/AsyncImageView.java",
+    "java/src/org/chromium/components/browser_ui/widget/async_image/AutoAnimatorDrawable.java",
+    "java/src/org/chromium/components/browser_ui/widget/async_image/ForegroundDrawableCompat.java",
+    "java/src/org/chromium/components/browser_ui/widget/async_image/ForegroundRoundedCornerImageView.java",
     "java/src/org/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserver.java",
     "java/src/org/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserverAdapter.java",
     "java/src/org/chromium/components/browser_ui/widget/displaystyle/HorizontalDisplayStyle.java",
@@ -158,6 +162,8 @@
     "java/res/drawable-xxxhdpi/ic_check_googblue_24dp.png",
     "java/res/drawable-xxxhdpi/ic_more_vert_24dp_on_dark_bg.png",
     "java/res/drawable-xxxhdpi/ic_more_vert_24dp_on_light_bg.png",
+    "java/res/drawable/async_image_view_unavailable.xml",
+    "java/res/drawable/async_image_view_waiting.xml",
     "java/res/drawable/hairline_border_card_background.xml",
     "java/res/drawable/hairline_border_card_dark_transparent_bg.xml",
     "java/res/drawable/ic_check_googblue_24dp_animated.xml",
diff --git a/chrome/browser/download/android/java/res/drawable/async_image_view_unavailable.xml b/components/browser_ui/widget/android/java/res/drawable/async_image_view_unavailable.xml
similarity index 100%
rename from chrome/browser/download/android/java/res/drawable/async_image_view_unavailable.xml
rename to components/browser_ui/widget/android/java/res/drawable/async_image_view_unavailable.xml
diff --git a/chrome/browser/download/android/java/res/drawable/async_image_view_waiting.xml b/components/browser_ui/widget/android/java/res/drawable/async_image_view_waiting.xml
similarity index 100%
rename from chrome/browser/download/android/java/res/drawable/async_image_view_waiting.xml
rename to components/browser_ui/widget/android/java/res/drawable/async_image_view_waiting.xml
diff --git a/components/browser_ui/widget/android/java/res/values/attrs.xml b/components/browser_ui/widget/android/java/res/values/attrs.xml
index 2b99cc7e..88126ce 100644
--- a/components/browser_ui/widget/android/java/res/values/attrs.xml
+++ b/components/browser_ui/widget/android/java/res/values/attrs.xml
@@ -30,6 +30,15 @@
         <attr name="menuBackground" format="reference" />
     </declare-styleable>
 
+    <declare-styleable name="AsyncImageView">
+        <attr name="unavailableSrc" format="reference" />
+        <attr name="waitingSrc" format="reference" />
+    </declare-styleable>
+
+    <declare-styleable name="ForegroundRoundedCornerImageView">
+        <attr name="foregroundCompat" format="reference" />
+    </declare-styleable>
+
     <declare-styleable name="MaterialProgressBar">
         <attr name="colorBackground" format="reference|color" />
         <attr name="colorProgress" format="reference|color" />
diff --git a/components/browser_ui/widget/android/java/res/values/styles.xml b/components/browser_ui/widget/android/java/res/values/styles.xml
index d47401d3..1e6d292 100644
--- a/components/browser_ui/widget/android/java/res/values/styles.xml
+++ b/components/browser_ui/widget/android/java/res/values/styles.xml
@@ -84,6 +84,11 @@
         <item name="android:windowExitAnimation">@anim/textbubble_out</item>
     </style>
 
+    <style name="AsyncImageView">
+        <item name="unavailableSrc">@drawable/async_image_view_unavailable</item>
+        <item name="waitingSrc">@drawable/async_image_view_waiting</item>
+    </style>
+
     <style name="ChipAnimation">
         <item name="android:windowEnterAnimation">@anim/chip_in</item>
         <item name="android:windowExitAnimation">@anim/chip_out</item>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AsyncImageView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/AsyncImageView.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AsyncImageView.java
rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/AsyncImageView.java
index aef0737..88df1865 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AsyncImageView.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/AsyncImageView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.download.home.list.view;
+package org.chromium.components.browser_ui.widget.async_image;
 
 import android.content.Context;
 import android.content.res.TypedArray;
@@ -12,7 +12,8 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.base.Callback;
-import org.chromium.chrome.browser.download.R;
+import org.chromium.components.browser_ui.widget.R;
+import org.chromium.ui.UiUtils;
 
 /**
  * Helper class to handle asynchronously loading an image and displaying it when ready.  This class
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AutoAnimatorDrawable.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/AutoAnimatorDrawable.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AutoAnimatorDrawable.java
rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/AutoAnimatorDrawable.java
index 562eeab..4abada25 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AutoAnimatorDrawable.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/AutoAnimatorDrawable.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.download.home.list.view;
+package org.chromium.components.browser_ui.widget.async_image;
 
 import android.annotation.TargetApi;
 import android.graphics.drawable.Animatable;
@@ -13,14 +13,13 @@
 import android.graphics.drawable.RotateDrawable;
 import android.graphics.drawable.ScaleDrawable;
 import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
 
 import androidx.annotation.Nullable;
 import androidx.appcompat.graphics.drawable.DrawableWrapper;
 import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
 
-import org.chromium.base.task.PostTask;
-import org.chromium.content_public.browser.UiThreadTaskTraits;
-
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -151,11 +150,13 @@
     }
 
     private static final class AutoRestarterCompat extends Animatable2Compat.AnimationCallback {
+        private final Handler mHandler = new Handler(Looper.getMainLooper());
+
         // Animatable2Compat.AnimationCallback implementation.
         @Override
         public void onAnimationEnd(Drawable drawable) {
             if (!(drawable instanceof Animatable)) return;
-            PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> {
+            mHandler.post(() -> {
                 if (drawable.isVisible()) ((Animatable) drawable).start();
             });
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/ForegroundDrawableCompat.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/ForegroundDrawableCompat.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/ForegroundDrawableCompat.java
rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/ForegroundDrawableCompat.java
index e40315f..2b2b1b65 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/ForegroundDrawableCompat.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/ForegroundDrawableCompat.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.download.home.list.view;
+package org.chromium.components.browser_ui.widget.async_image;
 
 import android.graphics.Canvas;
 import android.graphics.Matrix;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/ForegroundRoundedCornerImageView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/ForegroundRoundedCornerImageView.java
similarity index 92%
rename from chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/ForegroundRoundedCornerImageView.java
rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/ForegroundRoundedCornerImageView.java
index 02d1b5f..78282cb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/ForegroundRoundedCornerImageView.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/async_image/ForegroundRoundedCornerImageView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.download.home.list.view;
+package org.chromium.components.browser_ui.widget.async_image;
 
 import android.content.Context;
 import android.content.res.TypedArray;
@@ -12,8 +12,9 @@
 import android.view.View;
 import android.widget.ImageView;
 
-import org.chromium.chrome.browser.download.R;
+import org.chromium.components.browser_ui.widget.R;
 import org.chromium.components.browser_ui.widget.RoundedCornerImageView;
+import org.chromium.ui.UiUtils;
 
 /** Helper class that adds foreground drawable support to {@code RoundedCornerImageView}. */
 public class ForegroundRoundedCornerImageView extends RoundedCornerImageView {
@@ -38,7 +39,7 @@
         TypedArray types = attrs == null
                 ? null
                 : context.obtainStyledAttributes(
-                          attrs, R.styleable.ForegroundRoundedCornerImageView, 0, 0);
+                        attrs, R.styleable.ForegroundRoundedCornerImageView, 0, 0);
 
         mForegroundHelper.setDrawable(AutoAnimatorDrawable.wrap(UiUtils.getDrawable(
                 context, types, R.styleable.ForegroundRoundedCornerImageView_foregroundCompat)));
diff --git a/ui/android/java/src/org/chromium/ui/UiUtils.java b/ui/android/java/src/org/chromium/ui/UiUtils.java
index a661f43..ad07528 100644
--- a/ui/android/java/src/org/chromium/ui/UiUtils.java
+++ b/ui/android/java/src/org/chromium/ui/UiUtils.java
@@ -6,6 +6,7 @@
 
 import android.content.Context;
 import android.content.res.Configuration;
+import android.content.res.TypedArray;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Typeface;
@@ -27,6 +28,8 @@
 import androidx.annotation.ColorRes;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StyleableRes;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -347,6 +350,24 @@
     }
 
     /**
+     * Loads a {@link Drawable} from an attribute.  Uses {@link AppCompatResources} to support all
+     * modern {@link Drawable} types.
+     * @param context The associated context.
+     * @param attrs The attributes from which to load the drawable resource.
+     * @param attrId The attribute id that holds the drawable resource.
+     * @return A new {@link Drawable} or {@code null} if the attribute wasn't set.
+     */
+    public static @Nullable Drawable getDrawable(
+            Context context, @Nullable TypedArray attrs, @StyleableRes int attrId) {
+        if (attrs == null) return null;
+
+        @DrawableRes
+        int resId = attrs.getResourceId(attrId, -1);
+        if (resId == -1) return null;
+        return AppCompatResources.getDrawable(context, resId);
+    }
+
+    /**
      * Gets a drawable from the resources and applies the specified tint to it. Uses Support Library
      * for vector drawables and tinting on older Android versions.
      * @param drawableId The resource id for the drawable.