From 04efd4af8e8cfcd814377e1913e1718c3480ed53 Mon Sep 17 00:00:00 2001 From: Austin Kolander Date: Fri, 14 Jul 2017 11:23:17 -0700 Subject: Fixed thumbnail flashing bug in the inspector. Before we loaded a drawable mime type then replace with a bitmap thumbnail if the thumbnail wasn't null. Now we load the thumbnail and if it failed set the image to the files mime type. Bug: 63528325 Test: N/A Please enter the commit message for your changes. Lines starting Change-Id: I2b7f23e7e2495cc15fbc659c1022e635f74ee89d --- src/com/android/documentsui/ThumbnailLoader.java | 29 +++++++++++----------- .../android/documentsui/dirlist/IconHelper.java | 15 +++++++++-- .../android/documentsui/inspector/HeaderView.java | 21 ++++++++++++---- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/com/android/documentsui/ThumbnailLoader.java b/src/com/android/documentsui/ThumbnailLoader.java index bb1e5d5a4..bb1c6fc6d 100644 --- a/src/com/android/documentsui/ThumbnailLoader.java +++ b/src/com/android/documentsui/ThumbnailLoader.java @@ -17,11 +17,13 @@ package com.android.documentsui; import static com.android.documentsui.base.Shared.VERBOSE; +import android.annotation.Nullable; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Point; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.CancellationSignal; @@ -32,6 +34,7 @@ import android.view.View; import android.widget.ImageView; import com.android.documentsui.ProviderExecutor.Preemptable; import java.util.function.BiConsumer; +import java.util.function.Consumer; /** * Loads a Thumbnails asynchronously then animates from the mime icon to the thumbnail @@ -54,34 +57,31 @@ public final class ThumbnailLoader extends AsyncTask implemen private final ImageView mIconThumb; private final Point mThumbSize; - // A callback to apply animation to image views after the thumbnail is loaded. - private final BiConsumer mImageAnimator; private final Uri mUri; - private final ImageView mIconMime; private final long mLastModified; + private final Consumer mCallback; private final boolean mAddToCache; private final CancellationSignal mSignal; /** * @param uri - to a thumbnail. - * @param iconMime - ImageView for displaying a mime type. * @param iconThumb - ImageView to display the thumbnail. * @param thumbSize - size of the thumbnail. * @param lastModified - used for updating thumbnail caches. - * @param animator - used to animate from the mime icon to the thumbnail. * @param addToCache - flag that determines if the loader saves the thumbnail to the cache. */ - public ThumbnailLoader(Uri uri, ImageView iconMime, ImageView iconThumb, - Point thumbSize, long lastModified, BiConsumer animator, boolean addToCache) { + public ThumbnailLoader(Uri uri, ImageView iconThumb, Point thumbSize, long lastModified, + Consumer callback, boolean addToCache) { + mUri = uri; - mIconMime = iconMime; mIconThumb = iconThumb; mThumbSize = thumbSize; - mImageAnimator = animator; mLastModified = lastModified; + mCallback = callback; mAddToCache = addToCache; mSignal = new CancellationSignal(); mIconThumb.setTag(this); + if (VERBOSE) Log.v(TAG, "Starting icon loader task for " + mUri); } @@ -125,10 +125,9 @@ public final class ThumbnailLoader extends AsyncTask implemen protected void onPostExecute(Bitmap result) { if (VERBOSE) Log.v(TAG, "Loader task for " + mUri + " completed"); - if (mIconThumb.getTag() == this && result != null) { - mIconThumb.setTag(null); - mIconThumb.setImageBitmap(result); - mImageAnimator.accept(mIconMime, mIconThumb); - } + if (mIconThumb.getTag() == this) { + mIconThumb.setTag(null); + mCallback.accept(result); + } } -} +} \ No newline at end of file diff --git a/src/com/android/documentsui/dirlist/IconHelper.java b/src/com/android/documentsui/dirlist/IconHelper.java index d9eabae25..fe145588d 100644 --- a/src/com/android/documentsui/dirlist/IconHelper.java +++ b/src/com/android/documentsui/dirlist/IconHelper.java @@ -45,6 +45,7 @@ import com.android.documentsui.base.State; import com.android.documentsui.base.State.ViewMode; import java.util.function.BiConsumer; +import java.util.function.Consumer; /** * A class to assist with loading and managing the Images (i.e. thumbnails and icons) associated @@ -199,8 +200,18 @@ public class IconHelper { (cachedThumbnail == null ? ThumbnailLoader.ANIM_FADE_IN : ThumbnailLoader.ANIM_NO_OP); - final ThumbnailLoader task = new ThumbnailLoader(uri, iconMime, iconThumb, - mCurrentSize, docLastModified, animator, true); + Consumer callback = new Consumer() { + @Override + public void accept(Bitmap bitmap) { + if (result != null) { + iconThumb.setImageBitmap(bitmap); + animator.accept(iconMime, iconThumb); + } + } + }; + + final ThumbnailLoader task = new ThumbnailLoader(uri, iconThumb, + mCurrentSize, docLastModified, callback, true); ProviderExecutor.forAuthority(docAuthority).execute(task); } diff --git a/src/com/android/documentsui/inspector/HeaderView.java b/src/com/android/documentsui/inspector/HeaderView.java index c9c6b3ec3..4716d413d 100644 --- a/src/com/android/documentsui/inspector/HeaderView.java +++ b/src/com/android/documentsui/inspector/HeaderView.java @@ -17,6 +17,7 @@ package com.android.documentsui.inspector; import android.app.Activity; import android.content.Context; +import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.drawable.Drawable; import android.util.AttributeSet; @@ -93,13 +94,23 @@ public final class HeaderView extends RelativeLayout implements Consumer callback = new Consumer() { + @Override + public void accept(Bitmap bitmap) { + if (bitmap != null) { + mThumbnail.setImageBitmap(bitmap); + ThumbnailLoader.ANIM_FADE_IN.accept(mMime, mThumbnail); + } else { + Drawable mimeIcon = mContext.getContentResolver() + .getTypeDrawable(info.mimeType); + mMime.setImageDrawable(mimeIcon); + } + } + }; // load the thumbnail async. - final ThumbnailLoader task = new ThumbnailLoader(info.derivedUri, mMime, mThumbnail, - mImageDimensions, info.lastModified, ThumbnailLoader.ANIM_FADE_IN, false); + final ThumbnailLoader task = new ThumbnailLoader(info.derivedUri, mThumbnail, + mImageDimensions, info.lastModified, callback, false); task.executeOnExecutor(ProviderExecutor.forAuthority(info.derivedUri.getAuthority()), info.derivedUri); } -- cgit v1.2.3-59-g8ed1b