blob: 4b94289a87d05a9552656abcc526aa67b6602134 [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"
Etienne Pierre-doray4f2e41bed2018-09-24 22:10:1119#include "base/threading/thread_restrictions.h"
Peter Kotwicz9d0c67e2018-03-08 23:38:2320#include "base/time/time.h"
Daniel Cheng8fedab22018-05-17 00:39:2721#include "chrome/browser/android/color_helpers.h"
hanxi563f3532016-08-19 20:09:0122#include "chrome/browser/android/webapk/chrome_webapk_host.h"
hanxi070d10a2017-01-09 15:56:5023#include "chrome/browser/android/webapk/webapk_install_service.h"
pkotwiczf4dddb32017-02-25 01:21:5524#include "chrome/browser/android/webapk/webapk_metrics.h"
pkotwicz206673142016-07-19 19:13:3025#include "chrome/common/chrome_switches.h"
dfalcantaraaec56da2015-05-06 03:33:5626#include "content/public/browser/browser_thread.h"
jinho.bang84cadc82017-06-14 16:59:3427#include "content/public/browser/manifest_icon_downloader.h"
[email protected]51208252013-08-19 21:05:3028#include "content/public/browser/web_contents.h"
[email protected]51208252013-08-19 21:05:3029#include "jni/ShortcutHelper_jni.h"
Dmitry Gozman88ca5a992018-05-18 00:13:3330#include "third_party/blink/public/common/manifest/manifest.h"
Mugdha Lakhani62db8de2018-07-10 16:00:4831#include "third_party/blink/public/common/manifest/manifest_icon_selector.h"
Daniel Cheng8fedab22018-05-17 00:39:2732#include "third_party/skia/include/core/SkColor.h"
[email protected]51208252013-08-19 21:05:3033#include "ui/gfx/android/java_bitmap.h"
mlamouribc6e8792015-10-22 20:41:1334#include "ui/gfx/color_analysis.h"
[email protected]51208252013-08-19 21:05:3035#include "url/gurl.h"
36
torne86560112016-08-04 15:59:0437using base::android::JavaParamRef;
38using base::android::ScopedJavaLocalRef;
mlamouric679bbf2014-09-24 21:24:4939
lalitm45a03c72015-09-16 13:00:4340namespace {
41
zpenge33ba852017-02-01 20:54:4242int g_ideal_homescreen_icon_size = -1;
43int g_minimum_homescreen_icon_size = -1;
44int g_ideal_splash_image_size = -1;
45int g_minimum_splash_image_size = -1;
46int g_ideal_badge_icon_size = -1;
lalitm45a03c72015-09-16 13:00:4347
zpenge33ba852017-02-01 20:54:4248int g_default_rgb_icon_value = 145;
mlamouribc6e8792015-10-22 20:41:1349
lalitm45a03c72015-09-16 13:00:4350// Retrieves and caches the ideal and minimum sizes of the Home screen icon
51// and the splash screen image.
52void GetHomescreenIconAndSplashImageSizes() {
53 JNIEnv* env = base::android::AttachCurrentThread();
54 ScopedJavaLocalRef<jintArray> java_size_array =
pkotwicz45fc42b62016-06-07 00:07:1055 Java_ShortcutHelper_getHomeScreenIconAndSplashImageSizes(env);
lalitm45a03c72015-09-16 13:00:4356 std::vector<int> sizes;
zpenga7856eef2017-02-07 11:42:4457 base::android::JavaIntArrayToIntVector(env, java_size_array.obj(), &sizes);
lalitm45a03c72015-09-16 13:00:4358
59 // Check that the size returned is what is expected.
zpenge33ba852017-02-01 20:54:4260 DCHECK(sizes.size() == 5);
lalitm45a03c72015-09-16 13:00:4361
62 // This ordering must be kept up to date with the Java ShortcutHelper.
zpenge33ba852017-02-01 20:54:4263 g_ideal_homescreen_icon_size = sizes[0];
64 g_minimum_homescreen_icon_size = sizes[1];
65 g_ideal_splash_image_size = sizes[2];
66 g_minimum_splash_image_size = sizes[3];
67 g_ideal_badge_icon_size = sizes[4];
lalitm45a03c72015-09-16 13:00:4368
69 // Try to ensure that the data returned is sane.
zpenge33ba852017-02-01 20:54:4270 DCHECK(g_minimum_homescreen_icon_size <= g_ideal_homescreen_icon_size);
71 DCHECK(g_minimum_splash_image_size <= g_ideal_splash_image_size);
lalitm45a03c72015-09-16 13:00:4372}
73
pkotwicz97478712017-03-01 03:39:5474// Adds a shortcut which opens in a fullscreen window to the launcher.
75// |splash_image_callback| will be invoked once the Java-side operation has
76// completed. This is necessary as Java will asynchronously create and
77// populate a WebappDataStorage object for standalone-capable sites. This must
78// exist before the splash image can be stored.
79void AddWebappWithSkBitmap(const ShortcutInfo& info,
80 const std::string& webapp_id,
81 const SkBitmap& icon_bitmap,
82 const base::Closure& splash_image_callback) {
[email protected]51208252013-08-19 21:05:3083 // Send the data to the Java side to create the shortcut.
84 JNIEnv* env = base::android::AttachCurrentThread();
lalitmd93c2ed2015-09-04 16:22:1285 ScopedJavaLocalRef<jstring> java_webapp_id =
86 base::android::ConvertUTF8ToJavaString(env, webapp_id);
[email protected]51208252013-08-19 21:05:3087 ScopedJavaLocalRef<jstring> java_url =
dfalcantara16e84de2015-02-03 22:07:4088 base::android::ConvertUTF8ToJavaString(env, info.url.spec());
pkotwicz6bdfbe1b2016-07-08 00:26:4389 ScopedJavaLocalRef<jstring> java_scope_url =
90 base::android::ConvertUTF8ToJavaString(env, info.scope.spec());
lalitmf3ee51852015-07-21 18:13:1191 ScopedJavaLocalRef<jstring> java_user_title =
92 base::android::ConvertUTF16ToJavaString(env, info.user_title);
93 ScopedJavaLocalRef<jstring> java_name =
94 base::android::ConvertUTF16ToJavaString(env, info.name);
95 ScopedJavaLocalRef<jstring> java_short_name =
96 base::android::ConvertUTF16ToJavaString(env, info.short_name);
zpenga7856eef2017-02-07 11:42:4497 ScopedJavaLocalRef<jstring> java_best_primary_icon_url =
98 base::android::ConvertUTF8ToJavaString(env,
99 info.best_primary_icon_url.spec());
Piotr Swigon98256a782017-11-03 03:44:56100 ScopedJavaLocalRef<jstring> java_splash_screen_url =
101 base::android::ConvertUTF8ToJavaString(env,
102 info.splash_screen_url.spec());
[email protected]51208252013-08-19 21:05:30103 ScopedJavaLocalRef<jobject> java_bitmap;
zpengfebce7612017-06-07 14:29:04104 if (!icon_bitmap.drawsNothing())
mlamouric679bbf2014-09-24 21:24:49105 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap);
[email protected]51208252013-08-19 21:05:30106
pkotwicz206673142016-07-19 19:13:30107 // The callback will need to be run after shortcut creation completes in order
108 // to download the splash image and save it to the WebappDataStorage. Create a
109 // copy of the callback here and send the pointer to Java, which will send it
110 // back once the asynchronous shortcut creation process finishes.
111 uintptr_t callback_pointer =
112 reinterpret_cast<uintptr_t>(new base::Closure(splash_image_callback));
dominickn6509a4de2016-04-06 08:29:06113
zpenga7856eef2017-02-07 11:42:44114 Java_ShortcutHelper_addWebapp(
115 env, java_webapp_id, java_url, java_scope_url, java_user_title, java_name,
116 java_short_name, java_best_primary_icon_url, java_bitmap, info.display,
Daniel Cheng8fedab22018-05-17 00:39:27117 info.orientation, info.source,
118 OptionalSkColorToJavaColor(info.theme_color),
119 OptionalSkColorToJavaColor(info.background_color), java_splash_screen_url,
120 callback_pointer);
[email protected]51208252013-08-19 21:05:30121}
benwells840ae902015-02-17 21:13:28122
pkotwicz97478712017-03-01 03:39:54123// Adds a shortcut which opens in a browser tab to the launcher.
124void AddShortcutWithSkBitmap(const ShortcutInfo& info,
125 const std::string& id,
126 const SkBitmap& icon_bitmap) {
pkotwicz206673142016-07-19 19:13:30127 JNIEnv* env = base::android::AttachCurrentThread();
martiw12166f52017-02-20 03:05:45128 ScopedJavaLocalRef<jstring> java_id =
129 base::android::ConvertUTF8ToJavaString(env, id);
pkotwicz206673142016-07-19 19:13:30130 ScopedJavaLocalRef<jstring> java_url =
131 base::android::ConvertUTF8ToJavaString(env, info.url.spec());
132 ScopedJavaLocalRef<jstring> java_user_title =
133 base::android::ConvertUTF16ToJavaString(env, info.user_title);
134 ScopedJavaLocalRef<jobject> java_bitmap;
zpengfebce7612017-06-07 14:29:04135 if (!icon_bitmap.drawsNothing())
pkotwicz206673142016-07-19 19:13:30136 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap);
137
martiw12166f52017-02-20 03:05:45138 Java_ShortcutHelper_addShortcut(env, java_id, java_url, java_user_title,
139 java_bitmap, info.source);
pkotwicz206673142016-07-19 19:13:30140}
141
pkotwicz97478712017-03-01 03:39:54142} // anonymous namespace
143
144// static
Dominick Ng203b4932018-02-02 05:32:45145std::unique_ptr<ShortcutInfo> ShortcutHelper::CreateShortcutInfo(
146 const GURL& manifest_url,
Dmitry Gozman88ca5a992018-05-18 00:13:33147 const blink::Manifest& manifest,
Dominick Ng203b4932018-02-02 05:32:45148 const GURL& primary_icon_url,
149 const GURL& badge_icon_url) {
150 auto shortcut_info = std::make_unique<ShortcutInfo>(GURL());
151 if (!manifest.IsEmpty()) {
152 shortcut_info->UpdateFromManifest(manifest);
153 shortcut_info->manifest_url = manifest_url;
154 shortcut_info->best_primary_icon_url = primary_icon_url;
155 shortcut_info->best_badge_icon_url = badge_icon_url;
156 }
157
158 shortcut_info->ideal_splash_image_size_in_px = GetIdealSplashImageSizeInPx();
159 shortcut_info->minimum_splash_image_size_in_px =
160 GetMinimumSplashImageSizeInPx();
161 shortcut_info->splash_image_url =
Mugdha Lakhani62db8de2018-07-10 16:00:48162 blink::ManifestIconSelector::FindBestMatchingIcon(
Dominick Ng203b4932018-02-02 05:32:45163 manifest.icons, shortcut_info->ideal_splash_image_size_in_px,
164 shortcut_info->minimum_splash_image_size_in_px,
Rayan Kanso393cb2232018-06-06 09:34:05165 blink::Manifest::ImageResource::Purpose::ANY);
Dominick Ng203b4932018-02-02 05:32:45166
167 return shortcut_info;
168}
169
170// static
pkotwicz97478712017-03-01 03:39:54171void ShortcutHelper::AddToLauncherWithSkBitmap(
pkotwiczd0d459e2017-03-01 22:55:10172 content::WebContents* web_contents,
pkotwicz97478712017-03-01 03:39:54173 const ShortcutInfo& info,
pkotwiczd0d459e2017-03-01 22:55:10174 const SkBitmap& icon_bitmap) {
175 std::string webapp_id = base::GenerateGUID();
Blink Reformat1c4d759e2017-04-09 16:34:54176 if (info.display == blink::kWebDisplayModeStandalone ||
Piotr Swigon549c0432017-08-16 02:48:41177 info.display == blink::kWebDisplayModeFullscreen ||
Piotr Swigon57e79c5c2017-12-29 01:11:15178 info.display == blink::kWebDisplayModeMinimalUi) {
pkotwiczd0d459e2017-03-01 22:55:10179 AddWebappWithSkBitmap(
180 info, webapp_id, icon_bitmap,
181 base::Bind(&ShortcutHelper::FetchSplashScreenImage, web_contents,
182 info.splash_image_url, info.ideal_splash_image_size_in_px,
183 info.minimum_splash_image_size_in_px, webapp_id));
pkotwicz97478712017-03-01 03:39:54184 return;
185 }
186 AddShortcutWithSkBitmap(info, webapp_id, icon_bitmap);
187}
188
hanxi070d10a2017-01-09 15:56:50189void ShortcutHelper::ShowWebApkInstallInProgressToast() {
190 Java_ShortcutHelper_showWebApkInstallInProgressToast(
191 base::android::AttachCurrentThread());
192}
193
zpeng5d8fdfc2017-01-05 15:45:06194int ShortcutHelper::GetIdealHomescreenIconSizeInPx() {
zpenge33ba852017-02-01 20:54:42195 if (g_ideal_homescreen_icon_size == -1)
lalitm45a03c72015-09-16 13:00:43196 GetHomescreenIconAndSplashImageSizes();
zpenge33ba852017-02-01 20:54:42197 return g_ideal_homescreen_icon_size;
lalitm45a03c72015-09-16 13:00:43198}
199
zpeng5d8fdfc2017-01-05 15:45:06200int ShortcutHelper::GetMinimumHomescreenIconSizeInPx() {
zpenge33ba852017-02-01 20:54:42201 if (g_minimum_homescreen_icon_size == -1)
lalitm45a03c72015-09-16 13:00:43202 GetHomescreenIconAndSplashImageSizes();
zpenge33ba852017-02-01 20:54:42203 return g_minimum_homescreen_icon_size;
lalitm45a03c72015-09-16 13:00:43204}
205
zpeng5d8fdfc2017-01-05 15:45:06206int ShortcutHelper::GetIdealSplashImageSizeInPx() {
zpenge33ba852017-02-01 20:54:42207 if (g_ideal_splash_image_size == -1)
lalitm45a03c72015-09-16 13:00:43208 GetHomescreenIconAndSplashImageSizes();
zpenge33ba852017-02-01 20:54:42209 return g_ideal_splash_image_size;
lalitm45a03c72015-09-16 13:00:43210}
211
zpeng5d8fdfc2017-01-05 15:45:06212int ShortcutHelper::GetMinimumSplashImageSizeInPx() {
zpenge33ba852017-02-01 20:54:42213 if (g_minimum_splash_image_size == -1)
lalitm45a03c72015-09-16 13:00:43214 GetHomescreenIconAndSplashImageSizes();
zpenge33ba852017-02-01 20:54:42215 return g_minimum_splash_image_size;
216}
217
218int ShortcutHelper::GetIdealBadgeIconSizeInPx() {
219 if (g_ideal_badge_icon_size == -1)
220 GetHomescreenIconAndSplashImageSizes();
221 return g_ideal_badge_icon_size;
lalitm45a03c72015-09-16 13:00:43222}
223
lalitmd93c2ed2015-09-04 16:22:12224// static
225void ShortcutHelper::FetchSplashScreenImage(
226 content::WebContents* web_contents,
227 const GURL& image_url,
zpeng5d8fdfc2017-01-05 15:45:06228 const int ideal_splash_image_size_in_px,
229 const int minimum_splash_image_size_in_px,
dominickn6509a4de2016-04-06 08:29:06230 const std::string& webapp_id) {
lalitmd93c2ed2015-09-04 16:22:12231 // This is a fire and forget task. It is not vital for the splash screen image
232 // to be downloaded so if the downloader returns false there is no fallback.
jinho.bang84cadc82017-06-14 16:59:34233 content::ManifestIconDownloader::Download(
zpeng5d8fdfc2017-01-05 15:45:06234 web_contents, image_url, ideal_splash_image_size_in_px,
235 minimum_splash_image_size_in_px,
dominickn6509a4de2016-04-06 08:29:06236 base::Bind(&ShortcutHelper::StoreWebappSplashImage, webapp_id));
lalitmd93c2ed2015-09-04 16:22:12237}
238
239// static
zpenga7856eef2017-02-07 11:42:44240void ShortcutHelper::StoreWebappSplashImage(const std::string& webapp_id,
241 const SkBitmap& splash_image) {
lalitmd93c2ed2015-09-04 16:22:12242 if (splash_image.drawsNothing())
243 return;
244
245 JNIEnv* env = base::android::AttachCurrentThread();
246 ScopedJavaLocalRef<jstring> java_webapp_id =
247 base::android::ConvertUTF8ToJavaString(env, webapp_id);
248 ScopedJavaLocalRef<jobject> java_splash_image =
249 gfx::ConvertToJavaBitmap(&splash_image);
250
torne948f3662016-08-16 15:10:44251 Java_ShortcutHelper_storeWebappSplashImage(env, java_webapp_id,
252 java_splash_image);
lalitmd93c2ed2015-09-04 16:22:12253}
254
mlamouribc6e8792015-10-22 20:41:13255// static
pkotwicz5774087e2016-08-10 17:36:40256SkBitmap ShortcutHelper::FinalizeLauncherIconInBackground(
257 const SkBitmap& bitmap,
258 const GURL& url,
259 bool* is_generated) {
Etienne Pierre-doray4f2e41bed2018-09-24 22:10:11260 base::AssertLongCPUWorkAllowed();
mlamouribc6e8792015-10-22 20:41:13261
262 JNIEnv* env = base::android::AttachCurrentThread();
263 ScopedJavaLocalRef<jobject> result;
264 *is_generated = false;
265
266 if (!bitmap.isNull()) {
pkotwicz45fc42b62016-06-07 00:07:10267 if (Java_ShortcutHelper_isIconLargeEnoughForLauncher(env, bitmap.width(),
268 bitmap.height())) {
newta584b9e2015-10-29 22:29:43269 ScopedJavaLocalRef<jobject> java_bitmap =
270 gfx::ConvertToJavaBitmap(&bitmap);
torne948f3662016-08-16 15:10:44271 result =
272 Java_ShortcutHelper_createHomeScreenIconFromWebIcon(env, java_bitmap);
mlamouribc6e8792015-10-22 20:41:13273 }
274 }
275
276 if (result.is_null()) {
277 ScopedJavaLocalRef<jstring> java_url =
278 base::android::ConvertUTF8ToJavaString(env, url.spec());
zpenge33ba852017-02-01 20:54:42279 SkColor mean_color =
280 SkColorSetRGB(g_default_rgb_icon_value, g_default_rgb_icon_value,
281 g_default_rgb_icon_value);
mlamouribc6e8792015-10-22 20:41:13282
283 if (!bitmap.isNull())
284 mean_color = color_utils::CalculateKMeanColorOfBitmap(bitmap);
285
286 *is_generated = true;
newta584b9e2015-10-29 22:29:43287 result = Java_ShortcutHelper_generateHomeScreenIcon(
torne948f3662016-08-16 15:10:44288 env, java_url, SkColorGetR(mean_color), SkColorGetG(mean_color),
mlamouribc6e8792015-10-22 20:41:13289 SkColorGetB(mean_color));
290 }
291
pkotwicz964382b2016-08-04 01:24:55292 return result.obj()
torned64eb5132016-10-24 12:51:28293 ? gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(result))
pkotwicz964382b2016-08-04 01:24:55294 : SkBitmap();
mlamouribc6e8792015-10-22 20:41:13295}
296
pkotwiczcda82fe2016-07-08 18:56:54297// static
zpeng4bb58962016-10-04 02:42:29298std::string ShortcutHelper::QueryWebApkPackage(const GURL& url) {
299 JNIEnv* env = base::android::AttachCurrentThread();
300 ScopedJavaLocalRef<jstring> java_url =
301 base::android::ConvertUTF8ToJavaString(env, url.spec());
302 ScopedJavaLocalRef<jstring> java_webapk_package_name =
303 Java_ShortcutHelper_queryWebApkPackage(env, java_url);
304
305 std::string webapk_package_name = "";
306 if (java_webapk_package_name.obj()) {
zpenga7856eef2017-02-07 11:42:44307 webapk_package_name =
308 base::android::ConvertJavaStringToUTF8(env, java_webapk_package_name);
zpeng4bb58962016-10-04 02:42:29309 }
310 return webapk_package_name;
311}
312
313// static
zpenga7856eef2017-02-07 11:42:44314bool ShortcutHelper::IsWebApkInstalled(content::BrowserContext* browser_context,
315 const GURL& start_url,
316 const GURL& manifest_url) {
hanxi070d10a2017-01-09 15:56:50317 return !QueryWebApkPackage(start_url).empty() ||
zpenga7856eef2017-02-07 11:42:44318 WebApkInstallService::Get(browser_context)
319 ->IsInstallInProgress(manifest_url);
pkotwiczcda82fe2016-07-08 18:56:54320}
321
pkotwicz47136bc2016-08-06 23:55:39322GURL ShortcutHelper::GetScopeFromURL(const GURL& url) {
323 JNIEnv* env = base::android::AttachCurrentThread();
324 ScopedJavaLocalRef<jstring> java_url =
325 base::android::ConvertUTF8ToJavaString(env, url.spec());
326 ScopedJavaLocalRef<jstring> java_scope_url =
torne948f3662016-08-16 15:10:44327 Java_ShortcutHelper_getScopeFromUrl(env, java_url);
pkotwicz47136bc2016-08-06 23:55:39328 return GURL(base::android::ConvertJavaStringToUTF16(env, java_scope_url));
329}
330
gonzalon87192d772017-02-07 22:31:10331void ShortcutHelper::RetrieveWebApks(const WebApkInfoCallback& callback) {
332 uintptr_t callback_pointer =
333 reinterpret_cast<uintptr_t>(new WebApkInfoCallback(callback));
334 Java_ShortcutHelper_retrieveWebApks(base::android::AttachCurrentThread(),
335 callback_pointer);
336}
337
dominickn6509a4de2016-04-06 08:29:06338// Callback used by Java when the shortcut has been created.
339// |splash_image_callback| is a pointer to a base::Closure allocated in
pkotwiczc67e6ac2016-08-12 19:56:44340// AddShortcutWithSkBitmap, so reinterpret_cast it back and run it.
dominickn6509a4de2016-04-06 08:29:06341//
342// This callback should only ever be called when the shortcut was for a
343// webapp-capable site; otherwise, |splash_image_callback| will have never been
344// allocated and doesn't need to be run or deleted.
Daniel Bratell7aacf952017-11-21 17:51:25345void JNI_ShortcutHelper_OnWebappDataStored(JNIEnv* env,
346 const JavaParamRef<jclass>& clazz,
347 jlong jsplash_image_callback) {
dominickn6509a4de2016-04-06 08:29:06348 DCHECK(jsplash_image_callback);
349 base::Closure* splash_image_callback =
350 reinterpret_cast<base::Closure*>(jsplash_image_callback);
351 splash_image_callback->Run();
352 delete splash_image_callback;
353}
354
Daniel Bratell7aacf952017-11-21 17:51:25355void JNI_ShortcutHelper_OnWebApksRetrieved(
356 JNIEnv* env,
357 const JavaParamRef<jclass>& clazz,
358 const jlong jcallback_pointer,
359 const JavaParamRef<jobjectArray>& jnames,
360 const JavaParamRef<jobjectArray>& jshort_names,
361 const JavaParamRef<jobjectArray>& jpackage_names,
362 const JavaParamRef<jintArray>& jshell_apk_versions,
363 const JavaParamRef<jintArray>& jversion_codes,
364 const JavaParamRef<jobjectArray>& juris,
365 const JavaParamRef<jobjectArray>& jscopes,
366 const JavaParamRef<jobjectArray>& jmanifest_urls,
367 const JavaParamRef<jobjectArray>& jmanifest_start_urls,
368 const JavaParamRef<jintArray>& jdisplay_modes,
369 const JavaParamRef<jintArray>& jorientations,
370 const JavaParamRef<jlongArray>& jtheme_colors,
Peter Kotwicz9d0c67e2018-03-08 23:38:23371 const JavaParamRef<jlongArray>& jbackground_colors,
372 const JavaParamRef<jlongArray>& jlast_update_check_times_ms,
373 const JavaParamRef<jbooleanArray>& jrelax_updates) {
gonzalon87192d772017-02-07 22:31:10374 DCHECK(jcallback_pointer);
gonzalon85e975452017-03-03 23:58:42375 std::vector<std::string> names;
376 base::android::AppendJavaStringArrayToStringVector(env, jnames, &names);
gonzalon87192d772017-02-07 22:31:10377 std::vector<std::string> short_names;
378 base::android::AppendJavaStringArrayToStringVector(env, jshort_names,
379 &short_names);
380 std::vector<std::string> package_names;
381 base::android::AppendJavaStringArrayToStringVector(env, jpackage_names,
382 &package_names);
383 std::vector<int> shell_apk_versions;
384 base::android::JavaIntArrayToIntVector(env, jshell_apk_versions,
385 &shell_apk_versions);
386 std::vector<int> version_codes;
387 base::android::JavaIntArrayToIntVector(env, jversion_codes, &version_codes);
gonzalon85e975452017-03-03 23:58:42388 std::vector<std::string> uris;
389 base::android::AppendJavaStringArrayToStringVector(env, juris, &uris);
390 std::vector<std::string> scopes;
391 base::android::AppendJavaStringArrayToStringVector(env, jscopes, &scopes);
392 std::vector<std::string> manifest_urls;
393 base::android::AppendJavaStringArrayToStringVector(env, jmanifest_urls,
394 &manifest_urls);
395 std::vector<std::string> manifest_start_urls;
396 base::android::AppendJavaStringArrayToStringVector(env, jmanifest_start_urls,
397 &manifest_start_urls);
398 std::vector<int> display_modes;
399 base::android::JavaIntArrayToIntVector(env, jdisplay_modes, &display_modes);
400 std::vector<int> orientations;
401 base::android::JavaIntArrayToIntVector(env, jorientations, &orientations);
402 std::vector<int64_t> theme_colors;
403 base::android::JavaLongArrayToInt64Vector(env, jtheme_colors, &theme_colors);
404 std::vector<int64_t> background_colors;
405 base::android::JavaLongArrayToInt64Vector(env, jbackground_colors,
406 &background_colors);
Peter Kotwicz9d0c67e2018-03-08 23:38:23407 std::vector<int64_t> last_update_check_times_ms;
408 base::android::JavaLongArrayToInt64Vector(env, jlast_update_check_times_ms,
409 &last_update_check_times_ms);
410 std::vector<bool> relax_updates;
411 base::android::JavaBooleanArrayToBoolVector(env, jrelax_updates,
412 &relax_updates);
gonzalon87192d772017-02-07 22:31:10413
gonzalon85e975452017-03-03 23:58:42414 DCHECK(short_names.size() == names.size());
gonzalon87192d772017-02-07 22:31:10415 DCHECK(short_names.size() == package_names.size());
416 DCHECK(short_names.size() == shell_apk_versions.size());
417 DCHECK(short_names.size() == version_codes.size());
gonzalon85e975452017-03-03 23:58:42418 DCHECK(short_names.size() == uris.size());
419 DCHECK(short_names.size() == scopes.size());
420 DCHECK(short_names.size() == manifest_urls.size());
421 DCHECK(short_names.size() == manifest_start_urls.size());
422 DCHECK(short_names.size() == display_modes.size());
423 DCHECK(short_names.size() == orientations.size());
424 DCHECK(short_names.size() == theme_colors.size());
425 DCHECK(short_names.size() == background_colors.size());
Peter Kotwicz9d0c67e2018-03-08 23:38:23426 DCHECK(short_names.size() == last_update_check_times_ms.size());
427 DCHECK(short_names.size() == relax_updates.size());
gonzalon87192d772017-02-07 22:31:10428
429 std::vector<WebApkInfo> webapk_list;
430 webapk_list.reserve(short_names.size());
431 for (size_t i = 0; i < short_names.size(); ++i) {
gonzalon85e975452017-03-03 23:58:42432 webapk_list.push_back(WebApkInfo(
433 std::move(names[i]), std::move(short_names[i]),
434 std::move(package_names[i]), shell_apk_versions[i], version_codes[i],
435 std::move(uris[i]), std::move(scopes[i]), std::move(manifest_urls[i]),
436 std::move(manifest_start_urls[i]),
437 static_cast<blink::WebDisplayMode>(display_modes[i]),
438 static_cast<blink::WebScreenOrientationLockType>(orientations[i]),
Daniel Cheng8fedab22018-05-17 00:39:27439 JavaColorToOptionalSkColor(theme_colors[i]),
440 JavaColorToOptionalSkColor(background_colors[i]),
Peter Kotwicz9d0c67e2018-03-08 23:38:23441 base::Time::FromJavaTime(last_update_check_times_ms[i]),
442 relax_updates[i]));
gonzalon87192d772017-02-07 22:31:10443 }
444
445 ShortcutHelper::WebApkInfoCallback* webapk_list_callback =
446 reinterpret_cast<ShortcutHelper::WebApkInfoCallback*>(jcallback_pointer);
447 webapk_list_callback->Run(webapk_list);
448 delete webapk_list_callback;
449}