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 |