OLD | NEW |
---|---|
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 "chrome/browser/android/banners/app_banner_infobar_delegate_android.h" | 5 #include "chrome/browser/android/banners/app_banner_infobar_delegate_android.h" |
6 | 6 |
dominickn
2017/04/04 05:25:33
#include <utility> for std::move
F
2017/04/04 15:21:26
Done.
| |
7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
11 #include "chrome/browser/android/shortcut_helper.h" | 11 #include "chrome/browser/android/shortcut_helper.h" |
12 #include "chrome/browser/android/shortcut_info.h" | 12 #include "chrome/browser/android/shortcut_info.h" |
13 #include "chrome/browser/android/tab_android.h" | 13 #include "chrome/browser/android/tab_android.h" |
14 #include "chrome/browser/android/webapk/chrome_webapk_host.h" | 14 #include "chrome/browser/android/webapk/chrome_webapk_host.h" |
15 #include "chrome/browser/android/webapk/webapk_install_service.h" | 15 #include "chrome/browser/android/webapk/webapk_install_service.h" |
16 #include "chrome/browser/banners/app_banner_manager.h" | 16 #include "chrome/browser/banners/app_banner_manager.h" |
(...skipping 26 matching lines...) Expand all Loading... | |
43 } // anonymous namespace | 43 } // anonymous namespace |
44 | 44 |
45 namespace banners { | 45 namespace banners { |
46 | 46 |
47 // static | 47 // static |
48 bool AppBannerInfoBarDelegateAndroid::Create( | 48 bool AppBannerInfoBarDelegateAndroid::Create( |
49 content::WebContents* web_contents, | 49 content::WebContents* web_contents, |
50 base::WeakPtr<AppBannerManager> weak_manager, | 50 base::WeakPtr<AppBannerManager> weak_manager, |
51 const base::string16& app_title, | 51 const base::string16& app_title, |
52 std::unique_ptr<ShortcutInfo> shortcut_info, | 52 std::unique_ptr<ShortcutInfo> shortcut_info, |
53 std::unique_ptr<SkBitmap> icon, | 53 const SkBitmap& primary_icon, |
54 const SkBitmap& badge_icon, | |
54 int event_request_id, | 55 int event_request_id, |
55 webapk::InstallSource webapk_install_source) { | 56 webapk::InstallSource webapk_install_source) { |
56 bool is_webapk = ChromeWebApkHost::CanInstallWebApk(); | 57 bool is_webapk = ChromeWebApkHost::CanInstallWebApk(); |
57 const GURL url = shortcut_info->url; | 58 const GURL url = shortcut_info->url; |
58 auto infobar_delegate = | 59 auto infobar_delegate = |
59 base::WrapUnique(new banners::AppBannerInfoBarDelegateAndroid( | 60 base::WrapUnique(new banners::AppBannerInfoBarDelegateAndroid( |
60 weak_manager, app_title, std::move(shortcut_info), std::move(icon), | 61 weak_manager, app_title, std::move(shortcut_info), primary_icon, |
61 event_request_id, is_webapk, webapk_install_source)); | 62 badge_icon, event_request_id, is_webapk, webapk_install_source)); |
62 auto* raw_delegate = infobar_delegate.get(); | 63 auto* raw_delegate = infobar_delegate.get(); |
63 auto infobar = base::MakeUnique<AppBannerInfoBarAndroid>( | 64 auto infobar = base::MakeUnique<AppBannerInfoBarAndroid>( |
64 std::move(infobar_delegate), url, is_webapk); | 65 std::move(infobar_delegate), url, is_webapk); |
65 if (!InfoBarService::FromWebContents(web_contents) | 66 if (!InfoBarService::FromWebContents(web_contents) |
66 ->AddInfoBar(std::move(infobar))) | 67 ->AddInfoBar(std::move(infobar))) |
67 return false; | 68 return false; |
68 | 69 |
69 if (is_webapk) { | 70 if (is_webapk) { |
70 if (webapk_install_source == webapk::INSTALL_SOURCE_MENU) { | 71 if (webapk_install_source == webapk::INSTALL_SOURCE_MENU) { |
71 webapk::TrackInstallInfoBarShown( | 72 webapk::TrackInstallInfoBarShown( |
72 webapk::WEBAPK_INFOBAR_SHOWN_FROM_MENU); | 73 webapk::WEBAPK_INFOBAR_SHOWN_FROM_MENU); |
73 raw_delegate->Accept(); | 74 raw_delegate->Accept(); |
74 } else { | 75 } else { |
75 webapk::TrackInstallInfoBarShown( | 76 webapk::TrackInstallInfoBarShown( |
76 webapk::WEBAPK_INFOBAR_SHOWN_FROM_BANNER); | 77 webapk::WEBAPK_INFOBAR_SHOWN_FROM_BANNER); |
77 } | 78 } |
78 } | 79 } |
79 | 80 |
80 return true; | 81 return true; |
81 } | 82 } |
82 | 83 |
83 // static | 84 // static |
84 bool AppBannerInfoBarDelegateAndroid::Create( | 85 bool AppBannerInfoBarDelegateAndroid::Create( |
85 content::WebContents* web_contents, | 86 content::WebContents* web_contents, |
86 const base::string16& app_title, | 87 const base::string16& app_title, |
87 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, | 88 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, |
88 std::unique_ptr<SkBitmap> icon, | 89 const SkBitmap& icon, |
89 const std::string& native_app_package, | 90 const std::string& native_app_package, |
90 const std::string& referrer, | 91 const std::string& referrer, |
91 int event_request_id) { | 92 int event_request_id) { |
92 auto infobar_delegate = base::WrapUnique(new AppBannerInfoBarDelegateAndroid( | 93 auto infobar_delegate = base::WrapUnique(new AppBannerInfoBarDelegateAndroid( |
93 app_title, native_app_data, std::move(icon), native_app_package, referrer, | 94 app_title, native_app_data, icon, native_app_package, referrer, |
94 event_request_id)); | 95 event_request_id)); |
95 return InfoBarService::FromWebContents(web_contents) | 96 return InfoBarService::FromWebContents(web_contents) |
96 ->AddInfoBar(base::MakeUnique<AppBannerInfoBarAndroid>( | 97 ->AddInfoBar(base::MakeUnique<AppBannerInfoBarAndroid>( |
97 std::move(infobar_delegate), native_app_data)); | 98 std::move(infobar_delegate), native_app_data)); |
98 } | 99 } |
99 | 100 |
100 AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() { | 101 AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() { |
101 weak_ptr_factory_.InvalidateWeakPtrs(); | 102 weak_ptr_factory_.InvalidateWeakPtrs(); |
102 | 103 |
103 if (!has_user_interaction_) { | 104 if (!has_user_interaction_) { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
200 Java_AppBannerInfoBarDelegateAndroid_setWebApkPackageName( | 201 Java_AppBannerInfoBarDelegateAndroid_setWebApkPackageName( |
201 env, java_delegate_, java_webapk_package_name); | 202 env, java_delegate_, java_webapk_package_name); |
202 UpdateInstallState(env, nullptr); | 203 UpdateInstallState(env, nullptr); |
203 install_state_ = INSTALLED; | 204 install_state_ = INSTALLED; |
204 } | 205 } |
205 | 206 |
206 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( | 207 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( |
207 base::WeakPtr<AppBannerManager> weak_manager, | 208 base::WeakPtr<AppBannerManager> weak_manager, |
208 const base::string16& app_title, | 209 const base::string16& app_title, |
209 std::unique_ptr<ShortcutInfo> shortcut_info, | 210 std::unique_ptr<ShortcutInfo> shortcut_info, |
210 std::unique_ptr<SkBitmap> icon, | 211 const SkBitmap& primary_icon, |
212 const SkBitmap& badge_icon, | |
211 int event_request_id, | 213 int event_request_id, |
212 bool is_webapk, | 214 bool is_webapk, |
213 webapk::InstallSource webapk_install_source) | 215 webapk::InstallSource webapk_install_source) |
214 : weak_manager_(weak_manager), | 216 : weak_manager_(weak_manager), |
215 app_title_(app_title), | 217 app_title_(app_title), |
216 shortcut_info_(std::move(shortcut_info)), | 218 shortcut_info_(std::move(shortcut_info)), |
217 icon_(std::move(icon)), | 219 primary_icon_(primary_icon), |
220 badge_icon_(badge_icon), | |
218 event_request_id_(event_request_id), | 221 event_request_id_(event_request_id), |
219 has_user_interaction_(false), | 222 has_user_interaction_(false), |
220 is_webapk_(is_webapk), | 223 is_webapk_(is_webapk), |
221 install_state_(INSTALL_NOT_STARTED), | 224 install_state_(INSTALL_NOT_STARTED), |
222 webapk_install_source_(webapk_install_source), | 225 webapk_install_source_(webapk_install_source), |
223 weak_ptr_factory_(this) { | 226 weak_ptr_factory_(this) { |
224 DCHECK(!IsInfoEmpty(shortcut_info_)); | 227 DCHECK(!IsInfoEmpty(shortcut_info_)); |
225 CreateJavaDelegate(); | 228 CreateJavaDelegate(); |
226 } | 229 } |
227 | 230 |
228 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( | 231 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( |
229 const base::string16& app_title, | 232 const base::string16& app_title, |
230 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, | 233 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, |
231 std::unique_ptr<SkBitmap> icon, | 234 const SkBitmap& icon, |
232 const std::string& native_app_package, | 235 const std::string& native_app_package, |
233 const std::string& referrer, | 236 const std::string& referrer, |
234 int event_request_id) | 237 int event_request_id) |
235 : app_title_(app_title), | 238 : app_title_(app_title), |
236 native_app_data_(native_app_data), | 239 native_app_data_(native_app_data), |
237 icon_(std::move(icon)), | 240 primary_icon_(icon), |
238 native_app_package_(native_app_package), | 241 native_app_package_(native_app_package), |
239 referrer_(referrer), | 242 referrer_(referrer), |
240 event_request_id_(event_request_id), | 243 event_request_id_(event_request_id), |
241 has_user_interaction_(false), | 244 has_user_interaction_(false), |
242 weak_ptr_factory_(this) { | 245 weak_ptr_factory_(this) { |
243 DCHECK(!native_app_data_.is_null()); | 246 DCHECK(!native_app_data_.is_null()); |
244 CreateJavaDelegate(); | 247 CreateJavaDelegate(); |
245 } | 248 } |
246 | 249 |
247 void AppBannerInfoBarDelegateAndroid::CreateJavaDelegate() { | 250 void AppBannerInfoBarDelegateAndroid::CreateJavaDelegate() { |
(...skipping 29 matching lines...) Expand all Loading... | |
277 bool AppBannerInfoBarDelegateAndroid::AcceptWebApp( | 280 bool AppBannerInfoBarDelegateAndroid::AcceptWebApp( |
278 content::WebContents* web_contents) { | 281 content::WebContents* web_contents) { |
279 if (IsInfoEmpty(shortcut_info_)) | 282 if (IsInfoEmpty(shortcut_info_)) |
280 return true; | 283 return true; |
281 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED); | 284 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED); |
282 | 285 |
283 AppBannerSettingsHelper::RecordBannerInstallEvent( | 286 AppBannerSettingsHelper::RecordBannerInstallEvent( |
284 web_contents, shortcut_info_->url.spec(), AppBannerSettingsHelper::WEB); | 287 web_contents, shortcut_info_->url.spec(), AppBannerSettingsHelper::WEB); |
285 | 288 |
286 ShortcutHelper::AddToLauncherWithSkBitmap(web_contents, *shortcut_info_, | 289 ShortcutHelper::AddToLauncherWithSkBitmap(web_contents, *shortcut_info_, |
287 *icon_.get()); | 290 primary_icon_); |
288 | 291 |
289 SendBannerAccepted(); | 292 SendBannerAccepted(); |
290 return true; | 293 return true; |
291 } | 294 } |
292 | 295 |
293 bool AppBannerInfoBarDelegateAndroid::AcceptWebApk( | 296 bool AppBannerInfoBarDelegateAndroid::AcceptWebApk( |
294 content::WebContents* web_contents) { | 297 content::WebContents* web_contents) { |
295 if (IsInfoEmpty(shortcut_info_)) | 298 if (IsInfoEmpty(shortcut_info_)) |
296 return true; | 299 return true; |
297 | 300 |
(...skipping 27 matching lines...) Expand all Loading... | |
325 AppBannerSettingsHelper::APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN, | 328 AppBannerSettingsHelper::APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN, |
326 AppBannerManager::GetCurrentTime()); | 329 AppBannerManager::GetCurrentTime()); |
327 } | 330 } |
328 | 331 |
329 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState( | 332 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState( |
330 env, java_delegate_, true); | 333 env, java_delegate_, true); |
331 UpdateInstallState(env, nullptr); | 334 UpdateInstallState(env, nullptr); |
332 WebApkInstallService::FinishCallback callback = | 335 WebApkInstallService::FinishCallback callback = |
333 base::Bind(&AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished, | 336 base::Bind(&AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished, |
334 weak_ptr_factory_.GetWeakPtr()); | 337 weak_ptr_factory_.GetWeakPtr()); |
335 ShortcutHelper::InstallWebApkWithSkBitmap(web_contents, *shortcut_info_, | 338 ShortcutHelper::InstallWebApkWithSkBitmap( |
336 *icon_.get(), callback); | 339 web_contents, *shortcut_info_, primary_icon_, badge_icon_, callback); |
340 | |
337 SendBannerAccepted(); | 341 SendBannerAccepted(); |
338 | 342 |
339 // Prevent the infobar from disappearing, because the infobar will show | 343 // Prevent the infobar from disappearing, because the infobar will show |
340 // "Adding" during the installation process. | 344 // "Adding" during the installation process. |
341 return false; | 345 return false; |
342 } | 346 } |
343 | 347 |
344 bool AppBannerInfoBarDelegateAndroid::TriggeredFromBanner() const { | 348 bool AppBannerInfoBarDelegateAndroid::TriggeredFromBanner() const { |
345 return !is_webapk_ || webapk_install_source_ == webapk::INSTALL_SOURCE_BANNER; | 349 return !is_webapk_ || webapk_install_source_ == webapk::INSTALL_SOURCE_BANNER; |
346 } | 350 } |
(...skipping 25 matching lines...) Expand all Loading... | |
372 return; | 376 return; |
373 | 377 |
374 // If the install didn't definitely fail, we don't add a shortcut. This could | 378 // If the install didn't definitely fail, we don't add a shortcut. This could |
375 // happen if Play was busy with another install and this one is still queued | 379 // happen if Play was busy with another install and this one is still queued |
376 // (and hence might succeed in the future). | 380 // (and hence might succeed in the future). |
377 if (result == WebApkInstallResult::FAILURE) { | 381 if (result == WebApkInstallResult::FAILURE) { |
378 content::WebContents* web_contents = | 382 content::WebContents* web_contents = |
379 InfoBarService::WebContentsFromInfoBar(infobar()); | 383 InfoBarService::WebContentsFromInfoBar(infobar()); |
380 // Add webapp shortcut to the homescreen. | 384 // Add webapp shortcut to the homescreen. |
381 ShortcutHelper::AddToLauncherWithSkBitmap(web_contents, *shortcut_info_, | 385 ShortcutHelper::AddToLauncherWithSkBitmap(web_contents, *shortcut_info_, |
382 *icon_.get()); | 386 primary_icon_); |
383 } | 387 } |
384 | 388 |
385 infobar()->RemoveSelf(); | 389 infobar()->RemoveSelf(); |
386 } | 390 } |
387 | 391 |
388 void AppBannerInfoBarDelegateAndroid::TrackWebApkInstallationDismissEvents( | 392 void AppBannerInfoBarDelegateAndroid::TrackWebApkInstallationDismissEvents( |
389 InstallState install_state) { | 393 InstallState install_state) { |
390 if (install_state == INSTALL_NOT_STARTED) { | 394 if (install_state == INSTALL_NOT_STARTED) { |
391 webapk::TrackInstallEvent(webapk::INFOBAR_DISMISSED_BEFORE_INSTALLATION); | 395 webapk::TrackInstallEvent(webapk::INFOBAR_DISMISSED_BEFORE_INSTALLATION); |
392 } else if (install_state == INSTALLING) { | 396 } else if (install_state == INSTALLING) { |
393 webapk::TrackInstallEvent(webapk::INFOBAR_DISMISSED_DURING_INSTALLATION); | 397 webapk::TrackInstallEvent(webapk::INFOBAR_DISMISSED_DURING_INSTALLATION); |
394 } else if (install_state == INSTALLED) { | 398 } else if (install_state == INSTALLED) { |
395 // If WebAPK is installed from this banner, TrackInstallEvent() is called in | 399 // If WebAPK is installed from this banner, TrackInstallEvent() is called in |
396 // WebApkInstaller::OnResult(). | 400 // WebApkInstaller::OnResult(). |
397 webapk::TrackUserAction(webapk::USER_ACTION_INSTALLED_OPEN_DISMISS); | 401 webapk::TrackUserAction(webapk::USER_ACTION_INSTALLED_OPEN_DISMISS); |
398 } | 402 } |
399 } | 403 } |
400 | 404 |
401 infobars::InfoBarDelegate::InfoBarIdentifier | 405 infobars::InfoBarDelegate::InfoBarIdentifier |
402 AppBannerInfoBarDelegateAndroid::GetIdentifier() const { | 406 AppBannerInfoBarDelegateAndroid::GetIdentifier() const { |
403 return APP_BANNER_INFOBAR_DELEGATE_ANDROID; | 407 return APP_BANNER_INFOBAR_DELEGATE_ANDROID; |
404 } | 408 } |
405 | 409 |
406 gfx::Image AppBannerInfoBarDelegateAndroid::GetIcon() const { | 410 gfx::Image AppBannerInfoBarDelegateAndroid::GetIcon() const { |
407 return gfx::Image::CreateFrom1xBitmap(*icon_.get()); | 411 return gfx::Image::CreateFrom1xBitmap(primary_icon_); |
408 } | 412 } |
409 | 413 |
410 void AppBannerInfoBarDelegateAndroid::InfoBarDismissed() { | 414 void AppBannerInfoBarDelegateAndroid::InfoBarDismissed() { |
411 has_user_interaction_ = true; | 415 has_user_interaction_ = true; |
412 | 416 |
413 content::WebContents* web_contents = | 417 content::WebContents* web_contents = |
414 InfoBarService::WebContentsFromInfoBar(infobar()); | 418 InfoBarService::WebContentsFromInfoBar(infobar()); |
415 | 419 |
416 if (weak_manager_ && TriggeredFromBanner()) | 420 if (weak_manager_ && TriggeredFromBanner()) |
417 weak_manager_->SendBannerDismissed(event_request_id_); | 421 weak_manager_->SendBannerDismissed(event_request_id_); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
458 | 462 |
459 TrackDismissEvent(DISMISS_EVENT_BANNER_CLICK); | 463 TrackDismissEvent(DISMISS_EVENT_BANNER_CLICK); |
460 return true; | 464 return true; |
461 } | 465 } |
462 | 466 |
463 bool RegisterAppBannerInfoBarDelegateAndroid(JNIEnv* env) { | 467 bool RegisterAppBannerInfoBarDelegateAndroid(JNIEnv* env) { |
464 return RegisterNativesImpl(env); | 468 return RegisterNativesImpl(env); |
465 } | 469 } |
466 | 470 |
467 } // namespace banners | 471 } // namespace banners |
OLD | NEW |