Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2727)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/ThumbnailFetchingTask.java

Issue 1871343006: [NTP Snippets] 📷 Add placeholders and start caching thumbnails (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move the async task out as it needs to be stopped from the view, not the snippet Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/ThumbnailFetchingTask.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/ThumbnailFetchingTask.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/ThumbnailFetchingTask.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf310d15499b6c09117ce12e9c335e603cbbc36a
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/ThumbnailFetchingTask.java
@@ -0,0 +1,99 @@
+// Copyright 2016 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.ntp.snippets;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.TransitionDrawable;
+import android.media.ThumbnailUtils;
+import android.os.AsyncTask;
+import android.widget.ImageView;
+
+import org.chromium.base.Log;
+import org.chromium.base.StreamUtil;
+import org.chromium.chrome.R;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * Async task to download the thumbnail from a URL and set it on a provided view.
+ *
+ * TODO(maybelle): This task to retrieve the thumbnail from the web is temporary while
+ * we are prototyping this feature for clank. For the real production feature, we
Theresa 2016/04/11 23:42:27 Avoid code names in public CLs.
dgn 2016/04/12 11:17:15 Done.
+ * will likely have to download/decode/store the thumbnail on the native side.
+ * See https://crbug.com/594122
+ */
+class ThumbnailFetchingTask extends AsyncTask<Void, Void, Bitmap> {
+ private static final String TAG = "NtpSnippets";
+ private static final int FADE_IN_ANIMATION_TIME_MS = 300;
+
+ private final SnippetArticle mSnippetArticle;
+ private final ImageView mThumbnailView;
+
+ /**
+ * @param snippetArticle the article for which we want to download the thumbnail
Theresa 2016/04/11 23:42:27 Nit: use proper sentence capitalization/punctuatio
dgn 2016/04/12 11:17:15 Done.
+ * @param thumbnailView the view where the downloaded thumbnail will be set.
+ */
+ ThumbnailFetchingTask(SnippetArticle snippetArticle, ImageView thumbnailView) {
+ mSnippetArticle = snippetArticle;
+ mThumbnailView = thumbnailView;
+
+ if (snippetArticle.getThumbnailBitmap() == null) {
+ mThumbnailView.setImageResource(R.drawable.ic_snippet_thumbnail_placeholder);
Theresa 2016/04/11 23:42:27 Vector drawables are an L+ feature. Did you test t
dgn 2016/04/12 11:17:14 Yes I looked into that, apparently there is nothin
+ } else {
Bernhard Bauer 2016/04/12 08:34:34 Instead of doing this in the constructor (and the
dgn 2016/04/12 11:17:14 Done.
+ mThumbnailView.setImageBitmap(this.mSnippetArticle.getThumbnailBitmap());
Bernhard Bauer 2016/04/12 08:34:34 The |this| isn't necessary anymore now that this i
dgn 2016/04/12 11:17:15 Done.
+ Log.d(TAG, "Thumbnail already fetched, skipping download.");
+ cancel(true);
+ }
+ }
+
+ @Override
+ protected Bitmap doInBackground(Void... params) {
+ assert this.mSnippetArticle.getThumbnailBitmap() == null;
+
+ if (this.mSnippetArticle.mThumbnailUrl.isEmpty()) {
+ Log.e(TAG, "Could not get image thumbnail due to empty URL");
+ return null;
+ }
+
+ InputStream is = null;
+ try {
+ is = (InputStream) new URL(this.mSnippetArticle.mThumbnailUrl).getContent();
Theresa 2016/04/11 23:42:27 Can you use openStream() instead to avoid the cast
dgn 2016/04/12 11:17:14 Done.
+ Bitmap downloadedBitmap = BitmapFactory.decodeStream(is);
+ Resources res = mThumbnailView.getResources();
+ int targetSize = (int) res.getDimension(R.dimen.snippets_thumbnail_size);
Theresa 2016/04/11 23:42:27 Use res.getDimensionPixelSize() - this will conver
dgn 2016/04/12 11:17:14 Thanks! Done.
+ return ThumbnailUtils.extractThumbnail(downloadedBitmap, targetSize, targetSize,
+ ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
+ } catch (MalformedURLException e) {
+ Log.e(TAG, "Could not get image thumbnail due to malformed URL", e);
+ } catch (IOException e) {
+ Log.e(TAG, "Could not get image thumbnail", e);
+ } finally {
+ StreamUtil.closeQuietly(is);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Bitmap thumbnail) {
+ if (thumbnail == null) return; // Nothing to do, we keep the placeholder.
+
+ // Store the bitmap to skip the download task next time we display this snippet.
+ this.mSnippetArticle.setThumbnailBitmap(thumbnail);
Bernhard Bauer 2016/04/12 08:34:34 Hm... Ideally I think I'd like this to be a bit mo
dgn 2016/04/12 11:17:14 Done. After that there was pretty much nothing but
+
+ // Cross-fade between the placeholder and the thumbnail
Theresa 2016/04/11 23:42:27 nit: add a period to the end of this sentence.
dgn 2016/04/12 11:17:15 Done.
+ Drawable[] layers = {mThumbnailView.getDrawable(),
+ new BitmapDrawable(mThumbnailView.getResources(), thumbnail)};
+ TransitionDrawable transitionDrawable = new TransitionDrawable(layers);
+ mThumbnailView.setImageDrawable(transitionDrawable);
+ transitionDrawable.startTransition(FADE_IN_ANIMATION_TIME_MS);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698