| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/webapk/webapk_update_manager.h" | 5 #include "chrome/browser/android/webapk/webapk_update_manager.h" |
| 6 | 6 |
| 7 #include <jni.h> | 7 #include <jni.h> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/android/callback_android.h" | 11 #include "base/android/callback_android.h" |
| 12 #include "base/android/jni_array.h" | 12 #include "base/android/jni_array.h" |
| 13 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
| 14 #include "base/android/scoped_java_ref.h" | 14 #include "base/android/scoped_java_ref.h" |
| 15 #include "base/bind.h" | 15 #include "base/bind.h" |
| 16 #include "base/files/file_path.h" |
| 16 #include "base/memory/ptr_util.h" | 17 #include "base/memory/ptr_util.h" |
| 17 #include "base/strings/string16.h" | 18 #include "base/strings/string16.h" |
| 18 #include "base/threading/thread_task_runner_handle.h" | 19 #include "base/threading/thread_task_runner_handle.h" |
| 19 #include "chrome/browser/android/shortcut_info.h" | 20 #include "chrome/browser/android/shortcut_info.h" |
| 20 #include "chrome/browser/android/webapk/webapk_install_service.h" | 21 #include "chrome/browser/android/webapk/webapk_install_service.h" |
| 21 #include "chrome/browser/android/webapk/webapk_installer.h" | 22 #include "chrome/browser/android/webapk/webapk_installer.h" |
| 22 #include "chrome/browser/profiles/profile.h" | 23 #include "chrome/browser/profiles/profile.h" |
| 23 #include "chrome/browser/profiles/profile_manager.h" | 24 #include "chrome/browser/profiles/profile_manager.h" |
| 24 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
| 25 #include "jni/WebApkUpdateManager_jni.h" | 26 #include "jni/WebApkUpdateManager_jni.h" |
| 26 #include "third_party/skia/include/core/SkBitmap.h" | 27 #include "third_party/skia/include/core/SkBitmap.h" |
| 27 #include "ui/gfx/android/java_bitmap.h" | 28 #include "ui/gfx/android/java_bitmap.h" |
| 28 #include "url/gurl.h" | 29 #include "url/gurl.h" |
| 29 | 30 |
| 30 using base::android::JavaRef; | 31 using base::android::JavaRef; |
| 31 using base::android::JavaParamRef; | 32 using base::android::JavaParamRef; |
| 32 using base::android::ScopedJavaGlobalRef; | 33 using base::android::ScopedJavaGlobalRef; |
| 33 | 34 |
| 34 namespace { | 35 namespace { |
| 35 | 36 |
| 36 // Called with the serialized proto to send to the WebAPK server. | 37 // Called after saving the update request proto either succeeds or fails. |
| 37 void OnBuiltProto(const JavaRef<jobject>& java_callback, | 38 void OnStoredUpdateRequest(const JavaRef<jobject>& java_callback, |
| 38 std::unique_ptr<std::vector<uint8_t>> proto) { | 39 bool success) { |
| 39 base::android::RunCallbackAndroid(java_callback, *proto); | 40 base::android::RunCallbackAndroid(java_callback, success); |
| 40 } | 41 } |
| 41 | 42 |
| 42 // Called after the update either succeeds or fails. | 43 // Called after the update either succeeds or fails. |
| 43 void OnUpdated(const JavaRef<jobject>& java_callback, | 44 void OnUpdated(const JavaRef<jobject>& java_callback, |
| 44 WebApkInstallResult result, | 45 WebApkInstallResult result, |
| 45 bool relax_updates, | 46 bool relax_updates, |
| 46 const std::string& webapk_package) { | 47 const std::string& webapk_package) { |
| 47 JNIEnv* env = base::android::AttachCurrentThread(); | 48 JNIEnv* env = base::android::AttachCurrentThread(); |
| 48 Java_WebApkUpdateCallback_onResultFromNative( | 49 Java_WebApkUpdateCallback_onResultFromNative( |
| 49 env, java_callback, static_cast<int>(result), relax_updates); | 50 env, java_callback, static_cast<int>(result), relax_updates); |
| 50 } | 51 } |
| 51 | 52 |
| 52 } // anonymous namespace | 53 } // anonymous namespace |
| 53 | 54 |
| 54 // static JNI method. | 55 // static JNI method. |
| 55 static void BuildUpdateWebApkProto( | 56 static void StoreWebApkUpdateRequestToDisk( |
| 56 JNIEnv* env, | 57 JNIEnv* env, |
| 57 const JavaParamRef<jclass>& clazz, | 58 const JavaParamRef<jclass>& clazz, |
| 59 const JavaParamRef<jstring>& java_file_path, |
| 58 const JavaParamRef<jstring>& java_start_url, | 60 const JavaParamRef<jstring>& java_start_url, |
| 59 const JavaParamRef<jstring>& java_scope, | 61 const JavaParamRef<jstring>& java_scope, |
| 60 const JavaParamRef<jstring>& java_name, | 62 const JavaParamRef<jstring>& java_name, |
| 61 const JavaParamRef<jstring>& java_short_name, | 63 const JavaParamRef<jstring>& java_short_name, |
| 62 const JavaParamRef<jstring>& java_primary_icon_url, | 64 const JavaParamRef<jstring>& java_primary_icon_url, |
| 63 const JavaParamRef<jobject>& java_primary_icon_bitmap, | 65 const JavaParamRef<jobject>& java_primary_icon_bitmap, |
| 64 const JavaParamRef<jstring>& java_badge_icon_url, | 66 const JavaParamRef<jstring>& java_badge_icon_url, |
| 65 const JavaParamRef<jobject>& java_badge_icon_bitmap, | 67 const JavaParamRef<jobject>& java_badge_icon_bitmap, |
| 66 const JavaParamRef<jobjectArray>& java_icon_urls, | 68 const JavaParamRef<jobjectArray>& java_icon_urls, |
| 67 const JavaParamRef<jobjectArray>& java_icon_hashes, | 69 const JavaParamRef<jobjectArray>& java_icon_hashes, |
| 68 jint java_display_mode, | 70 jint java_display_mode, |
| 69 jint java_orientation, | 71 jint java_orientation, |
| 70 jlong java_theme_color, | 72 jlong java_theme_color, |
| 71 jlong java_background_color, | 73 jlong java_background_color, |
| 72 const JavaParamRef<jstring>& java_web_manifest_url, | 74 const JavaParamRef<jstring>& java_web_manifest_url, |
| 73 const JavaParamRef<jstring>& java_webapk_package, | 75 const JavaParamRef<jstring>& java_webapk_package, |
| 74 jint java_webapk_version, | 76 jint java_webapk_version, |
| 75 jboolean java_is_manifest_stale, | 77 jboolean java_is_manifest_stale, |
| 76 const JavaParamRef<jobject>& java_callback) { | 78 const JavaParamRef<jobject>& java_callback) { |
| 77 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 79 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 78 | 80 |
| 81 std::string file_path = ConvertJavaStringToUTF8(env, java_file_path); |
| 82 |
| 79 ShortcutInfo info(GURL(ConvertJavaStringToUTF8(env, java_start_url))); | 83 ShortcutInfo info(GURL(ConvertJavaStringToUTF8(env, java_start_url))); |
| 80 info.scope = GURL(ConvertJavaStringToUTF8(env, java_scope)); | 84 info.scope = GURL(ConvertJavaStringToUTF8(env, java_scope)); |
| 81 info.name = ConvertJavaStringToUTF16(env, java_name); | 85 info.name = ConvertJavaStringToUTF16(env, java_name); |
| 82 info.short_name = ConvertJavaStringToUTF16(env, java_short_name); | 86 info.short_name = ConvertJavaStringToUTF16(env, java_short_name); |
| 83 info.user_title = info.short_name; | 87 info.user_title = info.short_name; |
| 84 info.display = static_cast<blink::WebDisplayMode>(java_display_mode); | 88 info.display = static_cast<blink::WebDisplayMode>(java_display_mode); |
| 85 info.orientation = | 89 info.orientation = |
| 86 static_cast<blink::WebScreenOrientationLockType>(java_orientation); | 90 static_cast<blink::WebScreenOrientationLockType>(java_orientation); |
| 87 info.theme_color = (int64_t)java_theme_color; | 91 info.theme_color = (int64_t)java_theme_color; |
| 88 info.background_color = (int64_t)java_background_color; | 92 info.background_color = (int64_t)java_background_color; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 111 SkBitmap badge_icon; | 115 SkBitmap badge_icon; |
| 112 if (!java_badge_icon_bitmap.is_null()) { | 116 if (!java_badge_icon_bitmap.is_null()) { |
| 113 gfx::JavaBitmap java_badge_icon_bitmap_lock(java_badge_icon_bitmap); | 117 gfx::JavaBitmap java_badge_icon_bitmap_lock(java_badge_icon_bitmap); |
| 114 gfx::CreateSkBitmapFromJavaBitmap(java_badge_icon_bitmap_lock); | 118 gfx::CreateSkBitmapFromJavaBitmap(java_badge_icon_bitmap_lock); |
| 115 badge_icon.setImmutable(); | 119 badge_icon.setImmutable(); |
| 116 } | 120 } |
| 117 | 121 |
| 118 std::string webapk_package; | 122 std::string webapk_package; |
| 119 ConvertJavaStringToUTF8(env, java_webapk_package, &webapk_package); | 123 ConvertJavaStringToUTF8(env, java_webapk_package, &webapk_package); |
| 120 | 124 |
| 121 WebApkInstaller::BuildProto( | 125 WebApkInstaller::StoreUpdateRequestToDisk( |
| 122 info, primary_icon, badge_icon, webapk_package, | 126 base::FilePath(file_path), info, primary_icon, badge_icon, webapk_package, |
| 123 std::to_string(java_webapk_version), icon_url_to_murmur2_hash, | 127 std::to_string(java_webapk_version), icon_url_to_murmur2_hash, |
| 124 java_is_manifest_stale, | 128 java_is_manifest_stale, |
| 125 base::Bind(&OnBuiltProto, ScopedJavaGlobalRef<jobject>(java_callback))); | 129 base::Bind(&OnStoredUpdateRequest, |
| 130 ScopedJavaGlobalRef<jobject>(java_callback))); |
| 126 } | 131 } |
| 127 | 132 |
| 128 // static JNI method. | 133 // static JNI method. |
| 129 static void UpdateWebApk(JNIEnv* env, | 134 static void UpdateWebApkFromStoredRequest( |
| 130 const JavaParamRef<jclass>& clazz, | 135 JNIEnv* env, |
| 131 const JavaParamRef<jstring>& java_webapk_package, | 136 const JavaParamRef<jclass>& clazz, |
| 132 const JavaParamRef<jstring>& java_start_url, | 137 const JavaParamRef<jstring>& java_request_file_path, |
| 133 const JavaParamRef<jstring>& java_short_name, | 138 const JavaParamRef<jobject>& java_callback) { |
| 134 const JavaParamRef<jbyteArray>& java_serialized_proto, | |
| 135 const JavaParamRef<jobject>& java_callback) { | |
| 136 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 139 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 137 | 140 |
| 138 ScopedJavaGlobalRef<jobject> callback_ref(java_callback); | 141 ScopedJavaGlobalRef<jobject> callback_ref(java_callback); |
| 139 | 142 |
| 140 Profile* profile = ProfileManager::GetLastUsedProfile(); | 143 Profile* profile = ProfileManager::GetLastUsedProfile(); |
| 141 if (profile == nullptr) { | 144 if (profile == nullptr) { |
| 142 base::ThreadTaskRunnerHandle::Get()->PostTask( | 145 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 143 FROM_HERE, | 146 FROM_HERE, |
| 144 base::Bind(&OnUpdated, callback_ref, WebApkInstallResult::FAILURE, | 147 base::Bind(&OnUpdated, callback_ref, WebApkInstallResult::FAILURE, |
| 145 false /* relax_updates */, "" /* webapk_package */)); | 148 false /* relax_updates */, "" /* webapk_package */)); |
| 146 return; | 149 return; |
| 147 } | 150 } |
| 148 | 151 |
| 149 std::string webapk_package = | 152 std::string request_file_path = |
| 150 ConvertJavaStringToUTF8(env, java_webapk_package); | 153 ConvertJavaStringToUTF8(env, java_request_file_path); |
| 151 GURL start_url = GURL(ConvertJavaStringToUTF8(env, java_start_url)); | |
| 152 base::string16 short_name = ConvertJavaStringToUTF16(env, java_short_name); | |
| 153 std::unique_ptr<std::vector<uint8_t>> serialized_proto = | |
| 154 base::MakeUnique<std::vector<uint8_t>>(); | |
| 155 JavaByteArrayToByteVector(env, java_serialized_proto, serialized_proto.get()); | |
| 156 | |
| 157 WebApkInstallService::Get(profile)->UpdateAsync( | 154 WebApkInstallService::Get(profile)->UpdateAsync( |
| 158 webapk_package, start_url, short_name, std::move(serialized_proto), | 155 base::FilePath(request_file_path), base::Bind(&OnUpdated, callback_ref)); |
| 159 base::Bind(&OnUpdated, callback_ref)); | |
| 160 } | 156 } |
| OLD | NEW |