blob: b627d6d00263feab924d47f3532b0d364604ae72 [file] [log] [blame]
[email protected]51208252013-08-19 21:05:301// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/android/shortcut_helper.h"
6
7#include <jni.h>
gonzalon87192d772017-02-07 22:31:108#include <utility>
[email protected]51208252013-08-19 21:05:309
10#include "base/android/jni_android.h"
lalitm45a03c72015-09-16 13:00:4311#include "base/android/jni_array.h"
[email protected]51208252013-08-19 21:05:3012#include "base/android/jni_string.h"
dominickn6509a4de2016-04-06 08:29:0613#include "base/bind.h"
14#include "base/callback.h"
pkotwiczd0d459e2017-03-01 22:55:1015#include "base/guid.h"
Daniel Cheng8fedab22018-05-17 00:39:2716#include "base/optional.h"
[email protected]51208252013-08-19 21:05:3017#include "base/strings/string16.h"
mlamouric679bbf2014-09-24 21:24:4918#include "base/strings/utf_string_conversions.h"
Peter Kotwicz9d0c67e2018-03-08 23:38:2319#include "base/time/time.h"
Daniel Cheng8fedab22018-05-17 00:39:2720#include "chrome/browser/android/color_helpers.h"
hanxi563f3532016-08-19 20:09:0121#include "chrome/browser/android/webapk/chrome_webapk_host.h"
hanxi070d10a2017-01-09 15:56:5022#include "chrome/browser/android/webapk/webapk_install_service.h"
pkotwiczf4dddb32017-02-25 01:21:5523#include "chrome/browser/android/webapk/webapk_metrics.h"
pkotwicz206673142016-07-19 19:13:3024#include "chrome/common/chrome_switches.h"
dfalcantaraaec56da2015-05-06 03:33:5625#include "content/public/browser/browser_thread.h"
jinho.bang84cadc82017-06-14 16:59:3426#include "content/public/browser/manifest_icon_downloader.h"
Dominick Ng203b4932018-02-02 05:32:4527#include "content/public/browser/manifest_icon_selector.h"
[email protected]51208252013-08-19 21:05:3028#include "content/public/browser/web_contents.h"
Findit093657e2018-05-05 04:07:3029#include "content/public/common/manifest.h"
[email protected]51208252013-08-19 21:05:3030#include "jni/ShortcutHelper_jni.h"
Daniel Cheng8fedab22018-05-17 00:39:2731#include "third_party/skia/include/core/SkColor.h"
[email protected]51208252013-08-19 21:05:3032#include "ui/gfx/android/java_bitmap.h"
mlamouribc6e8792015-10-22 20:41:1333#include "ui/gfx/color_analysis.h"
[email protected]51208252013-08-19 21:05:3034#include "url/gurl.h"
35
torne86560112016-08-04 15:59:0436using base::android::JavaParamRef;
37using base::android::ScopedJavaLocalRef;
mlamouric679bbf2014-09-24 21:24:4938
lalitm45a03c72015-09-16 13:00:4339namespace {
40
zpenge33ba852017-02-01 20:54:4241int g_ideal_homescreen_icon_size = -1;
42int g_minimum_homescreen_icon_size = -1;
43int g_ideal_splash_image_size = -1;
44int g_minimum_splash_image_size = -1;
45int g_ideal_badge_icon_size = -1;
lalitm45a03c72015-09-16 13:00:4346
zpenge33ba852017-02-01 20:54:4247int g_default_rgb_icon_value = 145;
mlamouribc6e8792015-10-22 20:41:1348
lalitm45a03c72015-09-16 13:00:4349// Retrieves and caches the ideal and minimum sizes of the Home screen icon
50// and the splash screen image.
51void GetHomescreenIconAndSplashImageSizes() {
52 JNIEnv* env = base::android::AttachCurrentThread();
53 ScopedJavaLocalRef<jintArray> java_size_array =
pkotwicz45fc42b62016-06-07 00:07:1054 Java_ShortcutHelper_getHomeScreenIconAndSplashImageSizes(env);
lalitm45a03c72015-09-16 13:00:4355 std::vector<int> sizes;
zpenga7856eef2017-02-07 11:42:4456 base::android::JavaIntArrayToIntVector(env, java_size_array.obj(), &sizes);
lalitm45a03c72015-09-16 13:00:4357
58 // Check that the size returned is what is expected.
zpenge33ba852017-02-01 20:54:4259 DCHECK(sizes.size() == 5);
lalitm45a03c72015-09-16 13:00:4360
61 // This ordering must be kept up to date with the Java ShortcutHelper.
zpenge33ba852017-02-01 20:54:4262 g_ideal_homescreen_icon_size = sizes[0];
63 g_minimum_homescreen_icon_size = sizes[1];
64 g_ideal_splash_image_size = sizes[2];
65 g_minimum_splash_image_size = sizes[3];
66 g_ideal_badge_icon_size = sizes[4];
lalitm45a03c72015-09-16 13:00:4367
68 // Try to ensure that the data returned is sane.
zpenge33ba852017-02-01 20:54:4269 DCHECK(g_minimum_homescreen_icon_size <= g_ideal_homescreen_icon_size);
70 DCHECK(g_minimum_splash_image_size <= g_ideal_splash_image_size);
lalitm45a03c72015-09-16 13:00:4371}
72
pkotwicz97478712017-03-01 03:39:5473// Adds a shortcut which opens in a fullscreen window to the launcher.
74// |splash_image_callback| will be invoked once the Java-side operation has
75// completed. This is necessary as Java will asynchronously create and
76// populate a WebappDataStorage object for standalone-capable sites. This must
77// exist before the splash image can be stored.
78void AddWebappWithSkBitmap(const ShortcutInfo& info,
79 const std::string& webapp_id,
80 const SkBitmap& icon_bitmap,
81 const base::Closure& splash_image_callback) {
[email protected]51208252013-08-19 21:05:3082 // Send the data to the Java side to create the shortcut.
83 JNIEnv* env = base::android::AttachCurrentThread();
lalitmd93c2ed2015-09-04 16:22:1284 ScopedJavaLocalRef<jstring> java_webapp_id =
85 base::android::ConvertUTF8ToJavaString(env, webapp_id);
[email protected]51208252013-08-19 21:05:3086 ScopedJavaLocalRef<jstring> java_url =
dfalcantara16e84de2015-02-03 22:07:4087 base::android::ConvertUTF8ToJavaString(env, info.url.spec());
pkotwicz6bdfbe1b2016-07-08 00:26:4388 ScopedJavaLocalRef<jstring> java_scope_url =
89 base::android::ConvertUTF8ToJavaString(env, info.scope.spec());
lalitmf3ee51852015-07-21 18:13:1190 ScopedJavaLocalRef<jstring> java_user_title =
91 base::android::ConvertUTF16ToJavaString(env, info.user_title);
92 ScopedJavaLocalRef<jstring> java_name =
93 base::android::ConvertUTF16ToJavaString(env, info.name);
94 ScopedJavaLocalRef<jstring> java_short_name =
95 base::android::ConvertUTF16ToJavaString(env, info.short_name);
zpenga7856eef2017-02-07 11:42:4496 ScopedJavaLocalRef<jstring> java_best_primary_icon_url =
97 base::android::ConvertUTF8ToJavaString(env,
98 info.best_primary_icon_url.spec());
Piotr Swigon98256a782017-11-03 03:44:5699 ScopedJavaLocalRef<jstring> java_splash_screen_url =
100 base::android::ConvertUTF8ToJavaString(env,
101 info.splash_screen_url.spec());
[email protected]51208252013-08-19 21:05:30102 ScopedJavaLocalRef<jobject> java_bitmap;
zpengfebce7612017-06-07 14:29:04103 if (!icon_bitmap.drawsNothing())
mlamouric679bbf2014-09-24 21:24:49104 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap);
[email protected]51208252013-08-19 21:05:30105
pkotwicz206673142016-07-19 19:13:30106 // The callback will need to be run after shortcut creation completes in order
107 // to download the splash image and save it to the WebappDataStorage. Create a
108 // copy of the callback here and send the pointer to Java, which will send it
109 // back once the asynchronous shortcut creation process finishes.
110 uintptr_t callback_pointer =
111 reinterpret_cast<uintptr_t>(new base::Closure(splash_image_callback));
dominickn6509a4de2016-04-06 08:29:06112
zpenga7856eef2017-02-07 11:42:44113 Java_ShortcutHelper_addWebapp(
114 env, java_webapp_id, java_url, java_scope_url, java_user_title, java_name,
115 java_short_name, java_best_primary_icon_url, java_bitmap, info.display,
Daniel Cheng8fedab22018-05-17 00:39:27116 info.orientation, info.source,
117 OptionalSkColorToJavaColor(info.theme_color),
118 OptionalSkColorToJavaColor(info.background_color), java_splash_screen_url,
119 callback_pointer);
[email protected]51208252013-08-19 21:05:30120}
benwells840ae902015-02-17 21:13:28121
pkotwicz97478712017-03-01 03:39:54122// Adds a shortcut which opens in a browser tab to the launcher.
123void AddShortcutWithSkBitmap(const ShortcutInfo& info,
124 const std::string& id,
125 const SkBitmap& icon_bitmap) {
pkotwicz206673142016-07-19 19:13:30126 JNIEnv* env = base::android::AttachCurrentThread();
martiw12166f52017-02-20 03:05:45127 ScopedJavaLocalRef<jstring> java_id =
128 base::android::ConvertUTF8ToJavaString(env, id);
pkotwicz206673142016-07-19 19:13:30129 ScopedJavaLocalRef<jstring> java_url =
130 base::android::ConvertUTF8ToJavaString(env, info.url.spec());
131 ScopedJavaLocalRef<jstring> java_user_title =
132 base::android::ConvertUTF16ToJavaString(env, info.user_title);
133 ScopedJavaLocalRef<jobject> java_bitmap;
zpengfebce7612017-06-07 14:29:04134 if (!icon_bitmap.drawsNothing())
pkotwicz206673142016-07-19 19:13:30135 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap);
136
martiw12166f52017-02-20 03:05:45137 Java_ShortcutHelper_addShortcut(env, java_id, java_url, java_user_title,
138 java_bitmap, info.source);
pkotwicz206673142016-07-19 19:13:30139}
140
pkotwicz97478712017-03-01 03:39:54141} // anonymous namespace
142
143// static
Dominick Ng203b4932018-02-02 05:32:45144std::unique_ptr<ShortcutInfo> ShortcutHelper::CreateShortcutInfo(
145 const GURL& manifest_url,
Findit093657e2018-05-05 04:07:30146 const content::Manifest& manifest,
Dominick Ng203b4932018-02-02 05:32:45147 const GURL& primary_icon_url,
148 const GURL& badge_icon_url) {
149 auto shortcut_info = std::make_unique<ShortcutInfo>(GURL());
150 if (!manifest.IsEmpty()) {
151 shortcut_info->UpdateFromManifest(manifest);
152 shortcut_info->manifest_url = manifest_url;
153 shortcut_info->best_primary_icon_url = primary_icon_url;
154 shortcut_info->best_badge_icon_url = badge_icon_url;
155 }
156
157 shortcut_info->ideal_splash_image_size_in_px = GetIdealSplashImageSizeInPx();
158 shortcut_info->minimum_splash_image_size_in_px =
159 GetMinimumSplashImageSizeInPx();
160 shortcut_info->splash_image_url =
161 content::ManifestIconSelector::FindBestMatchingIcon(
162 manifest.icons, shortcut_info->ideal_splash_image_size_in_px,
163 shortcut_info->minimum_splash_image_size_in_px,
Findit093657e2018-05-05 04:07:30164 content::Manifest::Icon::IconPurpose::ANY);
Dominick Ng203b4932018-02-02 05:32:45165
166 return shortcut_info;
167}
168
169// static
pkotwicz97478712017-03-01 03:39:54170void ShortcutHelper::AddToLauncherWithSkBitmap(
pkotwiczd0d459e2017-03-01 22:55:10171 content::WebContents* web_contents,
pkotwicz97478712017-03-01 03:39:54172 const ShortcutInfo& info,
pkotwiczd0d459e2017-03-01 22:55:10173 const SkBitmap& icon_bitmap) {
174 std::string webapp_id = base::GenerateGUID();
Blink Reformat1c4d759e2017-04-09 16:34:54175 if (info.display == blink::kWebDisplayModeStandalone ||
Piotr Swigon549c0432017-08-16 02:48:41176 info.display == blink::kWebDisplayModeFullscreen ||
Piotr Swigon57e79c5c2017-12-29 01:11:15177 info.display == blink::kWebDisplayModeMinimalUi) {
pkotwiczd0d459e2017-03-01 22:55:10178 AddWebappWithSkBitmap(
179 info, webapp_id, icon_bitmap,
180 base::Bind(&ShortcutHelper::FetchSplashScreenImage, web_contents,
181 info.splash_image_url, info.ideal_splash_image_size_in_px,
182 info.minimum_splash_image_size_in_px, webapp_id));
pkotwicz97478712017-03-01 03:39:54183 return;
184 }
185 AddShortcutWithSkBitmap(info, webapp_id, icon_bitmap);
186}
187
hanxi070d10a2017-01-09 15:56:50188void ShortcutHelper::ShowWebApkInstallInProgressToast() {
189 Java_ShortcutHelper_showWebApkInstallInProgressToast(
190 base::android::AttachCurrentThread());
191}
192
zpeng5d8fdfc2017-01-05 15:45:06193int ShortcutHelper::GetIdealHomescreenIconSizeInPx() {
zpenge33ba852017-02-01 20:54:42194 if (g_ideal_homescreen_icon_size == -1)
lalitm45a03c72015-09-16 13:00:43195 GetHomescreenIconAndSplashImageSizes();
zpenge33ba852017-02-01 20:54:42196 return g_ideal_homescreen_icon_size;
lalitm45a03c72015-09-16 13:00:43197}
198
zpeng5d8fdfc2017-01-05 15:45:06199int ShortcutHelper::GetMinimumHomescreenIconSizeInPx() {
zpenge33ba852017-02-01 20:54:42200 if (g_minimum_homescreen_icon_size == -1)
lalitm45a03c72015-09-16 13:00:43201 GetHomescreenIconAndSplashImageSizes();
zpenge33ba852017-02-01 20:54:42202 return g_minimum_homescreen_icon_size;
lalitm45a03c72015-09-16 13:00:43203}
204
zpeng5d8fdfc2017-01-05 15:45:06205int ShortcutHelper::GetIdealSplashImageSizeInPx() {
zpenge33ba852017-02-01 20:54:42206 if (g_ideal_splash_image_size == -1)
lalitm45a03c72015-09-16 13:00:43207 GetHomescreenIconAndSplashImageSizes();
zpenge33ba852017-02-01 20:54:42208 return g_ideal_splash_image_size;
lalitm45a03c72015-09-16 13:00:43209}
210
zpeng5d8fdfc2017-01-05 15:45:06211int ShortcutHelper::GetMinimumSplashImageSizeInPx() {
zpenge33ba852017-02-01 20:54:42212 if (g_minimum_splash_image_size == -1)
lalitm45a03c72015-09-16 13:00:43213 GetHomescreenIconAndSplashImageSizes();
zpenge33ba852017-02-01 20:54:42214 return g_minimum_splash_image_size;
215}
216
217int ShortcutHelper::GetIdealBadgeIconSizeInPx() {
218 if (g_ideal_badge_icon_size == -1)
219 GetHomescreenIconAndSplashImageSizes();
220 return g_ideal_badge_icon_size;
lalitm45a03c72015-09-16 13:00:43221}
222
lalitmd93c2ed2015-09-04 16:22:12223// static
224void ShortcutHelper::FetchSplashScreenImage(
225 content::WebContents* web_contents,
226 const GURL& image_url,
zpeng5d8fdfc2017-01-05 15:45:06227 const int ideal_splash_image_size_in_px,
228 const int minimum_splash_image_size_in_px,
dominickn6509a4de2016-04-06 08:29:06229 const std::string& webapp_id) {
lalitmd93c2ed2015-09-04 16:22:12230 // This is a fire and forget task. It is not vital for the splash screen image
231 // to be downloaded so if the downloader returns false there is no fallback.
jinho.bang84cadc82017-06-14 16:59:34232 content::ManifestIconDownloader::Download(
zpeng5d8fdfc2017-01-05 15:45:06233 web_contents, image_url, ideal_splash_image_size_in_px,
234 minimum_splash_image_size_in_px,
dominickn6509a4de2016-04-06 08:29:06235 base::Bind(&ShortcutHelper::StoreWebappSplashImage, webapp_id));
lalitmd93c2ed2015-09-04 16:22:12236}
237
238// static
zpenga7856eef2017-02-07 11:42:44239void ShortcutHelper::StoreWebappSplashImage(const std::string& webapp_id,
240 const SkBitmap& splash_image) {
lalitmd93c2ed2015-09-04 16:22:12241 if (splash_image.drawsNothing())
242 return;
243
244 JNIEnv* env = base::android::AttachCurrentThread();
245 ScopedJavaLocalRef<jstring> java_webapp_id =
246 base::android::ConvertUTF8ToJavaString(env, webapp_id);
247 ScopedJavaLocalRef<jobject> java_splash_image =
248 gfx::ConvertToJavaBitmap(&splash_image);
249
torne948f3662016-08-16 15:10:44250 Java_ShortcutHelper_storeWebappSplashImage(env, java_webapp_id,
251 java_splash_image);
lalitmd93c2ed2015-09-04 16:22:12252}
253
mlamouribc6e8792015-10-22 20:41:13254// static
pkotwicz5774087e2016-08-10 17:36:40255SkBitmap ShortcutHelper::FinalizeLauncherIconInBackground(
256 const SkBitmap& bitmap,
257 const GURL& url,
258 bool* is_generated) {
Francois Doray66bdfd82017-10-20 13:50:37259 base::AssertBlockingAllowed();
mlamouribc6e8792015-10-22 20:41:13260
261 JNIEnv* env = base::android::AttachCurrentThread();
262 ScopedJavaLocalRef<jobject> result;
263 *is_generated = false;
264
265 if (!bitmap.isNull()) {
pkotwicz45fc42b62016-06-07 00:07:10266 if (Java_ShortcutHelper_isIconLargeEnoughForLauncher(env, bitmap.width(),
267 bitmap.height())) {
newta584b9e2015-10-29 22:29:43268 ScopedJavaLocalRef<jobject> java_bitmap =
269 gfx::ConvertToJavaBitmap(&bitmap);
torne948f3662016-08-16 15:10:44270 result =
271 Java_ShortcutHelper_createHomeScreenIconFromWebIcon(env, java_bitmap);
mlamouribc6e8792015-10-22 20:41:13272 }
273 }
274
275 if (result.is_null()) {
276 ScopedJavaLocalRef<jstring> java_url =
277 base::android::ConvertUTF8ToJavaString(env, url.spec());
zpenge33ba852017-02-01 20:54:42278 SkColor mean_color =
279 SkColorSetRGB(g_default_rgb_icon_value, g_default_rgb_icon_value,
280 g_default_rgb_icon_value);
mlamouribc6e8792015-10-22 20:41:13281
282 if (!bitmap.isNull())
283 mean_color = color_utils::CalculateKMeanColorOfBitmap(bitmap);
284
285 *is_generated = true;
newta584b9e2015-10-29 22:29:43286 result = Java_ShortcutHelper_generateHomeScreenIcon(
torne948f3662016-08-16 15:10:44287 env, java_url, SkColorGetR(mean_color), SkColorGetG(mean_color),
mlamouribc6e8792015-10-22 20:41:13288 SkColorGetB(mean_color));
289 }
290
pkotwicz964382b2016-08-04 01:24:55291 return result.obj()
torned64eb5132016-10-24 12:51:28292 ? gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(result))
pkotwicz964382b2016-08-04 01:24:55293 : SkBitmap();
mlamouribc6e8792015-10-22 20:41:13294}
295
pkotwiczcda82fe2016-07-08 18:56:54296// static
zpeng4bb58962016-10-04 02:42:29297std::string ShortcutHelper::QueryWebApkPackage(const GURL& url) {
298 JNIEnv* env = base::android::AttachCurrentThread();
299 ScopedJavaLocalRef<jstring> java_url =
300 base::android::ConvertUTF8ToJavaString(env, url.spec());
301 ScopedJavaLocalRef<jstring> java_webapk_package_name =
302 Java_ShortcutHelper_queryWebApkPackage(env, java_url);
303
304 std::string webapk_package_name = "";
305 if (java_webapk_package_name.obj()) {
zpenga7856eef2017-02-07 11:42:44306 webapk_package_name =
307 base::android::ConvertJavaStringToUTF8(env, java_webapk_package_name);
zpeng4bb58962016-10-04 02:42:29308 }
309 return webapk_package_name;
310}
311
312// static
zpenga7856eef2017-02-07 11:42:44313bool ShortcutHelper::IsWebApkInstalled(content::BrowserContext* browser_context,
314 const GURL& start_url,
315 const GURL& manifest_url) {
hanxi070d10a2017-01-09 15:56:50316 return !QueryWebApkPackage(start_url).empty() ||
zpenga7856eef2017-02-07 11:42:44317 WebApkInstallService::Get(browser_context)
318 ->IsInstallInProgress(manifest_url);
pkotwiczcda82fe2016-07-08 18:56:54319}
320
pkotwicz47136bc2016-08-06 23:55:39321GURL ShortcutHelper::GetScopeFromURL(const GURL& url) {
322 JNIEnv* env = base::android::AttachCurrentThread();
323 ScopedJavaLocalRef<jstring> java_url =
324 base::android::ConvertUTF8ToJavaString(env, url.spec());
325 ScopedJavaLocalRef<jstring> java_scope_url =
torne948f3662016-08-16 15:10:44326 Java_ShortcutHelper_getScopeFromUrl(env, java_url);
pkotwicz47136bc2016-08-06 23:55:39327 return GURL(base::android::ConvertJavaStringToUTF16(env, java_scope_url));
328}
329
gonzalon87192d772017-02-07 22:31:10330void ShortcutHelper::RetrieveWebApks(const WebApkInfoCallback& callback) {
331 uintptr_t callback_pointer =
332 reinterpret_cast<uintptr_t>(new WebApkInfoCallback(callback));
333 Java_ShortcutHelper_retrieveWebApks(base::android::AttachCurrentThread(),
334 callback_pointer);
335}
336
dominickn6509a4de2016-04-06 08:29:06337// Callback used by Java when the shortcut has been created.
338// |splash_image_callback| is a pointer to a base::Closure allocated in
pkotwiczc67e6ac2016-08-12 19:56:44339// AddShortcutWithSkBitmap, so reinterpret_cast it back and run it.
dominickn6509a4de2016-04-06 08:29:06340//
341// This callback should only ever be called when the shortcut was for a
342// webapp-capable site; otherwise, |splash_image_callback| will have never been
343// allocated and doesn't need to be run or deleted.
Daniel Bratell7aacf952017-11-21 17:51:25344void JNI_ShortcutHelper_OnWebappDataStored(JNIEnv* env,
345 const JavaParamRef<jclass>& clazz,
346 jlong jsplash_image_callback) {
dominickn6509a4de2016-04-06 08:29:06347 DCHECK(jsplash_image_callback);
348 base::Closure* splash_image_callback =
349 reinterpret_cast<base::Closure*>(jsplash_image_callback);
350 splash_image_callback->Run();
351 delete splash_image_callback;
352}
353
Daniel Bratell7aacf952017-11-21 17:51:25354void JNI_ShortcutHelper_OnWebApksRetrieved(
355 JNIEnv* env,
356 const JavaParamRef<jclass>& clazz,
357 const jlong jcallback_pointer,
358 const JavaParamRef<jobjectArray>& jnames,
359 const JavaParamRef<jobjectArray>& jshort_names,
360 const JavaParamRef<jobjectArray>& jpackage_names,
361 const JavaParamRef<jintArray>& jshell_apk_versions,
362 const JavaParamRef<jintArray>& jversion_codes,
363 const JavaParamRef<jobjectArray>& juris,
364 const JavaParamRef<jobjectArray>& jscopes,
365 const JavaParamRef<jobjectArray>& jmanifest_urls,
366 const JavaParamRef<jobjectArray>& jmanifest_start_urls,
367 const JavaParamRef<jintArray>& jdisplay_modes,
368 const JavaParamRef<jintArray>& jorientations,
369 const JavaParamRef<jlongArray>& jtheme_colors,
Peter Kotwicz9d0c67e2018-03-08 23:38:23370 const JavaParamRef<jlongArray>& jbackground_colors,
371 const JavaParamRef<jlongArray>& jlast_update_check_times_ms,
372 const JavaParamRef<jbooleanArray>& jrelax_updates) {
gonzalon87192d772017-02-07 22:31:10373 DCHECK(jcallback_pointer);
gonzalon85e975452017-03-03 23:58:42374 std::vector<std::string> names;
375 base::android::AppendJavaStringArrayToStringVector(env, jnames, &names);
gonzalon87192d772017-02-07 22:31:10376 std::vector<std::string> short_names;
377 base::android::AppendJavaStringArrayToStringVector(env, jshort_names,
378 &short_names);
379 std::vector<std::string> package_names;
380 base::android::AppendJavaStringArrayToStringVector(env, jpackage_names,
381 &package_names);
382 std::vector<int> shell_apk_versions;
383 base::android::JavaIntArrayToIntVector(env, jshell_apk_versions,
384 &shell_apk_versions);
385 std::vector<int> version_codes;
386 base::android::JavaIntArrayToIntVector(env, jversion_codes, &version_codes);
gonzalon85e975452017-03-03 23:58:42387 std::vector<std::string> uris;
388 base::android::AppendJavaStringArrayToStringVector(env, juris, &uris);
389 std::vector<std::string> scopes;
390 base::android::AppendJavaStringArrayToStringVector(env, jscopes, &scopes);
391 std::vector<std::string> manifest_urls;
392 base::android::AppendJavaStringArrayToStringVector(env, jmanifest_urls,
393 &manifest_urls);
394 std::vector<std::string> manifest_start_urls;
395 base::android::AppendJavaStringArrayToStringVector(env, jmanifest_start_urls,
396 &manifest_start_urls);
397 std::vector<int> display_modes;
398 base::android::JavaIntArrayToIntVector(env, jdisplay_modes, &display_modes);
399 std::vector<int> orientations;
400 base::android::JavaIntArrayToIntVector(env, jorientations, &orientations);
401 std::vector<int64_t> theme_colors;
402 base::android::JavaLongArrayToInt64Vector(env, jtheme_colors, &theme_colors);
403 std::vector<int64_t> background_colors;
404 base::android::JavaLongArrayToInt64Vector(env, jbackground_colors,
405 &background_colors);
Peter Kotwicz9d0c67e2018-03-08 23:38:23406 std::vector<int64_t> last_update_check_times_ms;
407 base::android::JavaLongArrayToInt64Vector(env, jlast_update_check_times_ms,
408 &last_update_check_times_ms);
409 std::vector<bool> relax_updates;
410 base::android::JavaBooleanArrayToBoolVector(env, jrelax_updates,
411 &relax_updates);
gonzalon87192d772017-02-07 22:31:10412
gonzalon85e975452017-03-03 23:58:42413 DCHECK(short_names.size() == names.size());
gonzalon87192d772017-02-07 22:31:10414 DCHECK(short_names.size() == package_names.size());
415 DCHECK(short_names.size() == shell_apk_versions.size());
416 DCHECK(short_names.size() == version_codes.size());
gonzalon85e975452017-03-03 23:58:42417 DCHECK(short_names.size() == uris.size());
418 DCHECK(short_names.size() == scopes.size());
419 DCHECK(short_names.size() == manifest_urls.size());
420 DCHECK(short_names.size() == manifest_start_urls.size());
421 DCHECK(short_names.size() == display_modes.size());
422 DCHECK(short_names.size() == orientations.size());
423 DCHECK(short_names.size() == theme_colors.size());
424 DCHECK(short_names.size() == background_colors.size());
Peter Kotwicz9d0c67e2018-03-08 23:38:23425 DCHECK(short_names.size() == last_update_check_times_ms.size());
426 DCHECK(short_names.size() == relax_updates.size());
gonzalon87192d772017-02-07 22:31:10427
428 std::vector<WebApkInfo> webapk_list;
429 webapk_list.reserve(short_names.size());
430 for (size_t i = 0; i < short_names.size(); ++i) {
gonzalon85e975452017-03-03 23:58:42431 webapk_list.push_back(WebApkInfo(
432 std::move(names[i]), std::move(short_names[i]),
433 std::move(package_names[i]), shell_apk_versions[i], version_codes[i],
434 std::move(uris[i]), std::move(scopes[i]), std::move(manifest_urls[i]),
435 std::move(manifest_start_urls[i]),
436 static_cast<blink::WebDisplayMode>(display_modes[i]),
437 static_cast<blink::WebScreenOrientationLockType>(orientations[i]),
Daniel Cheng8fedab22018-05-17 00:39:27438 JavaColorToOptionalSkColor(theme_colors[i]),
439 JavaColorToOptionalSkColor(background_colors[i]),
Peter Kotwicz9d0c67e2018-03-08 23:38:23440 base::Time::FromJavaTime(last_update_check_times_ms[i]),
441 relax_updates[i]));
gonzalon87192d772017-02-07 22:31:10442 }
443
444 ShortcutHelper::WebApkInfoCallback* webapk_list_callback =
445 reinterpret_cast<ShortcutHelper::WebApkInfoCallback*>(jcallback_pointer);
446 webapk_list_callback->Run(webapk_list);
447 delete webapk_list_callback;
448}