| Index: chrome/browser/android/shortcut_helper.cc
|
| diff --git a/chrome/browser/android/shortcut_helper.cc b/chrome/browser/android/shortcut_helper.cc
|
| index 7efff3a02ecbed13dbdc82ed3021318b38e59a08..9f6ddddc807d3143db0570740099b9540f070ef5 100644
|
| --- a/chrome/browser/android/shortcut_helper.cc
|
| +++ b/chrome/browser/android/shortcut_helper.cc
|
| @@ -19,7 +19,9 @@
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "jni/ShortcutHelper_jni.h"
|
| +#include "third_party/smhasher/src/MurmurHash2.h"
|
| #include "ui/gfx/android/java_bitmap.h"
|
| +#include "ui/gfx/codec/png_codec.h"
|
| #include "ui/gfx/color_analysis.h"
|
| #include "url/gurl.h"
|
|
|
| @@ -34,6 +36,16 @@ static int kMinimumSplashImageSize = -1;
|
|
|
| static int kDefaultRGBIconValue = 145;
|
|
|
| +// The seed to use for the murmur2 hash.
|
| +const uint32_t kMurmur2HashSeed = 0;
|
| +
|
| +// Computes a murmur2 hash of |bitmap|'s PNG encoded bytes.
|
| +uint64_t ComputeBitmapHash(const SkBitmap& bitmap) {
|
| + std::vector<unsigned char> png_bytes;
|
| + gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &png_bytes);
|
| + return MurmurHash64B(&png_bytes.front(), png_bytes.size(), kMurmur2HashSeed);
|
| +}
|
| +
|
| // Retrieves and caches the ideal and minimum sizes of the Home screen icon
|
| // and the splash screen image.
|
| void GetHomescreenIconAndSplashImageSizes() {
|
| @@ -217,6 +229,24 @@ int ShortcutHelper::GetMinimumSplashImageSizeInDp() {
|
| }
|
|
|
| // static
|
| +void ShortcutHelper::OnFetchedHomescreenImage(
|
| + const base::android::ScopedJavaGlobalRef<jobject> java_callback,
|
| + const SkBitmap& image) {
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| +
|
| + ScopedJavaLocalRef<jobject> java_bitmap;
|
| + uint64_t murmur2_hash = 0;
|
| + if (image.getSize()) {
|
| + java_bitmap = gfx::ConvertToJavaBitmap(&image);
|
| + // TODO(pkotwicz): Get hash of untransformed icon's bytes (with no
|
| + // encoding/decoding).
|
| + murmur2_hash = ComputeBitmapHash(image);
|
| + }
|
| + Java_ShortcutHelper_onFetchedHomescreenImage(
|
| + env, java_bitmap.obj(), murmur2_hash, java_callback.obj());
|
| +}
|
| +
|
| +// static
|
| void ShortcutHelper::FetchSplashScreenImage(
|
| content::WebContents* web_contents,
|
| const GURL& image_url,
|
| @@ -296,6 +326,29 @@ bool ShortcutHelper::IsWebApkInstalled(const GURL& url) {
|
| return Java_ShortcutHelper_isWebApkInstalled(env, java_url.obj());
|
| }
|
|
|
| +/**
|
| + * Called by Java to fetch the image at |java_icon_url| and scale it so that it
|
| + * can be used on the homscreen.
|
| + */
|
| +void FetchHomescreenImage(
|
| + JNIEnv* env,
|
| + const JavaParamRef<jclass>& clazz,
|
| + const JavaParamRef<jobject>& java_web_contents,
|
| + const JavaParamRef<jstring>& java_image_url,
|
| + const JavaParamRef<jobject>& java_callback) {
|
| + content::WebContents* web_contents =
|
| + content::WebContents::FromJavaWebContents(java_web_contents);
|
| + GURL image_url = GURL(ConvertJavaStringToUTF8(env, java_image_url));
|
| + base::android::ScopedJavaGlobalRef<jobject> java_global_callback(
|
| + env, java_callback);
|
| +
|
| + ManifestIconDownloader::Download(
|
| + web_contents, image_url, ShortcutHelper::GetIdealHomescreenIconSizeInDp(),
|
| + ShortcutHelper::GetMinimumHomescreenIconSizeInDp(),
|
| + base::Bind(&ShortcutHelper::OnFetchedHomescreenImage,
|
| + java_global_callback));
|
| +}
|
| +
|
| // Callback used by Java when the shortcut has been created.
|
| // |splash_image_callback| is a pointer to a base::Closure allocated in
|
| // AddShortcutInBackgroundWithSkBitmap, so reinterpret_cast it back and run it.
|
|
|