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

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: Clean ups 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"
24 #include "net/base/url_util.h"
26 #include "third_party/skia/include/core/SkBitmap.h" 25 #include "third_party/skia/include/core/SkBitmap.h"
27 26
28 using base::android::ConvertJavaStringToUTF8; 27 using base::android::ConvertJavaStringToUTF8;
29 using base::android::ConvertJavaStringToUTF16; 28 using base::android::ConvertJavaStringToUTF16;
30 using base::android::ConvertUTF8ToJavaString; 29 using base::android::ConvertUTF8ToJavaString;
31 using base::android::JavaParamRef; 30 using base::android::JavaParamRef;
32 using base::android::ScopedJavaLocalRef; 31 using base::android::ScopedJavaLocalRef;
33 32
34 DEFINE_WEB_CONTENTS_USER_DATA_KEY(banners::AppBannerManagerAndroid); 33 DEFINE_WEB_CONTENTS_USER_DATA_KEY(banners::AppBannerManagerAndroid);
35 34
36 namespace { 35 namespace {
37 36
38 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";
42 40
41 std::unique_ptr<ShortcutInfo> CreateShortcutInfo(
42 const GURL& manifest_url,
43 const content::Manifest& manifest,
44 const GURL& icon_url) {
45 auto shortcut_info = base::MakeUnique<ShortcutInfo>(GURL());
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 if (AppBannerInfoBarDelegateAndroid::Create(
191 std::unique_ptr<AppBannerInfoBarDelegateAndroid> delegate( 202 contents, GetWeakPtr(), app_title_,
192 new AppBannerInfoBarDelegateAndroid( 203 CreateShortcutInfo(manifest_url_, manifest_, icon_url_),
193 GetWeakPtr(), app_title_, manifest_url_, manifest_, icon_url_, 204 std::move(icon_), event_request_id(),
194 std::move(icon_), event_request_id(), is_webapk)); 205 ChromeWebApkHost::AreWebApkEnabled(),
195 206 false /* start_install_webapk */)) {
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 28 matching lines...) Expand all
263 } 262 }
264 263
265 void AppBannerManagerAndroid::CreateJavaBannerManager() { 264 void AppBannerManagerAndroid::CreateJavaBannerManager() {
266 JNIEnv* env = base::android::AttachCurrentThread(); 265 JNIEnv* env = base::android::AttachCurrentThread();
267 java_banner_manager_.Reset( 266 java_banner_manager_.Reset(
268 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this))); 267 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this)));
269 } 268 }
270 269
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 const bool correct_platform = (platform == "play");
274 ReportStatus(web_contents(), PLATFORM_NOT_SUPPORTED_ON_ANDROID); 273 if (correct_platform && !id.empty())
275 return false; 274 return true;
276 } 275 ReportStatus(web_contents(),
277 if (id.empty()) { 276 correct_platform ? NO_ID_SPECIFIED
278 ReportStatus(web_contents(), NO_ID_SPECIFIED); 277 : PLATFORM_NOT_SUPPORTED_ON_ANDROID);
279 return false; 278 return false;
280 }
281 return true;
282 } 279 }
283 280
284 std::string AppBannerManagerAndroid::ExtractQueryValueForName( 281 std::string AppBannerManagerAndroid::ExtractQueryValueForName(
285 const GURL& url, 282 const GURL& url,
286 const std::string& name) { 283 const std::string& name) {
287 url::Component query = url.parsed_for_possibly_invalid_spec().query; 284 for (net::QueryIterator it(url); !it.IsAtEnd(); it.Advance()) {
288 url::Component key, value; 285 if (it.GetKey() == name)
289 const char* url_spec = url.spec().c_str(); 286 return it.GetValue();
290
291 while (url::ExtractQueryKeyValue(url_spec, &query, &key, &value)) {
292 std::string key_str(url_spec, key.begin, key.len);
293 std::string value_str(url_spec, value.begin, value.len);
294 if (key_str == name)
295 return value_str;
296 } 287 }
297 return ""; 288 return std::string();
298 } 289 }
299 290
300 // static 291 // static
301 bool AppBannerManagerAndroid::Register(JNIEnv* env) { 292 bool AppBannerManagerAndroid::Register(JNIEnv* env) {
302 return RegisterNativesImpl(env); 293 return RegisterNativesImpl(env);
303 } 294 }
304 295
305 // static 296 // static
306 ScopedJavaLocalRef<jobject> GetJavaBannerManagerForWebContents( 297 ScopedJavaLocalRef<jobject> GetJavaBannerManagerForWebContents(
307 JNIEnv* env, 298 JNIEnv* env,
308 const JavaParamRef<jclass>& clazz, 299 const JavaParamRef<jclass>& clazz,
309 const JavaParamRef<jobject>& java_web_contents) { 300 const JavaParamRef<jobject>& java_web_contents) {
310 AppBannerManagerAndroid* manager = AppBannerManagerAndroid::FromWebContents( 301 AppBannerManagerAndroid* manager = AppBannerManagerAndroid::FromWebContents(
311 content::WebContents::FromJavaWebContents(java_web_contents)); 302 content::WebContents::FromJavaWebContents(java_web_contents));
312 if (!manager) 303 return manager? ScopedJavaLocalRef<jobject>(manager->GetJavaBannerManager())
313 return ScopedJavaLocalRef<jobject>(); 304 : ScopedJavaLocalRef<jobject>();
314
315 return ScopedJavaLocalRef<jobject>(manager->GetJavaBannerManager());
316 } 305 }
317 306
318 // static 307 // static
319 void DisableSecureSchemeCheckForTesting(JNIEnv* env, 308 void DisableSecureSchemeCheckForTesting(JNIEnv* env,
320 const JavaParamRef<jclass>& clazz) { 309 const JavaParamRef<jclass>& clazz) {
321 AppBannerManager::DisableSecureSchemeCheckForTesting(); 310 AppBannerManager::DisableSecureSchemeCheckForTesting();
322 } 311 }
323 312
324 // static 313 // static
325 void SetEngagementWeights(JNIEnv* env, 314 void SetEngagementWeights(JNIEnv* env,
326 const JavaParamRef<jclass>& clazz, 315 const JavaParamRef<jclass>& clazz,
327 jdouble direct_engagement, 316 jdouble direct_engagement,
328 jdouble indirect_engagement) { 317 jdouble indirect_engagement) {
329 AppBannerManager::SetEngagementWeights(direct_engagement, 318 AppBannerManager::SetEngagementWeights(direct_engagement,
330 indirect_engagement); 319 indirect_engagement);
331 } 320 }
332 321
333 // static 322 // static
334 void SetTimeDeltaForTesting(JNIEnv* env, 323 void SetTimeDeltaForTesting(JNIEnv* env,
335 const JavaParamRef<jclass>& clazz, 324 const JavaParamRef<jclass>& clazz,
336 jint days) { 325 jint days) {
337 AppBannerManager::SetTimeDeltaForTesting(days); 326 AppBannerManager::SetTimeDeltaForTesting(days);
338 } 327 }
339 328
340 } // namespace banners 329 } // namespace banners
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698