From 8d2a8f05c7429ef22942643e96fc6db489679277 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Mon, 8 Aug 2016 13:21:47 -0700 Subject: [PATCH] Update shortcut sample Use favicon as a shortcut icon, if available. Change-Id: Ic2393e2de6ce9eb39b5d25d0dafd9686416cdfe7 --- samples/ShortcutSample/AndroidManifest.xml | 2 ++ .../example/android/shortcutsample/Main.java | 19 +++++++++-- .../shortcutsample/ShortcutHelper.java | 34 +++++++++++++++++-- .../example/android/shortcutsample/Utils.java | 13 +++---- 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/samples/ShortcutSample/AndroidManifest.xml b/samples/ShortcutSample/AndroidManifest.xml index 88b05447b..4fb99b827 100644 --- a/samples/ShortcutSample/AndroidManifest.xml +++ b/samples/ShortcutSample/AndroidManifest.xml @@ -19,6 +19,8 @@ + + { final String url = editUri.getText().toString().trim(); if (url.length() > 0) { - mHelper.addWebSiteShortcut(url); - refreshList(); + addUriAsync(url); } }) .show(); } + private void addUriAsync(String uri) { + new AsyncTask() { + @Override + protected Void doInBackground(Void... params) { + mHelper.addWebSiteShortcut(uri); + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + refreshList(); + } + }.execute(); + } + private void refreshList() { mAdapter.setShortcuts(mHelper.getShortcuts()); } diff --git a/samples/ShortcutSample/src/com/example/android/shortcutsample/ShortcutHelper.java b/samples/ShortcutSample/src/com/example/android/shortcutsample/ShortcutHelper.java index 61c4f29be..6649f9dfc 100644 --- a/samples/ShortcutSample/src/com/example/android/shortcutsample/ShortcutHelper.java +++ b/samples/ShortcutSample/src/com/example/android/shortcutsample/ShortcutHelper.java @@ -19,12 +19,19 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.AsyncTask; import android.os.PersistableBundle; import android.util.Log; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -169,8 +176,12 @@ public class ShortcutHelper { b.setShortLabel(uri.getHost()); b.setLongLabel(uri.toString()); - // TODO Fetch the favicon from the URI and sets to the icon. - b.setIcon(Icon.createWithResource(mContext, R.drawable.link)); + Bitmap bmp = fetchFavicon(uri); + if (bmp != null) { + b.setIcon(Icon.createWithBitmap(bmp)); + } else { + b.setIcon(Icon.createWithResource(mContext, R.drawable.link)); + } return b; } @@ -209,4 +220,23 @@ public class ShortcutHelper { public void enableShortcut(ShortcutInfo shortcut) { mShortcutManager.enableShortcuts(Arrays.asList(shortcut.getId())); } + + private Bitmap fetchFavicon(Uri uri) { + final Uri iconUri = uri.buildUpon().path("favicon.ico").build(); + Log.i(TAG, "Fetching favicon from: " + iconUri); + + InputStream is = null; + BufferedInputStream bis = null; + try + { + URLConnection conn = new URL(iconUri.toString()).openConnection(); + conn.connect(); + is = conn.getInputStream(); + bis = new BufferedInputStream(is, 8192); + return BitmapFactory.decodeStream(bis); + } catch (IOException e) { + Log.w(TAG, "Failed to fetch favicon from " + iconUri, e); + return null; + } + } } diff --git a/samples/ShortcutSample/src/com/example/android/shortcutsample/Utils.java b/samples/ShortcutSample/src/com/example/android/shortcutsample/Utils.java index 523f4dcf8..7f03b57d9 100644 --- a/samples/ShortcutSample/src/com/example/android/shortcutsample/Utils.java +++ b/samples/ShortcutSample/src/com/example/android/shortcutsample/Utils.java @@ -16,20 +16,17 @@ package com.example.android.shortcutsample; import android.content.Context; -import android.content.pm.ShortcutInfo; -import android.os.AsyncTask; -import android.os.PersistableBundle; -import android.util.Log; +import android.os.Handler; +import android.os.Looper; import android.widget.Toast; -import java.util.ArrayList; -import java.util.List; - public class Utils { private Utils() { } public static void showToast(Context context, String message) { - Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + new Handler(Looper.getMainLooper()).post(() -> { + Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + }); } }