Commit 6cc01a5b authored by Shakti Sahu's avatar Shakti Sahu Committed by Commit Bot

Download Home : Loading/downloading animation for images

Bug: 868555
Change-Id: I5e96263d5d3cea491a65b9b94b69ad89fdf5eb5a
Reviewed-on: https://chromium-review.googlesource.com/1164575
Commit-Queue: Shakti Sahu <shaktisahu@chromium.org>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#582049}
parent 0d8c5c5b
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid <solid
android:color="@color/contextual_suggestions_thumbnail_bg_color" /> android:color="@color/placeholder_thumbnail_bg_color" />
<corners <corners
android:radius="@dimen/snippets_thumbnail_small_corner_radius" /> android:radius="@dimen/snippets_thumbnail_small_corner_radius" />
</shape> </shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:aapt="http://schemas.android.com/aapt"
tools:targetApi="21">
<aapt:attr name="android:drawable">
<vector
android:width="100dp"
android:height="100dp"
android:viewportWidth="100.0"
android:viewportHeight="100.0">
<path
android:name="circle"
android:fillColor="@color/download_image_loading_color"
android:pathData="M 20,60 c 0,-11 9,-20 20,-20 l0, 20 l20,0 c 0,11 -9,20 -20,20 c -11,0 -20,-9 -20,-20"/>
<path
android:name="square"
android:fillColor="@color/download_image_loading_color"
android:pathData="M 40,40 l0,-15 l35,0 l0,35 l-15,0 c 0,-11 -9,-20 -20,-20 C"/>
<path
android:name="arc"
android:fillColor="@color/download_image_loading_color"
android:pathData="M 40,60 l 0,-20 c 11,0 20,9 20,20"/>
</vector>
</aapt:attr>
<target android:name="circle">
<aapt:attr name="android:animation">
<set android:ordering="sequentially">
<objectAnimator
android:startOffset="0"
android:duration="450"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha"
android:valueFrom="1"
android:valueTo="0.5"
android:valueType="floatType"/>
<objectAnimator
android:startOffset="0"
android:duration="833"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha"
android:valueFrom="0.5"
android:valueTo="1"
android:valueType="floatType"/>
</set>
</aapt:attr>
</target>
<target android:name="square">
<aapt:attr name="android:animation">
<set android:ordering="sequentially">
<objectAnimator
android:startOffset="83"
android:duration="767"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha"
android:valueFrom="1"
android:valueTo="0.5"
android:valueType="floatType"/>
<objectAnimator
android:duration="517"
android:startOffset="0"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha"
android:valueFrom="0.5"
android:valueTo="1"
android:valueType="floatType"/>
</set>
</aapt:attr>
</target>
<target android:name="arc">
<aapt:attr name="android:animation">
<set android:ordering="sequentially">
<objectAnimator
android:startOffset="150"
android:duration="417"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha"
android:valueFrom="0"
android:valueTo="0.3"
android:valueType="floatType"/>
<objectAnimator
android:startOffset="0"
android:duration="933"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha"
android:valueFrom="0.3"
android:valueTo="0"
android:valueType="floatType"/>
</set>
</aapt:attr>
</target>
</animated-vector>
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
android:id="@+id/thumbnail" android:id="@+id/thumbnail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/placeholder_thumbnail_bg_color"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:layout_gravity="center" android:layout_gravity="center"
android:adjustViewBounds="true" android:adjustViewBounds="true"
......
...@@ -186,6 +186,9 @@ ...@@ -186,6 +186,9 @@
<!-- Bookmark UI colors --> <!-- Bookmark UI colors -->
<color name="bookmark_detail_section">#7C7B79</color> <color name="bookmark_detail_section">#7C7B79</color>
<!-- Download home colors -->
<color name="download_image_loading_color">#BDC1C6</color>
<!-- Favicon colors --> <!-- Favicon colors -->
<color name="default_favicon_background_color">#787878</color> <color name="default_favicon_background_color">#787878</color>
...@@ -214,7 +217,7 @@ ...@@ -214,7 +217,7 @@
<color name="bottom_system_nav_color">@android:color/white</color> <color name="bottom_system_nav_color">@android:color/white</color>
<color name="bottom_system_nav_divider_color">@color/black_alpha_12</color> <color name="bottom_system_nav_divider_color">@color/black_alpha_12</color>
<color name="search_box_hint">@color/black_alpha_54</color> <color name="search_box_hint">@color/black_alpha_54</color>
<color name="contextual_suggestions_thumbnail_bg_color">#DADCE0</color> <color name="placeholder_thumbnail_bg_color">#DADCE0</color>
<color name="clear_browsing_data_selected_tab_color">@color/modern_blue_600</color> <color name="clear_browsing_data_selected_tab_color">@color/modern_blue_600</color>
</resources> </resources>
...@@ -11,12 +11,14 @@ import android.widget.ImageView; ...@@ -11,12 +11,14 @@ import android.widget.ImageView;
import org.chromium.chrome.R; import org.chromium.chrome.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.view.LoadingBackground;
import org.chromium.chrome.browser.modelutil.PropertyModel; import org.chromium.chrome.browser.modelutil.PropertyModel;
import org.chromium.components.offline_items_collection.OfflineItemVisuals; import org.chromium.components.offline_items_collection.OfflineItemVisuals;
/** A {@link RecyclerView.ViewHolder} specifically meant to display an image {@code OfflineItem}. */ /** A {@link RecyclerView.ViewHolder} specifically meant to display an image {@code OfflineItem}. */
public class ImageViewHolder extends ThumbnailAwareViewHolder { public class ImageViewHolder extends ThumbnailAwareViewHolder {
private final int mImageHeightPx; private final int mImageHeightPx;
private LoadingBackground mLoadingBackground;
public static ImageViewHolder create(ViewGroup parent) { public static ImageViewHolder create(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext()) View view = LayoutInflater.from(parent.getContext())
...@@ -29,6 +31,7 @@ public class ImageViewHolder extends ThumbnailAwareViewHolder { ...@@ -29,6 +31,7 @@ public class ImageViewHolder extends ThumbnailAwareViewHolder {
public ImageViewHolder(View view, int thumbnailSizePx) { public ImageViewHolder(View view, int thumbnailSizePx) {
super(view, thumbnailSizePx, thumbnailSizePx); super(view, thumbnailSizePx, thumbnailSizePx);
mImageHeightPx = thumbnailSizePx; mImageHeightPx = thumbnailSizePx;
mLoadingBackground = new LoadingBackground(view.getContext());
} }
// ThumbnailAwareViewHolder implementation. // ThumbnailAwareViewHolder implementation.
...@@ -47,4 +50,14 @@ public class ImageViewHolder extends ThumbnailAwareViewHolder { ...@@ -47,4 +50,14 @@ public class ImageViewHolder extends ThumbnailAwareViewHolder {
void onVisualsChanged(ImageView view, OfflineItemVisuals visuals) { void onVisualsChanged(ImageView view, OfflineItemVisuals visuals) {
view.setImageBitmap(visuals == null ? null : visuals.icon); view.setImageBitmap(visuals == null ? null : visuals.icon);
} }
@Override
protected void showLoadingView(ImageView view) {
mLoadingBackground.show(view);
}
@Override
protected void hideLoadingView() {
mLoadingBackground.hide();
}
} }
...@@ -103,6 +103,9 @@ abstract class ThumbnailAwareViewHolder extends MoreButtonViewHolder implements ...@@ -103,6 +103,9 @@ abstract class ThumbnailAwareViewHolder extends MoreButtonViewHolder implements
// Clear any associated bitmap from the thumbnail. // Clear any associated bitmap from the thumbnail.
if (mId != null) onVisualsChanged(mThumbnail, null); if (mId != null) onVisualsChanged(mThumbnail, null);
// Show the loading animation if we are in loading state.
showLoadingView(mThumbnail);
// Clear out any outstanding thumbnail request. // Clear out any outstanding thumbnail request.
if (mCancellable != null) mCancellable.run(); if (mCancellable != null) mCancellable.run();
...@@ -133,10 +136,22 @@ abstract class ThumbnailAwareViewHolder extends MoreButtonViewHolder implements ...@@ -133,10 +136,22 @@ abstract class ThumbnailAwareViewHolder extends MoreButtonViewHolder implements
mCancellable = null; mCancellable = null;
mIsRequesting = false; mIsRequesting = false;
// Hide the loading view.
hideLoadingView();
// Notify of the new visuals (if any). // Notify of the new visuals (if any).
onVisualsChanged(mThumbnail, visuals); onVisualsChanged(mThumbnail, visuals);
} }
/**
* Show UI to indicate that thumbnail loading in progress.
* @param view The view that should show the loading image.
*/
protected void showLoadingView(ImageView view) {}
/** Hide the loading view. */
protected void hideLoadingView() {}
/** /**
* Called when the contents of the thumbnail should be changed to due an event (either this * Called when the contents of the thumbnail should be changed to due an event (either this
* {@link RecyclerView.ViewHolder} being rebound to another {@link ListItem} or a thumbnail * {@link RecyclerView.ViewHolder} being rebound to another {@link ListItem} or a thumbnail
......
// 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.view;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.graphics.drawable.Animatable2Compat;
import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
import android.widget.ImageView;
import org.chromium.chrome.R;
/**
* A helper class to display the loading image and animation for image and video items. This class
* can also be extended and/or modified to include download progress.
*/
public class LoadingBackground {
private AnimatedVectorDrawableCompat mLoadingDrawable;
public LoadingBackground(Context context) {
mLoadingDrawable =
AnimatedVectorDrawableCompat.create(context, R.drawable.image_loading_progress);
Animatable2Compat.AnimationCallback animationCallback =
new Animatable2Compat.AnimationCallback() {
@Override
public void onAnimationEnd(Drawable drawable) {
mLoadingDrawable.start();
}
};
mLoadingDrawable.registerAnimationCallback(animationCallback);
}
/** Show loading animation for the given {@link view}. */
public void show(ImageView view) {
view.setImageDrawable(mLoadingDrawable);
mLoadingDrawable.start();
}
/** Hide the loading animation. */
public void hide() {
mLoadingDrawable.clearAnimationCallbacks();
}
}
...@@ -511,6 +511,7 @@ chrome_java_sources = [ ...@@ -511,6 +511,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/download/home/storage/StorageCoordinator.java", "java/src/org/chromium/chrome/browser/download/home/storage/StorageCoordinator.java",
"java/src/org/chromium/chrome/browser/download/home/storage/StorageSummaryProvider.java", "java/src/org/chromium/chrome/browser/download/home/storage/StorageSummaryProvider.java",
"java/src/org/chromium/chrome/browser/download/home/toolbar/DownloadHomeToolbar.java", "java/src/org/chromium/chrome/browser/download/home/toolbar/DownloadHomeToolbar.java",
"java/src/org/chromium/chrome/browser/download/home/view/LoadingBackground.java",
"java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java", "java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java",
"java/src/org/chromium/chrome/browser/download/items/DownloadBlockedOfflineContentProvider.java", "java/src/org/chromium/chrome/browser/download/items/DownloadBlockedOfflineContentProvider.java",
"java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorFactory.java", "java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorFactory.java",
......
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