blob: d686e0dde982d4e51e1d2c2244199b23b99ca159 [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
Henry Jianf78dce62019-09-22 16:58:4110#include "base/android/build_info.h"
[email protected]51208252013-08-19 21:05:3011#include "base/android/jni_android.h"
lalitm45a03c72015-09-16 13:00:4312#include "base/android/jni_array.h"
[email protected]51208252013-08-19 21:05:3013#include "base/android/jni_string.h"
dominickn6509a4de2016-04-06 08:29:0614#include "base/bind.h"
15#include "base/callback.h"
pkotwiczd0d459e2017-03-01 22:55:1016#include "base/guid.h"
Daniel Cheng8fedab22018-05-17 00:39:2717#include "base/optional.h"
[email protected]51208252013-08-19 21:05:3018#include "base/strings/string16.h"
mlamouric679bbf2014-09-24 21:24:4919#include "base/strings/utf_string_conversions.h"
Etienne Pierre-doray4f2e41bed2018-09-24 22:10:1120#include "base/threading/thread_restrictions.h"
Andrew Grieve4a42c22e2019-06-24 16:14:2921#include "chrome/android/chrome_jni_headers/ShortcutHelper_jni.h"
dfalcantaraaec56da2015-05-06 03:33:5622#include "content/public/browser/browser_thread.h"
jinho.bang84cadc82017-06-14 16:59:3423#include "content/public/browser/manifest_icon_downloader.h"
[email protected]51208252013-08-19 21:05:3024#include "content/public/browser/web_contents.h"
Dmitry Gozman88ca5a992018-05-18 00:13:3325#include "third_party/blink/public/common/manifest/manifest.h"
Mugdha Lakhani62db8de2018-07-10 16:00:4826#include "third_party/blink/public/common/manifest/manifest_icon_selector.h"
Daniel Cheng8fedab22018-05-17 00:39:2727#include "third_party/skia/include/core/SkColor.h"
Evan Stade7f683b762020-11-18 01:22:2628#include "ui/android/color_helpers.h"
[email protected]51208252013-08-19 21:05:3029#include "ui/gfx/android/java_bitmap.h"
mlamouribc6e8792015-10-22 20:41:1330#include "ui/gfx/color_analysis.h"
[email protected]51208252013-08-19 21:05:3031#include "url/gurl.h"
32
torne86560112016-08-04 15:59:0433using base::android::JavaParamRef;
34using base::android::ScopedJavaLocalRef;
mlamouric679bbf2014-09-24 21:24:4935
lalitm45a03c72015-09-16 13:00:4336namespace {
37
zpenge33ba852017-02-01 20:54:4238int g_ideal_homescreen_icon_size = -1;
39int g_minimum_homescreen_icon_size = -1;
40int g_ideal_splash_image_size = -1;
41int g_minimum_splash_image_size = -1;
Glen Robertson41d3c0f2020-07-15 03:42:1542int g_ideal_monochrome_icon_size = -1;
Henry Jian96ec2512019-09-13 00:34:0943int g_ideal_adaptive_launcher_icon_size = -1;
Rayan Kanso3a2f4762020-01-28 13:34:1644int g_ideal_shortcut_icon_size = -1;
lalitm45a03c72015-09-16 13:00:4345
zpenge33ba852017-02-01 20:54:4246int g_default_rgb_icon_value = 145;
mlamouribc6e8792015-10-22 20:41:1347
Rayan Kanso3a2f4762020-01-28 13:34:1648// Retrieves and caches the ideal and minimum sizes of the Home screen icon,
49// the splash screen image, and the shortcut icons.
50void GetIconSizes() {
lalitm45a03c72015-09-16 13:00:4351 JNIEnv* env = base::android::AttachCurrentThread();
52 ScopedJavaLocalRef<jintArray> java_size_array =
Rayan Kanso3a2f4762020-01-28 13:34:1653 Java_ShortcutHelper_getIconSizes(env);
lalitm45a03c72015-09-16 13:00:4354 std::vector<int> sizes;
Torne (Richard Coles)3c22e8302018-10-12 18:34:2255 base::android::JavaIntArrayToIntVector(env, java_size_array, &sizes);
lalitm45a03c72015-09-16 13:00:4356
57 // Check that the size returned is what is expected.
Rayan Kanso3a2f4762020-01-28 13:34:1658 DCHECK_EQ(7u, sizes.size());
lalitm45a03c72015-09-16 13:00:4359
60 // This ordering must be kept up to date with the Java ShortcutHelper.
zpenge33ba852017-02-01 20:54:4261 g_ideal_homescreen_icon_size = sizes[0];
62 g_minimum_homescreen_icon_size = sizes[1];
63 g_ideal_splash_image_size = sizes[2];
64 g_minimum_splash_image_size = sizes[3];
Glen Robertson41d3c0f2020-07-15 03:42:1565 g_ideal_monochrome_icon_size = sizes[4];
Henry Jian96ec2512019-09-13 00:34:0966 g_ideal_adaptive_launcher_icon_size = sizes[5];
Rayan Kanso3a2f4762020-01-28 13:34:1667 g_ideal_shortcut_icon_size = sizes[6];
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.
Evan Stadee978d2c2020-11-12 17:52:5075void AddWebappWithSkBitmap(content::WebContents* web_contents,
76 const ShortcutInfo& info,
pkotwicz97478712017-03-01 03:39:5477 const std::string& webapp_id,
78 const SkBitmap& icon_bitmap,
Evan Stadee978d2c2020-11-12 17:52:5079 bool is_icon_maskable) {
[email protected]51208252013-08-19 21:05:3080 // Send the data to the Java side to create the shortcut.
81 JNIEnv* env = base::android::AttachCurrentThread();
lalitmd93c2ed2015-09-04 16:22:1282 ScopedJavaLocalRef<jstring> java_webapp_id =
83 base::android::ConvertUTF8ToJavaString(env, webapp_id);
[email protected]51208252013-08-19 21:05:3084 ScopedJavaLocalRef<jstring> java_url =
dfalcantara16e84de2015-02-03 22:07:4085 base::android::ConvertUTF8ToJavaString(env, info.url.spec());
pkotwicz6bdfbe1b2016-07-08 00:26:4386 ScopedJavaLocalRef<jstring> java_scope_url =
87 base::android::ConvertUTF8ToJavaString(env, info.scope.spec());
lalitmf3ee51852015-07-21 18:13:1188 ScopedJavaLocalRef<jstring> java_user_title =
89 base::android::ConvertUTF16ToJavaString(env, info.user_title);
90 ScopedJavaLocalRef<jstring> java_name =
91 base::android::ConvertUTF16ToJavaString(env, info.name);
92 ScopedJavaLocalRef<jstring> java_short_name =
93 base::android::ConvertUTF16ToJavaString(env, info.short_name);
zpenga7856eef2017-02-07 11:42:4494 ScopedJavaLocalRef<jstring> java_best_primary_icon_url =
95 base::android::ConvertUTF8ToJavaString(env,
96 info.best_primary_icon_url.spec());
[email protected]51208252013-08-19 21:05:3097 ScopedJavaLocalRef<jobject> java_bitmap;
zpengfebce7612017-06-07 14:29:0498 if (!icon_bitmap.drawsNothing())
danakj5cc14ce2020-11-10 22:00:4099 java_bitmap = gfx::ConvertToJavaBitmap(icon_bitmap);
[email protected]51208252013-08-19 21:05:30100
zpenga7856eef2017-02-07 11:42:44101 Java_ShortcutHelper_addWebapp(
102 env, java_webapp_id, java_url, java_scope_url, java_user_title, java_name,
Peter E Connb955ae4a2018-12-03 13:02:09103 java_short_name, java_best_primary_icon_url, java_bitmap,
Dave Tapuska36eb28d2020-07-14 20:59:06104 is_icon_maskable, static_cast<int>(info.display),
105 static_cast<int>(info.orientation), info.source,
Evan Stade7f683b762020-11-18 01:22:26106 ui::OptionalSkColorToJavaColor(info.theme_color),
107 ui::OptionalSkColorToJavaColor(info.background_color));
Evan Stadee978d2c2020-11-12 17:52:50108
109 // Start downloading the splash image in parallel with the app install.
110 content::ManifestIconDownloader::Download(
111 web_contents, info.splash_image_url, info.ideal_splash_image_size_in_px,
112 info.minimum_splash_image_size_in_px,
113 base::BindOnce(&ShortcutHelper::StoreWebappSplashImage, webapp_id));
[email protected]51208252013-08-19 21:05:30114}
benwells840ae902015-02-17 21:13:28115
pkotwicz97478712017-03-01 03:39:54116// Adds a shortcut which opens in a browser tab to the launcher.
Evan Stadee978d2c2020-11-12 17:52:50117void AddShortcutWithSkBitmap(const ShortcutInfo& info,
pkotwicz97478712017-03-01 03:39:54118 const std::string& id,
Peter E Connb955ae4a2018-12-03 13:02:09119 const SkBitmap& icon_bitmap,
120 bool is_icon_maskable) {
pkotwicz206673142016-07-19 19:13:30121 JNIEnv* env = base::android::AttachCurrentThread();
martiw12166f52017-02-20 03:05:45122 ScopedJavaLocalRef<jstring> java_id =
123 base::android::ConvertUTF8ToJavaString(env, id);
pkotwicz206673142016-07-19 19:13:30124 ScopedJavaLocalRef<jstring> java_url =
125 base::android::ConvertUTF8ToJavaString(env, info.url.spec());
126 ScopedJavaLocalRef<jstring> java_user_title =
127 base::android::ConvertUTF16ToJavaString(env, info.user_title);
Michael Thiessene01199c942019-06-25 16:32:53128 ScopedJavaLocalRef<jstring> java_best_primary_icon_url =
129 base::android::ConvertUTF8ToJavaString(env,
130 info.best_primary_icon_url.spec());
pkotwicz206673142016-07-19 19:13:30131 ScopedJavaLocalRef<jobject> java_bitmap;
zpengfebce7612017-06-07 14:29:04132 if (!icon_bitmap.drawsNothing())
danakj5cc14ce2020-11-10 22:00:40133 java_bitmap = gfx::ConvertToJavaBitmap(icon_bitmap);
Evan Staded7392a792020-07-16 20:59:21134 Java_ShortcutHelper_addShortcut(env, java_id, java_url, java_user_title,
Michael Thiessene01199c942019-06-25 16:32:53135 java_bitmap, is_icon_maskable, info.source,
136 java_best_primary_icon_url);
pkotwicz206673142016-07-19 19:13:30137}
138
pkotwicz97478712017-03-01 03:39:54139} // anonymous namespace
140
141// static
Dominick Ng203b4932018-02-02 05:32:45142std::unique_ptr<ShortcutInfo> ShortcutHelper::CreateShortcutInfo(
143 const GURL& manifest_url,
Dmitry Gozman88ca5a992018-05-18 00:13:33144 const blink::Manifest& manifest,
Ella Geefae3e002020-02-25 00:53:45145 const GURL& primary_icon_url) {
Dominick Ng203b4932018-02-02 05:32:45146 auto shortcut_info = std::make_unique<ShortcutInfo>(GURL());
147 if (!manifest.IsEmpty()) {
148 shortcut_info->UpdateFromManifest(manifest);
149 shortcut_info->manifest_url = manifest_url;
150 shortcut_info->best_primary_icon_url = primary_icon_url;
Dominick Ng203b4932018-02-02 05:32:45151 }
152
153 shortcut_info->ideal_splash_image_size_in_px = GetIdealSplashImageSizeInPx();
154 shortcut_info->minimum_splash_image_size_in_px =
155 GetMinimumSplashImageSizeInPx();
156 shortcut_info->splash_image_url =
Sahel Sharifyc067b74f2019-04-17 23:19:07157 blink::ManifestIconSelector::FindBestMatchingSquareIcon(
Dominick Ng203b4932018-02-02 05:32:45158 manifest.icons, shortcut_info->ideal_splash_image_size_in_px,
159 shortcut_info->minimum_splash_image_size_in_px,
Gyuyoung Kim361bbfe2020-10-28 00:21:10160 blink::mojom::ManifestImageResource_Purpose::ANY);
Dominick Ng203b4932018-02-02 05:32:45161
162 return shortcut_info;
163}
164
165// static
pkotwicz97478712017-03-01 03:39:54166void ShortcutHelper::AddToLauncherWithSkBitmap(
pkotwiczd0d459e2017-03-01 22:55:10167 content::WebContents* web_contents,
pkotwicz97478712017-03-01 03:39:54168 const ShortcutInfo& info,
Peter E Connb955ae4a2018-12-03 13:02:09169 const SkBitmap& icon_bitmap,
170 bool is_icon_maskable) {
pkotwiczd0d459e2017-03-01 22:55:10171 std::string webapp_id = base::GenerateGUID();
Eric Willigers052f0432019-10-04 04:06:57172 if (info.display == blink::mojom::DisplayMode::kStandalone ||
173 info.display == blink::mojom::DisplayMode::kFullscreen ||
174 info.display == blink::mojom::DisplayMode::kMinimalUi) {
Evan Stadee978d2c2020-11-12 17:52:50175 AddWebappWithSkBitmap(web_contents, info, webapp_id, icon_bitmap,
176 is_icon_maskable);
pkotwicz97478712017-03-01 03:39:54177 return;
178 }
Evan Stadee978d2c2020-11-12 17:52:50179 AddShortcutWithSkBitmap(info, webapp_id, icon_bitmap, is_icon_maskable);
pkotwicz97478712017-03-01 03:39:54180}
181
hanxi070d10a2017-01-09 15:56:50182void ShortcutHelper::ShowWebApkInstallInProgressToast() {
183 Java_ShortcutHelper_showWebApkInstallInProgressToast(
184 base::android::AttachCurrentThread());
185}
186
zpeng5d8fdfc2017-01-05 15:45:06187int ShortcutHelper::GetIdealHomescreenIconSizeInPx() {
zpenge33ba852017-02-01 20:54:42188 if (g_ideal_homescreen_icon_size == -1)
Rayan Kanso3a2f4762020-01-28 13:34:16189 GetIconSizes();
zpenge33ba852017-02-01 20:54:42190 return g_ideal_homescreen_icon_size;
lalitm45a03c72015-09-16 13:00:43191}
192
zpeng5d8fdfc2017-01-05 15:45:06193int ShortcutHelper::GetMinimumHomescreenIconSizeInPx() {
zpenge33ba852017-02-01 20:54:42194 if (g_minimum_homescreen_icon_size == -1)
Rayan Kanso3a2f4762020-01-28 13:34:16195 GetIconSizes();
zpenge33ba852017-02-01 20:54:42196 return g_minimum_homescreen_icon_size;
lalitm45a03c72015-09-16 13:00:43197}
198
zpeng5d8fdfc2017-01-05 15:45:06199int ShortcutHelper::GetIdealSplashImageSizeInPx() {
zpenge33ba852017-02-01 20:54:42200 if (g_ideal_splash_image_size == -1)
Rayan Kanso3a2f4762020-01-28 13:34:16201 GetIconSizes();
zpenge33ba852017-02-01 20:54:42202 return g_ideal_splash_image_size;
lalitm45a03c72015-09-16 13:00:43203}
204
zpeng5d8fdfc2017-01-05 15:45:06205int ShortcutHelper::GetMinimumSplashImageSizeInPx() {
zpenge33ba852017-02-01 20:54:42206 if (g_minimum_splash_image_size == -1)
Rayan Kanso3a2f4762020-01-28 13:34:16207 GetIconSizes();
zpenge33ba852017-02-01 20:54:42208 return g_minimum_splash_image_size;
209}
210
Henry Jian96ec2512019-09-13 00:34:09211int ShortcutHelper::GetIdealAdaptiveLauncherIconSizeInPx() {
212 if (g_ideal_adaptive_launcher_icon_size == -1)
Rayan Kanso3a2f4762020-01-28 13:34:16213 GetIconSizes();
Henry Jian96ec2512019-09-13 00:34:09214 return g_ideal_adaptive_launcher_icon_size;
215}
216
Rayan Kanso3a2f4762020-01-28 13:34:16217int ShortcutHelper::GetIdealShortcutIconSizeInPx() {
218 if (g_ideal_shortcut_icon_size == -1)
219 GetIconSizes();
220 return g_ideal_shortcut_icon_size;
221}
222
lalitmd93c2ed2015-09-04 16:22:12223// static
zpenga7856eef2017-02-07 11:42:44224void ShortcutHelper::StoreWebappSplashImage(const std::string& webapp_id,
225 const SkBitmap& splash_image) {
lalitmd93c2ed2015-09-04 16:22:12226 if (splash_image.drawsNothing())
227 return;
228
229 JNIEnv* env = base::android::AttachCurrentThread();
230 ScopedJavaLocalRef<jstring> java_webapp_id =
231 base::android::ConvertUTF8ToJavaString(env, webapp_id);
232 ScopedJavaLocalRef<jobject> java_splash_image =
danakj5cc14ce2020-11-10 22:00:40233 gfx::ConvertToJavaBitmap(splash_image);
lalitmd93c2ed2015-09-04 16:22:12234
torne948f3662016-08-16 15:10:44235 Java_ShortcutHelper_storeWebappSplashImage(env, java_webapp_id,
236 java_splash_image);
lalitmd93c2ed2015-09-04 16:22:12237}
238
mlamouribc6e8792015-10-22 20:41:13239// static
pkotwicz5774087e2016-08-10 17:36:40240SkBitmap ShortcutHelper::FinalizeLauncherIconInBackground(
241 const SkBitmap& bitmap,
Peter E Connb955ae4a2018-12-03 13:02:09242 bool is_icon_maskable,
pkotwicz5774087e2016-08-10 17:36:40243 const GURL& url,
244 bool* is_generated) {
Etienne Pierre-doray4f2e41bed2018-09-24 22:10:11245 base::AssertLongCPUWorkAllowed();
mlamouribc6e8792015-10-22 20:41:13246
247 JNIEnv* env = base::android::AttachCurrentThread();
248 ScopedJavaLocalRef<jobject> result;
249 *is_generated = false;
250
251 if (!bitmap.isNull()) {
pkotwicz45fc42b62016-06-07 00:07:10252 if (Java_ShortcutHelper_isIconLargeEnoughForLauncher(env, bitmap.width(),
253 bitmap.height())) {
newta584b9e2015-10-29 22:29:43254 ScopedJavaLocalRef<jobject> java_bitmap =
danakj5cc14ce2020-11-10 22:00:40255 gfx::ConvertToJavaBitmap(bitmap);
Peter E Connb955ae4a2018-12-03 13:02:09256 result = Java_ShortcutHelper_createHomeScreenIconFromWebIcon(
257 env, java_bitmap, is_icon_maskable);
mlamouribc6e8792015-10-22 20:41:13258 }
259 }
260
261 if (result.is_null()) {
262 ScopedJavaLocalRef<jstring> java_url =
263 base::android::ConvertUTF8ToJavaString(env, url.spec());
zpenge33ba852017-02-01 20:54:42264 SkColor mean_color =
265 SkColorSetRGB(g_default_rgb_icon_value, g_default_rgb_icon_value,
266 g_default_rgb_icon_value);
mlamouribc6e8792015-10-22 20:41:13267
268 if (!bitmap.isNull())
269 mean_color = color_utils::CalculateKMeanColorOfBitmap(bitmap);
270
271 *is_generated = true;
newta584b9e2015-10-29 22:29:43272 result = Java_ShortcutHelper_generateHomeScreenIcon(
torne948f3662016-08-16 15:10:44273 env, java_url, SkColorGetR(mean_color), SkColorGetG(mean_color),
mlamouribc6e8792015-10-22 20:41:13274 SkColorGetB(mean_color));
275 }
276
pkotwicz964382b2016-08-04 01:24:55277 return result.obj()
torned64eb5132016-10-24 12:51:28278 ? gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(result))
pkotwicz964382b2016-08-04 01:24:55279 : SkBitmap();
mlamouribc6e8792015-10-22 20:41:13280}
281
pkotwiczcda82fe2016-07-08 18:56:54282// static
Peter Kotwicz4b358c162019-01-03 01:10:58283std::string ShortcutHelper::QueryFirstWebApkPackage(const GURL& url) {
zpeng4bb58962016-10-04 02:42:29284 JNIEnv* env = base::android::AttachCurrentThread();
285 ScopedJavaLocalRef<jstring> java_url =
286 base::android::ConvertUTF8ToJavaString(env, url.spec());
287 ScopedJavaLocalRef<jstring> java_webapk_package_name =
Peter Kotwicz4b358c162019-01-03 01:10:58288 Java_ShortcutHelper_queryFirstWebApkPackage(env, java_url);
zpeng4bb58962016-10-04 02:42:29289
Lei Zhang9b0be802020-05-05 21:11:48290 std::string webapk_package_name;
zpeng4bb58962016-10-04 02:42:29291 if (java_webapk_package_name.obj()) {
zpenga7856eef2017-02-07 11:42:44292 webapk_package_name =
293 base::android::ConvertJavaStringToUTF8(env, java_webapk_package_name);
zpeng4bb58962016-10-04 02:42:29294 }
295 return webapk_package_name;
296}
297
298// static
zpenga7856eef2017-02-07 11:42:44299bool ShortcutHelper::IsWebApkInstalled(content::BrowserContext* browser_context,
Dominick Ngb1c047e72020-05-04 00:41:10300 const GURL& url) {
301 return !QueryFirstWebApkPackage(url).empty();
Dominick Ngc8244822020-04-29 06:22:30302}
303
304// static
305bool ShortcutHelper::DoesOriginContainAnyInstalledWebApk(const GURL& origin) {
306 DCHECK_EQ(origin, origin.GetOrigin());
307 JNIEnv* env = base::android::AttachCurrentThread();
308 base::android::ScopedJavaLocalRef<jstring> java_origin =
309 base::android::ConvertUTF8ToJavaString(env, origin.spec());
310 return Java_ShortcutHelper_doesOriginContainAnyInstalledWebApk(env,
311 java_origin);
312}
313
314bool ShortcutHelper::DoesOriginContainAnyInstalledTrustedWebActivity(
315 const GURL& origin) {
316 DCHECK_EQ(origin, origin.GetOrigin());
317 JNIEnv* env = base::android::AttachCurrentThread();
318 base::android::ScopedJavaLocalRef<jstring> java_origin =
319 base::android::ConvertUTF8ToJavaString(env, origin.spec());
320 return Java_ShortcutHelper_doesOriginContainAnyInstalledTwa(env, java_origin);
pkotwiczcda82fe2016-07-08 18:56:54321}
322
Jarryd583dc4d2020-06-11 20:31:34323std::set<GURL> ShortcutHelper::GetOriginsWithInstalledWebApksOrTwas() {
324 std::set<GURL> installed_origins;
325 JNIEnv* env = base::android::AttachCurrentThread();
326
327 base::android::ScopedJavaLocalRef<jobjectArray> j_installed_origins =
328 Java_ShortcutHelper_getOriginsWithInstalledWebApksOrTwas(env);
329
330 if (j_installed_origins) {
331 std::vector<std::string> installed_origins_list;
332 base::android::AppendJavaStringArrayToStringVector(env, j_installed_origins,
333 &installed_origins_list);
334 for (auto& origin : installed_origins_list)
335 installed_origins.emplace(GURL(origin));
336 }
337 return installed_origins;
338}
339
ckitagawa1fa69c02019-07-24 19:20:44340void ShortcutHelper::SetForceWebApkUpdate(const std::string& id) {
341 JNIEnv* env = base::android::AttachCurrentThread();
342 Java_ShortcutHelper_setForceWebApkUpdate(
343 env, base::android::ConvertUTF8ToJavaString(env, id));
gonzalon87192d772017-02-07 22:31:10344}
345
Henry Jianf78dce62019-09-22 16:58:41346// static
347bool ShortcutHelper::DoesAndroidSupportMaskableIcons() {
Evan Staded4933502020-11-17 18:14:45348 return base::android::BuildInfo::GetInstance()->sdk_int() >=
349 base::android::SDK_VERSION_OREO;
Henry Jianf78dce62019-09-22 16:58:41350}
351
Rayan Kanso3a2f4762020-01-28 13:34:16352// static
353void ShortcutHelper::SetIdealShortcutSizeForTesting(int size) {
354 g_ideal_shortcut_icon_size = size;
355}