Chromium Code Reviews| 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> |
|
dominickn
2017/06/14 00:14:23
#include <memory>
#include <vector>
| |
| 8 | 8 |
| 9 #include "base/android/callback_android.h" | |
| 9 #include "base/android/jni_array.h" | 10 #include "base/android/jni_array.h" |
| 10 #include "base/android/jni_string.h" | 11 #include "base/android/jni_string.h" |
| 12 #include "base/android/scoped_java_ref.h" | |
| 11 #include "base/bind.h" | 13 #include "base/bind.h" |
| 14 #include "base/memory/ptr_util.h" | |
| 15 #include "base/strings/string16.h" | |
| 12 #include "base/threading/thread_task_runner_handle.h" | 16 #include "base/threading/thread_task_runner_handle.h" |
| 13 #include "chrome/browser/android/shortcut_info.h" | 17 #include "chrome/browser/android/shortcut_info.h" |
| 14 #include "chrome/browser/android/webapk/webapk_install_service.h" | 18 #include "chrome/browser/android/webapk/webapk_install_service.h" |
| 19 #include "chrome/browser/android/webapk/webapk_installer.h" | |
| 15 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
| 16 #include "chrome/browser/profiles/profile_manager.h" | 21 #include "chrome/browser/profiles/profile_manager.h" |
| 17 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
| 18 #include "jni/WebApkUpdateManager_jni.h" | 23 #include "jni/WebApkUpdateManager_jni.h" |
| 19 #include "third_party/skia/include/core/SkBitmap.h" | 24 #include "third_party/skia/include/core/SkBitmap.h" |
| 20 #include "ui/gfx/android/java_bitmap.h" | 25 #include "ui/gfx/android/java_bitmap.h" |
| 21 #include "url/gurl.h" | 26 #include "url/gurl.h" |
| 22 | 27 |
| 28 using base::android::JavaRef; | |
| 23 using base::android::JavaParamRef; | 29 using base::android::JavaParamRef; |
| 30 using base::android::ScopedJavaGlobalRef; | |
| 31 | |
| 32 namespace { | |
| 33 | |
| 34 // Called with the serialized proto to send to the WebAPK server. | |
| 35 void OnBuiltProto(const JavaRef<jobject>& java_callback, | |
| 36 std::unique_ptr<std::vector<uint8_t>> proto) { | |
| 37 base::android::RunCallbackAndroid(java_callback, *proto); | |
| 38 } | |
| 39 | |
| 40 // Called after the update either succeeds or fails. | |
| 41 void OnUpdated(const JavaRef<jobject>& java_callback, | |
| 42 WebApkInstallResult result, | |
| 43 bool relax_updates, | |
| 44 const std::string& webapk_package) { | |
| 45 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 46 Java_WebApkUpdateCallback_onResultFromNative( | |
| 47 env, java_callback, static_cast<int>(result), relax_updates); | |
| 48 } | |
| 49 | |
| 50 } // anonymous namespace | |
| 24 | 51 |
| 25 // static | 52 // static |
| 26 bool WebApkUpdateManager::Register(JNIEnv* env) { | 53 bool WebApkUpdateManager::Register(JNIEnv* env) { |
| 27 return RegisterNativesImpl(env); | 54 return RegisterNativesImpl(env); |
| 28 } | 55 } |
| 29 | 56 |
| 30 // static | |
| 31 void WebApkUpdateManager::OnBuiltWebApk(const std::string& id, | |
| 32 WebApkInstallResult result, | |
| 33 bool relax_updates, | |
| 34 const std::string& webapk_package) { | |
| 35 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 36 | |
| 37 base::android::ScopedJavaLocalRef<jstring> java_id = | |
| 38 base::android::ConvertUTF8ToJavaString(env, id); | |
| 39 Java_WebApkUpdateManager_onBuiltWebApk( | |
| 40 env, java_id.obj(), static_cast<int>(result), relax_updates); | |
| 41 } | |
| 42 | |
| 43 // static JNI method. | 57 // static JNI method. |
| 44 static void UpdateAsync( | 58 static void BuildUpdateWebApkProto( |
| 45 JNIEnv* env, | 59 JNIEnv* env, |
| 46 const JavaParamRef<jclass>& clazz, | 60 const JavaParamRef<jclass>& clazz, |
| 47 const JavaParamRef<jstring>& java_id, | |
| 48 const JavaParamRef<jstring>& java_start_url, | 61 const JavaParamRef<jstring>& java_start_url, |
| 49 const JavaParamRef<jstring>& java_scope, | 62 const JavaParamRef<jstring>& java_scope, |
| 50 const JavaParamRef<jstring>& java_name, | 63 const JavaParamRef<jstring>& java_name, |
| 51 const JavaParamRef<jstring>& java_short_name, | 64 const JavaParamRef<jstring>& java_short_name, |
| 52 const JavaParamRef<jstring>& java_best_primary_icon_url, | 65 const JavaParamRef<jstring>& java_best_primary_icon_url, |
| 53 const JavaParamRef<jobject>& java_best_primary_icon_bitmap, | 66 const JavaParamRef<jobject>& java_best_primary_icon_bitmap, |
| 54 const JavaParamRef<jobjectArray>& java_icon_urls, | 67 const JavaParamRef<jobjectArray>& java_icon_urls, |
| 55 const JavaParamRef<jobjectArray>& java_icon_hashes, | 68 const JavaParamRef<jobjectArray>& java_icon_hashes, |
| 56 jint java_display_mode, | 69 jint java_display_mode, |
| 57 jint java_orientation, | 70 jint java_orientation, |
| 58 jlong java_theme_color, | 71 jlong java_theme_color, |
| 59 jlong java_background_color, | 72 jlong java_background_color, |
| 60 const JavaParamRef<jstring>& java_web_manifest_url, | 73 const JavaParamRef<jstring>& java_web_manifest_url, |
| 61 const JavaParamRef<jstring>& java_webapk_package, | 74 const JavaParamRef<jstring>& java_webapk_package, |
| 62 jint java_webapk_version, | 75 jint java_webapk_version, |
| 63 jboolean java_is_manifest_stale) { | 76 jboolean java_is_manifest_stale, |
| 77 const JavaParamRef<jobject>& java_callback) { | |
| 64 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 78 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 65 | 79 |
| 66 Profile* profile = ProfileManager::GetLastUsedProfile(); | |
| 67 if (profile == nullptr) { | |
| 68 NOTREACHED() << "Profile not found."; | |
| 69 return; | |
| 70 } | |
| 71 | |
| 72 std::string id(ConvertJavaStringToUTF8(env, java_id)); | |
| 73 GURL start_url(ConvertJavaStringToUTF8(env, java_start_url)); | 80 GURL start_url(ConvertJavaStringToUTF8(env, java_start_url)); |
| 74 GURL scope(ConvertJavaStringToUTF8(env, java_scope)); | 81 GURL scope(ConvertJavaStringToUTF8(env, java_scope)); |
| 75 GURL web_manifest_url(ConvertJavaStringToUTF8(env, java_web_manifest_url)); | 82 GURL web_manifest_url(ConvertJavaStringToUTF8(env, java_web_manifest_url)); |
| 76 GURL best_primary_icon_url( | 83 GURL best_primary_icon_url( |
| 77 ConvertJavaStringToUTF8(env, java_best_primary_icon_url)); | 84 ConvertJavaStringToUTF8(env, java_best_primary_icon_url)); |
| 78 ShortcutInfo info(start_url); | 85 ShortcutInfo info(start_url); |
| 79 info.scope = scope; | 86 info.scope = scope; |
| 80 info.name = ConvertJavaStringToUTF16(env, java_name); | 87 info.name = ConvertJavaStringToUTF16(env, java_name); |
| 81 info.short_name = ConvertJavaStringToUTF16(env, java_short_name); | 88 info.short_name = ConvertJavaStringToUTF16(env, java_short_name); |
| 82 info.user_title = info.short_name; | 89 info.user_title = info.short_name; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 100 icon_url_to_murmur2_hash[info.icon_urls[i]] = icon_hashes[i]; | 107 icon_url_to_murmur2_hash[info.icon_urls[i]] = icon_hashes[i]; |
| 101 | 108 |
| 102 gfx::JavaBitmap java_bitmap_lock(java_best_primary_icon_bitmap); | 109 gfx::JavaBitmap java_bitmap_lock(java_best_primary_icon_bitmap); |
| 103 SkBitmap best_primary_icon_bitmap = | 110 SkBitmap best_primary_icon_bitmap = |
| 104 gfx::CreateSkBitmapFromJavaBitmap(java_bitmap_lock); | 111 gfx::CreateSkBitmapFromJavaBitmap(java_bitmap_lock); |
| 105 best_primary_icon_bitmap.setImmutable(); | 112 best_primary_icon_bitmap.setImmutable(); |
| 106 | 113 |
| 107 std::string webapk_package; | 114 std::string webapk_package; |
| 108 ConvertJavaStringToUTF8(env, java_webapk_package, &webapk_package); | 115 ConvertJavaStringToUTF8(env, java_webapk_package, &webapk_package); |
| 109 | 116 |
| 110 WebApkInstallService* install_service = WebApkInstallService::Get(profile); | 117 WebApkInstaller::BuildProto( |
| 111 if (install_service->IsInstallInProgress(info.manifest_url)) { | 118 info, best_primary_icon_bitmap, SkBitmap(), webapk_package, |
| 119 std::to_string(java_webapk_version), icon_url_to_murmur2_hash, | |
| 120 java_is_manifest_stale, | |
| 121 base::Bind(&OnBuiltProto, ScopedJavaGlobalRef<jobject>(java_callback))); | |
| 122 } | |
| 123 | |
| 124 // static JNI method. | |
| 125 static void UpdateWebApk(JNIEnv* env, | |
| 126 const JavaParamRef<jclass>& clazz, | |
| 127 const JavaParamRef<jstring>& java_webapk_package, | |
| 128 const JavaParamRef<jstring>& java_start_url, | |
| 129 const JavaParamRef<jstring>& java_short_name, | |
| 130 const JavaParamRef<jbyteArray>& java_serialized_proto, | |
| 131 const JavaParamRef<jobject>& java_callback) { | |
| 132 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 133 | |
| 134 ScopedJavaGlobalRef<jobject> callback_ref(java_callback); | |
| 135 | |
| 136 Profile* profile = ProfileManager::GetLastUsedProfile(); | |
| 137 if (profile == nullptr) { | |
| 112 base::ThreadTaskRunnerHandle::Get()->PostTask( | 138 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 113 FROM_HERE, | 139 FROM_HERE, |
| 114 base::Bind(&WebApkUpdateManager::OnBuiltWebApk, id, | 140 base::Bind(&OnUpdated, callback_ref, WebApkInstallResult::FAILURE, |
| 115 WebApkInstallResult::FAILURE, false /* relax_updates */, | 141 false /* relax_updates */, "" /* webapk_package */)); |
| 116 "" /* webapk_package */)); | |
| 117 return; | 142 return; |
| 118 } | 143 } |
| 119 install_service->UpdateAsync( | 144 |
| 120 info, best_primary_icon_bitmap, webapk_package, java_webapk_version, | 145 std::string webapk_package = |
| 121 icon_url_to_murmur2_hash, java_is_manifest_stale, | 146 ConvertJavaStringToUTF8(env, java_webapk_package); |
| 122 base::Bind(&WebApkUpdateManager::OnBuiltWebApk, id)); | 147 GURL start_url = GURL(ConvertJavaStringToUTF8(env, java_start_url)); |
| 148 base::string16 short_name = ConvertJavaStringToUTF16(env, java_short_name); | |
| 149 std::unique_ptr<std::vector<uint8_t>> serialized_proto( | |
| 150 new std::vector<uint8_t>); | |
|
dominickn
2017/06/14 00:14:23
base::MakeUnique
| |
| 151 JavaByteArrayToByteVector(env, java_serialized_proto, serialized_proto.get()); | |
| 152 | |
| 153 WebApkInstallService::Get(profile)->UpdateAsync( | |
| 154 webapk_package, start_url, short_name, std::move(serialized_proto), | |
| 155 base::Bind(&OnUpdated, callback_ref)); | |
| 123 } | 156 } |
| OLD | NEW |