OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/shortcut_helper.h" | 5 #include "chrome/browser/android/shortcut_helper.h" |
6 | 6 |
7 #include <jni.h> | 7 #include <jni.h> |
8 | 8 |
9 #include "base/android/jni_android.h" | 9 #include "base/android/jni_android.h" |
10 #include "base/android/jni_array.h" | 10 #include "base/android/jni_array.h" |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 if (icon_bitmap.getSize()) | 120 if (icon_bitmap.getSize()) |
121 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap); | 121 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap); |
122 | 122 |
123 // The callback will need to be run after shortcut creation completes in order | 123 // The callback will need to be run after shortcut creation completes in order |
124 // to download the splash image and save it to the WebappDataStorage. Create a | 124 // to download the splash image and save it to the WebappDataStorage. Create a |
125 // copy of the callback here and send the pointer to Java, which will send it | 125 // copy of the callback here and send the pointer to Java, which will send it |
126 // back once the asynchronous shortcut creation process finishes. | 126 // back once the asynchronous shortcut creation process finishes. |
127 uintptr_t callback_pointer = | 127 uintptr_t callback_pointer = |
128 reinterpret_cast<uintptr_t>(new base::Closure(splash_image_callback)); | 128 reinterpret_cast<uintptr_t>(new base::Closure(splash_image_callback)); |
129 | 129 |
130 Java_ShortcutHelper_addWebapp( | 130 Java_ShortcutHelper_addWebapp(env, java_webapp_id, java_url, java_scope_url, |
131 env, | 131 java_user_title, java_name, java_short_name, |
132 java_webapp_id.obj(), | 132 java_icon_url, java_bitmap, info.display, |
133 java_url.obj(), | 133 info.orientation, info.source, info.theme_color, |
134 java_scope_url.obj(), | 134 info.background_color, callback_pointer); |
135 java_user_title.obj(), | |
136 java_name.obj(), | |
137 java_short_name.obj(), | |
138 java_icon_url.obj(), | |
139 java_bitmap.obj(), | |
140 info.display, | |
141 info.orientation, | |
142 info.source, | |
143 info.theme_color, | |
144 info.background_color, | |
145 callback_pointer); | |
146 } | 135 } |
147 | 136 |
148 void ShortcutHelper::AddShortcutWithSkBitmap( | 137 void ShortcutHelper::AddShortcutWithSkBitmap( |
149 const ShortcutInfo& info, | 138 const ShortcutInfo& info, |
150 const SkBitmap& icon_bitmap) { | 139 const SkBitmap& icon_bitmap) { |
151 JNIEnv* env = base::android::AttachCurrentThread(); | 140 JNIEnv* env = base::android::AttachCurrentThread(); |
152 ScopedJavaLocalRef<jstring> java_url = | 141 ScopedJavaLocalRef<jstring> java_url = |
153 base::android::ConvertUTF8ToJavaString(env, info.url.spec()); | 142 base::android::ConvertUTF8ToJavaString(env, info.url.spec()); |
154 ScopedJavaLocalRef<jstring> java_user_title = | 143 ScopedJavaLocalRef<jstring> java_user_title = |
155 base::android::ConvertUTF16ToJavaString(env, info.user_title); | 144 base::android::ConvertUTF16ToJavaString(env, info.user_title); |
156 ScopedJavaLocalRef<jobject> java_bitmap; | 145 ScopedJavaLocalRef<jobject> java_bitmap; |
157 if (icon_bitmap.getSize()) | 146 if (icon_bitmap.getSize()) |
158 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap); | 147 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap); |
159 | 148 |
160 Java_ShortcutHelper_addShortcut(env, java_url.obj(), java_user_title.obj(), | 149 Java_ShortcutHelper_addShortcut(env, java_url, java_user_title, java_bitmap, |
161 java_bitmap.obj(), info.source); | 150 info.source); |
162 } | 151 } |
163 | 152 |
164 void ShortcutHelper::OnBuiltWebApk(bool success) { | 153 void ShortcutHelper::OnBuiltWebApk(bool success) { |
165 if (success) { | 154 if (success) { |
166 DVLOG(1) << "Sent request to install WebAPK. Seems to have worked."; | 155 DVLOG(1) << "Sent request to install WebAPK. Seems to have worked."; |
167 } else { | 156 } else { |
168 LOG(ERROR) << "WebAPK install failed."; | 157 LOG(ERROR) << "WebAPK install failed."; |
169 } | 158 } |
170 // TODO(pkotwicz): Figure out what to do when installing WebAPK fails. | 159 // TODO(pkotwicz): Figure out what to do when installing WebAPK fails. |
171 // (crbug.com/626950) | 160 // (crbug.com/626950) |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 const SkBitmap& splash_image) { | 205 const SkBitmap& splash_image) { |
217 if (splash_image.drawsNothing()) | 206 if (splash_image.drawsNothing()) |
218 return; | 207 return; |
219 | 208 |
220 JNIEnv* env = base::android::AttachCurrentThread(); | 209 JNIEnv* env = base::android::AttachCurrentThread(); |
221 ScopedJavaLocalRef<jstring> java_webapp_id = | 210 ScopedJavaLocalRef<jstring> java_webapp_id = |
222 base::android::ConvertUTF8ToJavaString(env, webapp_id); | 211 base::android::ConvertUTF8ToJavaString(env, webapp_id); |
223 ScopedJavaLocalRef<jobject> java_splash_image = | 212 ScopedJavaLocalRef<jobject> java_splash_image = |
224 gfx::ConvertToJavaBitmap(&splash_image); | 213 gfx::ConvertToJavaBitmap(&splash_image); |
225 | 214 |
226 Java_ShortcutHelper_storeWebappSplashImage( | 215 Java_ShortcutHelper_storeWebappSplashImage(env, java_webapp_id, |
227 env, | 216 java_splash_image); |
228 java_webapp_id.obj(), | |
229 java_splash_image.obj()); | |
230 } | 217 } |
231 | 218 |
232 // static | 219 // static |
233 SkBitmap ShortcutHelper::FinalizeLauncherIconInBackground( | 220 SkBitmap ShortcutHelper::FinalizeLauncherIconInBackground( |
234 const SkBitmap& bitmap, | 221 const SkBitmap& bitmap, |
235 const GURL& url, | 222 const GURL& url, |
236 bool* is_generated) { | 223 bool* is_generated) { |
237 DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); | 224 DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
238 | 225 |
239 JNIEnv* env = base::android::AttachCurrentThread(); | 226 JNIEnv* env = base::android::AttachCurrentThread(); |
240 ScopedJavaLocalRef<jobject> result; | 227 ScopedJavaLocalRef<jobject> result; |
241 *is_generated = false; | 228 *is_generated = false; |
242 | 229 |
243 if (!bitmap.isNull()) { | 230 if (!bitmap.isNull()) { |
244 if (Java_ShortcutHelper_isIconLargeEnoughForLauncher(env, bitmap.width(), | 231 if (Java_ShortcutHelper_isIconLargeEnoughForLauncher(env, bitmap.width(), |
245 bitmap.height())) { | 232 bitmap.height())) { |
246 ScopedJavaLocalRef<jobject> java_bitmap = | 233 ScopedJavaLocalRef<jobject> java_bitmap = |
247 gfx::ConvertToJavaBitmap(&bitmap); | 234 gfx::ConvertToJavaBitmap(&bitmap); |
248 result = Java_ShortcutHelper_createHomeScreenIconFromWebIcon( | 235 result = |
249 env, java_bitmap.obj()); | 236 Java_ShortcutHelper_createHomeScreenIconFromWebIcon(env, java_bitmap); |
250 } | 237 } |
251 } | 238 } |
252 | 239 |
253 if (result.is_null()) { | 240 if (result.is_null()) { |
254 ScopedJavaLocalRef<jstring> java_url = | 241 ScopedJavaLocalRef<jstring> java_url = |
255 base::android::ConvertUTF8ToJavaString(env, url.spec()); | 242 base::android::ConvertUTF8ToJavaString(env, url.spec()); |
256 SkColor mean_color = SkColorSetRGB( | 243 SkColor mean_color = SkColorSetRGB( |
257 kDefaultRGBIconValue, kDefaultRGBIconValue, kDefaultRGBIconValue); | 244 kDefaultRGBIconValue, kDefaultRGBIconValue, kDefaultRGBIconValue); |
258 | 245 |
259 if (!bitmap.isNull()) | 246 if (!bitmap.isNull()) |
260 mean_color = color_utils::CalculateKMeanColorOfBitmap(bitmap); | 247 mean_color = color_utils::CalculateKMeanColorOfBitmap(bitmap); |
261 | 248 |
262 *is_generated = true; | 249 *is_generated = true; |
263 result = Java_ShortcutHelper_generateHomeScreenIcon( | 250 result = Java_ShortcutHelper_generateHomeScreenIcon( |
264 env, java_url.obj(), SkColorGetR(mean_color), SkColorGetG(mean_color), | 251 env, java_url, SkColorGetR(mean_color), SkColorGetG(mean_color), |
265 SkColorGetB(mean_color)); | 252 SkColorGetB(mean_color)); |
266 } | 253 } |
267 | 254 |
268 return result.obj() | 255 return result.obj() |
269 ? gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(result.obj())) | 256 ? gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(result.obj())) |
270 : SkBitmap(); | 257 : SkBitmap(); |
271 } | 258 } |
272 | 259 |
273 // static | 260 // static |
274 bool ShortcutHelper::IsWebApkInstalled(const GURL& url) { | 261 bool ShortcutHelper::IsWebApkInstalled(const GURL& url) { |
275 JNIEnv* env = base::android::AttachCurrentThread(); | 262 JNIEnv* env = base::android::AttachCurrentThread(); |
276 ScopedJavaLocalRef<jstring> java_url = | 263 ScopedJavaLocalRef<jstring> java_url = |
277 base::android::ConvertUTF8ToJavaString(env, url.spec()); | 264 base::android::ConvertUTF8ToJavaString(env, url.spec()); |
278 return Java_ShortcutHelper_isWebApkInstalled(env, java_url.obj()); | 265 return Java_ShortcutHelper_isWebApkInstalled(env, java_url); |
279 } | 266 } |
280 | 267 |
281 GURL ShortcutHelper::GetScopeFromURL(const GURL& url) { | 268 GURL ShortcutHelper::GetScopeFromURL(const GURL& url) { |
282 JNIEnv* env = base::android::AttachCurrentThread(); | 269 JNIEnv* env = base::android::AttachCurrentThread(); |
283 ScopedJavaLocalRef<jstring> java_url = | 270 ScopedJavaLocalRef<jstring> java_url = |
284 base::android::ConvertUTF8ToJavaString(env, url.spec()); | 271 base::android::ConvertUTF8ToJavaString(env, url.spec()); |
285 ScopedJavaLocalRef<jstring> java_scope_url = | 272 ScopedJavaLocalRef<jstring> java_scope_url = |
286 Java_ShortcutHelper_getScopeFromUrl(env, java_url.obj()); | 273 Java_ShortcutHelper_getScopeFromUrl(env, java_url); |
287 return GURL(base::android::ConvertJavaStringToUTF16(env, java_scope_url)); | 274 return GURL(base::android::ConvertJavaStringToUTF16(env, java_scope_url)); |
288 } | 275 } |
289 | 276 |
290 // Callback used by Java when the shortcut has been created. | 277 // Callback used by Java when the shortcut has been created. |
291 // |splash_image_callback| is a pointer to a base::Closure allocated in | 278 // |splash_image_callback| is a pointer to a base::Closure allocated in |
292 // AddShortcutWithSkBitmap, so reinterpret_cast it back and run it. | 279 // AddShortcutWithSkBitmap, so reinterpret_cast it back and run it. |
293 // | 280 // |
294 // This callback should only ever be called when the shortcut was for a | 281 // This callback should only ever be called when the shortcut was for a |
295 // webapp-capable site; otherwise, |splash_image_callback| will have never been | 282 // webapp-capable site; otherwise, |splash_image_callback| will have never been |
296 // allocated and doesn't need to be run or deleted. | 283 // allocated and doesn't need to be run or deleted. |
297 void OnWebappDataStored(JNIEnv* env, | 284 void OnWebappDataStored(JNIEnv* env, |
298 const JavaParamRef<jclass>& clazz, | 285 const JavaParamRef<jclass>& clazz, |
299 jlong jsplash_image_callback) { | 286 jlong jsplash_image_callback) { |
300 DCHECK(jsplash_image_callback); | 287 DCHECK(jsplash_image_callback); |
301 base::Closure* splash_image_callback = | 288 base::Closure* splash_image_callback = |
302 reinterpret_cast<base::Closure*>(jsplash_image_callback); | 289 reinterpret_cast<base::Closure*>(jsplash_image_callback); |
303 splash_image_callback->Run(); | 290 splash_image_callback->Run(); |
304 delete splash_image_callback; | 291 delete splash_image_callback; |
305 } | 292 } |
306 | 293 |
307 bool ShortcutHelper::RegisterShortcutHelper(JNIEnv* env) { | 294 bool ShortcutHelper::RegisterShortcutHelper(JNIEnv* env) { |
308 return RegisterNativesImpl(env); | 295 return RegisterNativesImpl(env); |
309 } | 296 } |
OLD | NEW |