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 = [
"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",
......
......@@ -9,9 +9,11 @@ import android.view.View;
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,8 +37,7 @@ public class InProgressImageViewHolder extends InProgressViewHolder {
super(view, true /* constrainCaption */);
mPlaceholder = view.findViewById(R.id.placeholder);
mPlaceholder.setImageDrawable(AutoAnimatorDrawable.wrap(
org.chromium.chrome.browser.download.home.list.view.UiUtils.getDrawable(
mPlaceholder.setImageDrawable(AutoAnimatorDrawable.wrap(AppCompatResources.getDrawable(
view.getContext(), R.drawable.async_image_view_waiting)));
}
......
......@@ -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.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;
......
......@@ -17,6 +17,9 @@ import androidx.annotation.StringRes;
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;
......
// 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") {
"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",
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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>
......
......@@ -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>
......
......@@ -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/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 @@ android_resources("java_resources") {
"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",
......
......@@ -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" />
......
......@@ -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>
......
......@@ -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 android.util.AttributeSet;
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
......
......@@ -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.LayerDrawable;
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 @@ public class AutoAnimatorDrawable extends DrawableWrapper {
}
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();
});
}
......
......@@ -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;
......
......@@ -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.util.AttributeSet;
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 {
......
......@@ -6,6 +6,7 @@ package org.chromium.ui;
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 android.widget.ListAdapter;
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;
......@@ -346,6 +349,24 @@ public class UiUtils {
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
* 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