| Index: chrome/browser/android/shortcut_helper.cc
|
| diff --git a/chrome/browser/android/shortcut_helper.cc b/chrome/browser/android/shortcut_helper.cc
|
| index e52f96ec34b5178272419523e5df9895b9093365..13ae7b3dff65bc0ed30708acbd85871bd7affc59 100644
|
| --- a/chrome/browser/android/shortcut_helper.cc
|
| +++ b/chrome/browser/android/shortcut_helper.cc
|
| @@ -10,6 +10,8 @@
|
| #include "base/android/jni_android.h"
|
| #include "base/android/jni_array.h"
|
| #include "base/android/jni_string.h"
|
| +#include "base/bind.h"
|
| +#include "base/callback.h"
|
| #include "base/strings/string16.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "chrome/browser/manifest/manifest_icon_downloader.h"
|
| @@ -62,7 +64,8 @@ void GetHomescreenIconAndSplashImageSizes() {
|
| void ShortcutHelper::AddShortcutInBackgroundWithSkBitmap(
|
| const ShortcutInfo& info,
|
| const std::string& webapp_id,
|
| - const SkBitmap& icon_bitmap) {
|
| + const SkBitmap& icon_bitmap,
|
| + const base::Closure& splash_image_callback) {
|
| DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
|
|
| // Send the data to the Java side to create the shortcut.
|
| @@ -81,6 +84,19 @@ void ShortcutHelper::AddShortcutInBackgroundWithSkBitmap(
|
| if (icon_bitmap.getSize())
|
| java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap);
|
|
|
| + uintptr_t callback_pointer = 0;
|
| + bool is_webapp_capable = info.display == blink::WebDisplayModeStandalone;
|
| +
|
| + if (is_webapp_capable) {
|
| + // The callback will need to be run after shortcut creation completes in
|
| + // order to download the splash image and save it to the WebappDataStorage.
|
| + // Create a copy of the callback here and send the pointer to Java, which
|
| + // will send it back once the asynchronous shortcut creation process
|
| + // finishes.
|
| + callback_pointer =
|
| + reinterpret_cast<uintptr_t>(new base::Closure(splash_image_callback));
|
| + }
|
| +
|
| Java_ShortcutHelper_addShortcut(
|
| env,
|
| base::android::GetApplicationContext(),
|
| @@ -90,12 +106,13 @@ void ShortcutHelper::AddShortcutInBackgroundWithSkBitmap(
|
| java_name.obj(),
|
| java_short_name.obj(),
|
| java_bitmap.obj(),
|
| - info.display == blink::WebDisplayModeStandalone,
|
| + is_webapp_capable,
|
| info.orientation,
|
| info.source,
|
| info.theme_color,
|
| info.background_color,
|
| - info.is_icon_generated);
|
| + info.is_icon_generated,
|
| + callback_pointer);
|
| }
|
|
|
| int ShortcutHelper::GetIdealHomescreenIconSizeInDp() {
|
| @@ -128,20 +145,18 @@ void ShortcutHelper::FetchSplashScreenImage(
|
| const GURL& image_url,
|
| const int ideal_splash_image_size_in_dp,
|
| const int minimum_splash_image_size_in_dp,
|
| - const std::string& webapp_id,
|
| - const std::string& webapp_scope) {
|
| + const std::string& webapp_id) {
|
| // This is a fire and forget task. It is not vital for the splash screen image
|
| // to be downloaded so if the downloader returns false there is no fallback.
|
| ManifestIconDownloader::Download(
|
| web_contents, image_url, ideal_splash_image_size_in_dp,
|
| minimum_splash_image_size_in_dp,
|
| - base::Bind(&ShortcutHelper::StoreWebappData, webapp_id, webapp_scope));
|
| + base::Bind(&ShortcutHelper::StoreWebappSplashImage, webapp_id));
|
| }
|
|
|
| // static
|
| -void ShortcutHelper::StoreWebappData(
|
| +void ShortcutHelper::StoreWebappSplashImage(
|
| const std::string& webapp_id,
|
| - const std::string& webapp_url,
|
| const SkBitmap& splash_image) {
|
| if (splash_image.drawsNothing())
|
| return;
|
| @@ -149,16 +164,13 @@ void ShortcutHelper::StoreWebappData(
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| ScopedJavaLocalRef<jstring> java_webapp_id =
|
| base::android::ConvertUTF8ToJavaString(env, webapp_id);
|
| - ScopedJavaLocalRef<jstring> java_webapp_url =
|
| - base::android::ConvertUTF8ToJavaString(env, webapp_url);
|
| ScopedJavaLocalRef<jobject> java_splash_image =
|
| gfx::ConvertToJavaBitmap(&splash_image);
|
|
|
| - Java_ShortcutHelper_storeWebappData(
|
| + Java_ShortcutHelper_storeWebappSplashImage(
|
| env,
|
| base::android::GetApplicationContext(),
|
| java_webapp_id.obj(),
|
| - java_webapp_url.obj(),
|
| java_splash_image.obj());
|
| }
|
|
|
| @@ -202,6 +214,23 @@ SkBitmap ShortcutHelper::FinalizeLauncherIcon(const SkBitmap& bitmap,
|
| return gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(result.obj()));
|
| }
|
|
|
| +// 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.
|
| +//
|
| +// This callback should only ever be called when the shortcut was for a
|
| +// webapp-capable site; otherwise, |splash_image_callback| will have never been
|
| +// allocated and doesn't need to be run or deleted.
|
| +void OnWebappDataStored(JNIEnv* env,
|
| + const JavaParamRef<jclass>& clazz,
|
| + jlong jsplash_image_callback) {
|
| + DCHECK(jsplash_image_callback);
|
| + base::Closure* splash_image_callback =
|
| + reinterpret_cast<base::Closure*>(jsplash_image_callback);
|
| + splash_image_callback->Run();
|
| + delete splash_image_callback;
|
| +}
|
| +
|
| bool ShortcutHelper::RegisterShortcutHelper(JNIEnv* env) {
|
| return RegisterNativesImpl(env);
|
| }
|
|
|