Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(302)

Side by Side Diff: chrome/browser/android/banners/app_banner_manager_android.cc

Issue 2290603005: Trigger app banner when add to homescreen is pressed and WebAPKs are enabled. (Closed)
Patch Set: Try to fix test failures Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 <utility> 5 #include <utility>
6 6
7 #include "chrome/browser/android/banners/app_banner_manager_android.h" 7 #include "chrome/browser/android/banners/app_banner_manager_android.h"
8 8
9 #include "base/android/jni_android.h" 9 #include "base/android/jni_android.h"
10 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #include "chrome/browser/android/banners/app_banner_infobar_delegate_android.h" 13 #include "chrome/browser/android/banners/app_banner_infobar_delegate_android.h"
14 #include "chrome/browser/android/shortcut_helper.h" 14 #include "chrome/browser/android/shortcut_helper.h"
15 #include "chrome/browser/android/webapk/chrome_webapk_host.h" 15 #include "chrome/browser/android/webapk/chrome_webapk_host.h"
16 #include "chrome/browser/android/webapk/webapk_web_manifest_checker.h" 16 #include "chrome/browser/android/webapk/webapk_web_manifest_checker.h"
17 #include "chrome/browser/banners/app_banner_metrics.h" 17 #include "chrome/browser/banners/app_banner_metrics.h"
18 #include "chrome/browser/infobars/infobar_service.h"
19 #include "chrome/browser/manifest/manifest_icon_downloader.h" 18 #include "chrome/browser/manifest/manifest_icon_downloader.h"
20 #include "chrome/browser/manifest/manifest_icon_selector.h" 19 #include "chrome/browser/manifest/manifest_icon_selector.h"
21 #include "chrome/browser/ui/android/infobars/app_banner_infobar_android.h"
22 #include "chrome/common/chrome_constants.h" 20 #include "chrome/common/chrome_constants.h"
23 #include "content/public/browser/web_contents.h" 21 #include "content/public/browser/web_contents.h"
24 #include "content/public/common/frame_navigate_params.h" 22 #include "content/public/common/frame_navigate_params.h"
25 #include "jni/AppBannerManager_jni.h" 23 #include "jni/AppBannerManager_jni.h"
26 #include "third_party/skia/include/core/SkBitmap.h" 24 #include "third_party/skia/include/core/SkBitmap.h"
27 25
28 using base::android::ConvertJavaStringToUTF8; 26 using base::android::ConvertJavaStringToUTF8;
29 using base::android::ConvertJavaStringToUTF16; 27 using base::android::ConvertJavaStringToUTF16;
30 using base::android::ConvertUTF8ToJavaString; 28 using base::android::ConvertUTF8ToJavaString;
31 using base::android::JavaParamRef; 29 using base::android::JavaParamRef;
32 using base::android::ScopedJavaLocalRef; 30 using base::android::ScopedJavaLocalRef;
Peter Kasting 2016/09/08 04:56:58 Nit: See earlier nit on using directives.
Xi Han 2016/09/08 15:49:10 Acknowledged.
33 31
34 DEFINE_WEB_CONTENTS_USER_DATA_KEY(banners::AppBannerManagerAndroid); 32 DEFINE_WEB_CONTENTS_USER_DATA_KEY(banners::AppBannerManagerAndroid);
35 33
36 namespace { 34 namespace {
37 35
38 const char kPlayPlatform[] = "play"; 36 const char kPlayPlatform[] = "play";
39 const char kReferrerName[] = "referrer"; 37 const char kReferrerName[] = "referrer";
40 const char kIdName[] = "id"; 38 const char kIdName[] = "id";
41 const char kPlayInlineReferrer[] = "playinline=chrome_inline"; 39 const char kPlayInlineReferrer[] = "playinline=chrome_inline";
Peter Kasting 2016/09/08 04:56:58 Nit: Each of these temps is used in only one funct
Xi Han 2016/09/08 15:49:10 Personally I would prefer to declare them at the b
Peter Kasting 2016/09/08 20:57:05 Twice yes, but in adjacent statements in the same
42 40
41 std::unique_ptr<ShortcutInfo> CreateShortcutInfo(
42 const GURL& manifest_url,
43 const content::Manifest& manifest,
44 const GURL& icon_url) {
45 std::unique_ptr<ShortcutInfo> shortcut_info(new ShortcutInfo(GURL()));
Peter Kasting 2016/09/08 04:56:58 Nit: Prefer "= base::MakeUnique<ShortcutInfo>(GURL
Xi Han 2016/09/08 15:49:10 Done.
46 if (!manifest.IsEmpty()) {
47 shortcut_info->UpdateFromManifest(manifest);
48 shortcut_info->manifest_url = manifest_url;
49 shortcut_info->icon_url = icon_url;
50 shortcut_info->UpdateSource(ShortcutInfo::SOURCE_APP_BANNER);
51 }
52 return shortcut_info;
53 }
54
43 } // anonymous namespace 55 } // anonymous namespace
44 56
45 namespace banners { 57 namespace banners {
46 58
47 AppBannerManagerAndroid::AppBannerManagerAndroid( 59 AppBannerManagerAndroid::AppBannerManagerAndroid(
48 content::WebContents* web_contents) 60 content::WebContents* web_contents)
49 : AppBannerManager(web_contents) { 61 : AppBannerManager(web_contents) {
50 CreateJavaBannerManager(); 62 CreateJavaBannerManager();
51 } 63 }
52 64
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 return; 190 return;
179 191
180 icon_.reset(new SkBitmap(bitmap)); 192 icon_.reset(new SkBitmap(bitmap));
181 SendBannerPromptRequest(); 193 SendBannerPromptRequest();
182 } 194 }
183 195
184 void AppBannerManagerAndroid::ShowBanner() { 196 void AppBannerManagerAndroid::ShowBanner() {
185 content::WebContents* contents = web_contents(); 197 content::WebContents* contents = web_contents();
186 DCHECK(contents); 198 DCHECK(contents);
187 199
188 infobars::InfoBar* infobar = nullptr;
189 if (native_app_data_.is_null()) { 200 if (native_app_data_.is_null()) {
190 bool is_webapk = ChromeWebApkHost::AreWebApkEnabled(); 201 bool is_webapk = ChromeWebApkHost::AreWebApkEnabled();
Peter Kasting 2016/09/08 04:56:58 Nit: Just inline below
Xi Han 2016/09/08 15:49:10 Done.
191 std::unique_ptr<AppBannerInfoBarDelegateAndroid> delegate( 202 if (AppBannerInfoBarDelegateAndroid::Create(
192 new AppBannerInfoBarDelegateAndroid( 203 contents, GetWeakPtr(), app_title_,
193 GetWeakPtr(), app_title_, manifest_url_, manifest_, icon_url_, 204 CreateShortcutInfo(manifest_url_, manifest_, icon_url_),
194 std::move(icon_), event_request_id(), is_webapk)); 205 std::move(icon_), event_request_id(), is_webapk,
195 206 false /* start_install_webapk*/)) {
Peter Kasting 2016/09/08 04:56:58 Nit: Need space before */ (or just remove the comm
Xi Han 2016/09/08 15:49:10 Done.
196 infobar = new AppBannerInfoBarAndroid(
197 std::move(delegate), manifest_.start_url, is_webapk);
198 if (infobar) {
199 RecordDidShowBanner("AppBanner.WebApp.Shown"); 207 RecordDidShowBanner("AppBanner.WebApp.Shown");
200 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED); 208 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED);
201 ReportStatus(contents, SHOWING_WEB_APP_BANNER); 209 ReportStatus(contents, SHOWING_WEB_APP_BANNER);
202 } else { 210 } else {
203 ReportStatus(contents, FAILED_TO_CREATE_BANNER); 211 ReportStatus(contents, FAILED_TO_CREATE_BANNER);
204 } 212 }
205 } else { 213 } else {
206 std::unique_ptr<AppBannerInfoBarDelegateAndroid> delegate( 214 if (AppBannerInfoBarDelegateAndroid::Create(
207 new AppBannerInfoBarDelegateAndroid( 215 contents, app_title_, native_app_data_, std::move(icon_),
208 app_title_, native_app_data_, std::move(icon_), native_app_package_, 216 native_app_package_, referrer_, event_request_id())) {
209 referrer_, event_request_id()));
210 infobar =
211 new AppBannerInfoBarAndroid(std::move(delegate), native_app_data_);
212 if (infobar) {
213 RecordDidShowBanner("AppBanner.NativeApp.Shown"); 217 RecordDidShowBanner("AppBanner.NativeApp.Shown");
214 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED); 218 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED);
215 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER); 219 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER);
216 } else { 220 } else {
217 ReportStatus(contents, FAILED_TO_CREATE_BANNER); 221 ReportStatus(contents, FAILED_TO_CREATE_BANNER);
218 } 222 }
219 } 223 }
220
221 if (infobar) {
222 InfoBarService::FromWebContents(contents)->AddInfoBar(
223 base::WrapUnique(infobar));
224 }
225 } 224 }
226 225
227 bool AppBannerManagerAndroid::CanHandleNonWebApp(const std::string& platform, 226 bool AppBannerManagerAndroid::CanHandleNonWebApp(const std::string& platform,
228 const GURL& url, 227 const GURL& url,
229 const std::string& id) { 228 const std::string& id) {
230 if (!CheckPlatformAndId(platform, id)) 229 if (!CheckPlatformAndId(platform, id))
231 return false; 230 return false;
232 231
233 banners::TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_REQUESTED); 232 banners::TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_REQUESTED);
234 233
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, 270 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform,
272 const std::string& id) { 271 const std::string& id) {
273 if (platform != kPlayPlatform) { 272 if (platform != kPlayPlatform) {
274 ReportStatus(web_contents(), PLATFORM_NOT_SUPPORTED_ON_ANDROID); 273 ReportStatus(web_contents(), PLATFORM_NOT_SUPPORTED_ON_ANDROID);
275 return false; 274 return false;
276 } 275 }
277 if (id.empty()) { 276 if (id.empty()) {
278 ReportStatus(web_contents(), NO_ID_SPECIFIED); 277 ReportStatus(web_contents(), NO_ID_SPECIFIED);
279 return false; 278 return false;
280 } 279 }
281 return true; 280 return true;
Peter Kasting 2016/09/08 04:56:58 Nit: Shorter: const bool correct_platform = (pl
Xi Han 2016/09/08 15:49:10 Done.
282 } 281 }
283 282
284 std::string AppBannerManagerAndroid::ExtractQueryValueForName( 283 std::string AppBannerManagerAndroid::ExtractQueryValueForName(
285 const GURL& url, 284 const GURL& url,
286 const std::string& name) { 285 const std::string& name) {
287 url::Component query = url.parsed_for_possibly_invalid_spec().query; 286 url::Component query = url.parsed_for_possibly_invalid_spec().query;
288 url::Component key, value; 287 url::Component key, value;
289 const char* url_spec = url.spec().c_str(); 288 const char* url_spec = url.spec().c_str();
290 289
291 while (url::ExtractQueryKeyValue(url_spec, &query, &key, &value)) { 290 while (url::ExtractQueryKeyValue(url_spec, &query, &key, &value)) {
292 std::string key_str(url_spec, key.begin, key.len); 291 std::string key_str(url_spec, key.begin, key.len);
293 std::string value_str(url_spec, value.begin, value.len); 292 std::string value_str(url_spec, value.begin, value.len);
294 if (key_str == name) 293 if (key_str == name)
295 return value_str; 294 return value_str;
Peter Kasting 2016/09/08 04:56:58 Nit: Shorter, more readable, and more efficient:
Xi Han 2016/09/08 15:49:10 Done.
296 } 295 }
297 return ""; 296 return "";
Peter Kasting 2016/09/08 04:56:58 Nit: "" -> std::string()
Xi Han 2016/09/08 15:49:10 Done.
298 } 297 }
299 298
300 // static 299 // static
301 bool AppBannerManagerAndroid::Register(JNIEnv* env) { 300 bool AppBannerManagerAndroid::Register(JNIEnv* env) {
302 return RegisterNativesImpl(env); 301 return RegisterNativesImpl(env);
303 } 302 }
304 303
305 // static 304 // static
306 ScopedJavaLocalRef<jobject> GetJavaBannerManagerForWebContents( 305 ScopedJavaLocalRef<jobject> GetJavaBannerManagerForWebContents(
307 JNIEnv* env, 306 JNIEnv* env,
308 const JavaParamRef<jclass>& clazz, 307 const JavaParamRef<jclass>& clazz,
309 const JavaParamRef<jobject>& java_web_contents) { 308 const JavaParamRef<jobject>& java_web_contents) {
310 AppBannerManagerAndroid* manager = AppBannerManagerAndroid::FromWebContents( 309 AppBannerManagerAndroid* manager = AppBannerManagerAndroid::FromWebContents(
311 content::WebContents::FromJavaWebContents(java_web_contents)); 310 content::WebContents::FromJavaWebContents(java_web_contents));
312 if (!manager) 311 if (!manager)
313 return ScopedJavaLocalRef<jobject>(); 312 return ScopedJavaLocalRef<jobject>();
314 313
315 return ScopedJavaLocalRef<jobject>(manager->GetJavaBannerManager()); 314 return ScopedJavaLocalRef<jobject>(manager->GetJavaBannerManager());
Peter Kasting 2016/09/08 04:56:58 Nit: Seems like this could be: return manager ?
Xi Han 2016/09/08 15:49:10 Done.
316 } 315 }
317 316
318 // static 317 // static
319 void DisableSecureSchemeCheckForTesting(JNIEnv* env, 318 void DisableSecureSchemeCheckForTesting(JNIEnv* env,
320 const JavaParamRef<jclass>& clazz) { 319 const JavaParamRef<jclass>& clazz) {
321 AppBannerManager::DisableSecureSchemeCheckForTesting(); 320 AppBannerManager::DisableSecureSchemeCheckForTesting();
322 } 321 }
323 322
324 // static 323 // static
325 void SetEngagementWeights(JNIEnv* env, 324 void SetEngagementWeights(JNIEnv* env,
326 const JavaParamRef<jclass>& clazz, 325 const JavaParamRef<jclass>& clazz,
327 jdouble direct_engagement, 326 jdouble direct_engagement,
328 jdouble indirect_engagement) { 327 jdouble indirect_engagement) {
329 AppBannerManager::SetEngagementWeights(direct_engagement, 328 AppBannerManager::SetEngagementWeights(direct_engagement,
330 indirect_engagement); 329 indirect_engagement);
331 } 330 }
332 331
333 // static 332 // static
334 void SetTimeDeltaForTesting(JNIEnv* env, 333 void SetTimeDeltaForTesting(JNIEnv* env,
335 const JavaParamRef<jclass>& clazz, 334 const JavaParamRef<jclass>& clazz,
336 jint days) { 335 jint days) {
337 AppBannerManager::SetTimeDeltaForTesting(days); 336 AppBannerManager::SetTimeDeltaForTesting(days);
338 } 337 }
339 338
340 } // namespace banners 339 } // namespace banners
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698