Commit 5f44a56d authored by Shakti Sahu's avatar Shakti Sahu Committed by Commit Bot

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/+/2444172Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Commit-Queue: Shakti Sahu <shaktisahu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#814637}
parent db577026
...@@ -632,12 +632,7 @@ chrome_java_sources = [ ...@@ -632,12 +632,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/download/home/list/mutator/PrefetchListPaginator.java", "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/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/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/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/FileExtensions.java",
"java/src/org/chromium/chrome/browser/download/home/metrics/FilterChangeLogger.java", "java/src/org/chromium/chrome/browser/download/home/metrics/FilterChangeLogger.java",
"java/src/org/chromium/chrome/browser/download/home/metrics/OfflineItemStartupLogger.java", "java/src/org/chromium/chrome/browser/download/home/metrics/OfflineItemStartupLogger.java",
......
...@@ -9,9 +9,11 @@ import android.view.View; ...@@ -9,9 +9,11 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.appcompat.content.res.AppCompatResources;
import org.chromium.chrome.browser.download.R; import org.chromium.chrome.browser.download.R;
import org.chromium.chrome.browser.download.home.list.ListItem; 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; import org.chromium.ui.modelutil.PropertyModel;
/** /**
...@@ -35,9 +37,8 @@ public class InProgressImageViewHolder extends InProgressViewHolder { ...@@ -35,9 +37,8 @@ public class InProgressImageViewHolder extends InProgressViewHolder {
super(view, true /* constrainCaption */); super(view, true /* constrainCaption */);
mPlaceholder = view.findViewById(R.id.placeholder); mPlaceholder = view.findViewById(R.id.placeholder);
mPlaceholder.setImageDrawable(AutoAnimatorDrawable.wrap( mPlaceholder.setImageDrawable(AutoAnimatorDrawable.wrap(AppCompatResources.getDrawable(
org.chromium.chrome.browser.download.home.list.view.UiUtils.getDrawable( view.getContext(), R.drawable.async_image_view_waiting)));
view.getContext(), R.drawable.async_image_view_waiting)));
} }
// InProgressViewHolder implementation. // InProgressViewHolder implementation.
......
...@@ -19,9 +19,9 @@ import org.chromium.chrome.browser.download.home.filter.Filters; ...@@ -19,9 +19,9 @@ import org.chromium.chrome.browser.download.home.filter.Filters;
import org.chromium.chrome.browser.download.home.list.ListItem; 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.ListProperties;
import org.chromium.chrome.browser.download.home.list.UiUtils; 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.metrics.UmaUtils;
import org.chromium.chrome.browser.download.home.view.SelectionView; 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.BasicListMenu;
import org.chromium.components.browser_ui.widget.listmenu.ListMenu; import org.chromium.components.browser_ui.widget.listmenu.ListMenu;
import org.chromium.components.browser_ui.widget.listmenu.ListMenuButton; import org.chromium.components.browser_ui.widget.listmenu.ListMenuButton;
......
...@@ -17,6 +17,9 @@ import androidx.annotation.StringRes; ...@@ -17,6 +17,9 @@ import androidx.annotation.StringRes;
import org.chromium.base.MathUtils; import org.chromium.base.MathUtils;
import org.chromium.chrome.browser.download.R; 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 org.chromium.ui.widget.ChromeImageButton;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
......
// 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
...@@ -178,8 +178,6 @@ android_resources("java_resources") { ...@@ -178,8 +178,6 @@ android_resources("java_resources") {
"java/res/drawable-xxhdpi/ic_refresh_white_36dp.png", "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_24dp.png",
"java/res/drawable-xxxhdpi/ic_refresh_white_36dp.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_large.xml",
"java/res/drawable/circular_progress_bar_background_small.xml", "java/res/drawable/circular_progress_bar_background_small.xml",
"java/res/drawable/circular_progress_bar_determinate_large.xml", "java/res/drawable/circular_progress_bar_determinate_large.xml",
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
android:layout_height="114dp" android:layout_height="114dp"
android:background="@drawable/hairline_border_card_background"> 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:id="@+id/thumbnail"
android:layout_width="80dp" android:layout_width="80dp"
android:layout_height="80dp" android:layout_height="80dp"
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
app:columnCount="3" app:columnCount="3"
app:rowCount="2"> 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:id="@+id/thumbnail"
android:layout_width="36dp" android:layout_width="36dp"
android:layout_height="36dp" android:layout_height="36dp"
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
android:clickable="true" android:clickable="true"
android:background="@color/default_bg_color_secondary" > 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:id="@+id/thumbnail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:background="@color/modern_grey_300" android:background="@color/modern_grey_300"
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
app:rowCount="2"> app:rowCount="2">
<!-- Set the src attribute in Java to wrap the drawable properly. --> <!-- 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:id="@+id/thumbnail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" android:layout_height="200dp"
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
app:columnCount="4" app:columnCount="4"
app:rowCount="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:id="@+id/thumbnail"
android:layout_width="113dp" android:layout_width="113dp"
android:layout_height="112dp" android:layout_height="112dp"
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
android:background="@drawable/group_card_item_border" android:background="@drawable/group_card_item_border"
android:paddingStart="@dimen/card_padding"> 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:id="@+id/thumbnail"
android:layout_width="80dp" android:layout_width="80dp"
android:layout_height="80dp" android:layout_height="80dp"
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
app:columnCount="1" app:columnCount="1"
app:rowCount="2"> 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:id="@+id/thumbnail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" android:layout_height="200dp"
......
...@@ -11,13 +11,6 @@ ...@@ -11,13 +11,6 @@
<attr name="pauseSrc" format="reference" /> <attr name="pauseSrc" format="reference" />
<attr name="retrySrc" format="reference" /> <attr name="retrySrc" format="reference" />
</declare-styleable> </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"> <declare-styleable name="AspectRatioFrameLayout_Layout">
<attr name="layout_aspectRatio" format="fraction" /> <attr name="layout_aspectRatio" format="fraction" />
</declare-styleable> </declare-styleable>
......
...@@ -71,10 +71,6 @@ ...@@ -71,10 +71,6 @@
<item name="retrySrc">@drawable/ic_refresh_white_36dp</item> <item name="retrySrc">@drawable/ic_refresh_white_36dp</item>
<item name="pauseSrc">@drawable/ic_pause_white_36dp</item> <item name="pauseSrc">@drawable/ic_pause_white_36dp</item>
</style> </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"> <style name="LargeMediaPlayButton">
<item name="android:layout_width">60dp</item> <item name="android:layout_width">60dp</item>
<item name="android:layout_height">60dp</item> <item name="android:layout_height">60dp</item>
......
...@@ -40,6 +40,10 @@ android_library("java") { ...@@ -40,6 +40,10 @@ android_library("java") {
"java/src/org/chromium/components/browser_ui/widget/animation/CancelAwareAnimatorListener.java", "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/FocusAnimator.java",
"java/src/org/chromium/components/browser_ui/widget/animation/Interpolators.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/DisplayStyleObserver.java",
"java/src/org/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserverAdapter.java", "java/src/org/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserverAdapter.java",
"java/src/org/chromium/components/browser_ui/widget/displaystyle/HorizontalDisplayStyle.java", "java/src/org/chromium/components/browser_ui/widget/displaystyle/HorizontalDisplayStyle.java",
...@@ -158,6 +162,8 @@ android_resources("java_resources") { ...@@ -158,6 +162,8 @@ android_resources("java_resources") {
"java/res/drawable-xxxhdpi/ic_check_googblue_24dp.png", "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_dark_bg.png",
"java/res/drawable-xxxhdpi/ic_more_vert_24dp_on_light_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_background.xml",
"java/res/drawable/hairline_border_card_dark_transparent_bg.xml", "java/res/drawable/hairline_border_card_dark_transparent_bg.xml",
"java/res/drawable/ic_check_googblue_24dp_animated.xml", "java/res/drawable/ic_check_googblue_24dp_animated.xml",
......
...@@ -30,6 +30,15 @@ ...@@ -30,6 +30,15 @@
<attr name="menuBackground" format="reference" /> <attr name="menuBackground" format="reference" />
</declare-styleable> </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"> <declare-styleable name="MaterialProgressBar">
<attr name="colorBackground" format="reference|color" /> <attr name="colorBackground" format="reference|color" />
<attr name="colorProgress" format="reference|color" /> <attr name="colorProgress" format="reference|color" />
......
...@@ -84,6 +84,11 @@ ...@@ -84,6 +84,11 @@
<item name="android:windowExitAnimation">@anim/textbubble_out</item> <item name="android:windowExitAnimation">@anim/textbubble_out</item>
</style> </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"> <style name="ChipAnimation">
<item name="android:windowEnterAnimation">@anim/chip_in</item> <item name="android:windowEnterAnimation">@anim/chip_in</item>
<item name="android:windowExitAnimation">@anim/chip_out</item> <item name="android:windowExitAnimation">@anim/chip_out</item>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // 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.Context;
import android.content.res.TypedArray; import android.content.res.TypedArray;
...@@ -12,7 +12,8 @@ import android.util.AttributeSet; ...@@ -12,7 +12,8 @@ import android.util.AttributeSet;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.chromium.base.Callback; 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 * Helper class to handle asynchronously loading an image and displaying it when ready. This class
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // 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.annotation.TargetApi;
import android.graphics.drawable.Animatable; import android.graphics.drawable.Animatable;
...@@ -13,14 +13,13 @@ import android.graphics.drawable.LayerDrawable; ...@@ -13,14 +13,13 @@ import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.RotateDrawable; import android.graphics.drawable.RotateDrawable;
import android.graphics.drawable.ScaleDrawable; import android.graphics.drawable.ScaleDrawable;
import android.os.Build; import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.graphics.drawable.DrawableWrapper; import androidx.appcompat.graphics.drawable.DrawableWrapper;
import androidx.vectordrawable.graphics.drawable.Animatable2Compat; 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; import java.util.concurrent.atomic.AtomicBoolean;
/** /**
...@@ -151,11 +150,13 @@ public class AutoAnimatorDrawable extends DrawableWrapper { ...@@ -151,11 +150,13 @@ public class AutoAnimatorDrawable extends DrawableWrapper {
} }
private static final class AutoRestarterCompat extends Animatable2Compat.AnimationCallback { private static final class AutoRestarterCompat extends Animatable2Compat.AnimationCallback {
private final Handler mHandler = new Handler(Looper.getMainLooper());
// Animatable2Compat.AnimationCallback implementation. // Animatable2Compat.AnimationCallback implementation.
@Override @Override
public void onAnimationEnd(Drawable drawable) { public void onAnimationEnd(Drawable drawable) {
if (!(drawable instanceof Animatable)) return; if (!(drawable instanceof Animatable)) return;
PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> { mHandler.post(() -> {
if (drawable.isVisible()) ((Animatable) drawable).start(); if (drawable.isVisible()) ((Animatable) drawable).start();
}); });
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // 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.Canvas;
import android.graphics.Matrix; import android.graphics.Matrix;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // 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.Context;
import android.content.res.TypedArray; import android.content.res.TypedArray;
...@@ -12,8 +12,9 @@ import android.util.AttributeSet; ...@@ -12,8 +12,9 @@ import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.widget.ImageView; 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.components.browser_ui.widget.RoundedCornerImageView;
import org.chromium.ui.UiUtils;
/** Helper class that adds foreground drawable support to {@code RoundedCornerImageView}. */ /** Helper class that adds foreground drawable support to {@code RoundedCornerImageView}. */
public class ForegroundRoundedCornerImageView extends RoundedCornerImageView { public class ForegroundRoundedCornerImageView extends RoundedCornerImageView {
...@@ -38,7 +39,7 @@ public class ForegroundRoundedCornerImageView extends RoundedCornerImageView { ...@@ -38,7 +39,7 @@ public class ForegroundRoundedCornerImageView extends RoundedCornerImageView {
TypedArray types = attrs == null TypedArray types = attrs == null
? null ? null
: context.obtainStyledAttributes( : context.obtainStyledAttributes(
attrs, R.styleable.ForegroundRoundedCornerImageView, 0, 0); attrs, R.styleable.ForegroundRoundedCornerImageView, 0, 0);
mForegroundHelper.setDrawable(AutoAnimatorDrawable.wrap(UiUtils.getDrawable( mForegroundHelper.setDrawable(AutoAnimatorDrawable.wrap(UiUtils.getDrawable(
context, types, R.styleable.ForegroundRoundedCornerImageView_foregroundCompat))); context, types, R.styleable.ForegroundRoundedCornerImageView_foregroundCompat)));
......
...@@ -6,6 +6,7 @@ package org.chromium.ui; ...@@ -6,6 +6,7 @@ package org.chromium.ui;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Typeface; import android.graphics.Typeface;
...@@ -27,6 +28,8 @@ import android.widget.ListAdapter; ...@@ -27,6 +28,8 @@ import android.widget.ListAdapter;
import androidx.annotation.ColorRes; import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StyleableRes;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.content.res.AppCompatResources;
...@@ -346,6 +349,24 @@ public class UiUtils { ...@@ -346,6 +349,24 @@ public class UiUtils {
return indexInParent; return indexInParent;
} }
/**
* 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 * 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. * for vector drawables and tinting on older Android versions.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment