Index: chrome/browser/android/banners/app_banner_infobar_delegate_android.cc |
diff --git a/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc b/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc |
index 1e2e973cbef929860fbd4ce586fd014ffe1bb2ee..8c444f7b09c38655b8de3be43dfea1589e6e9dad 100644 |
--- a/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc |
+++ b/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc |
@@ -37,48 +37,62 @@ using base::android::ConvertUTF16ToJavaString; |
using base::android::JavaParamRef; |
using base::android::ScopedJavaLocalRef; |
Peter Kasting
2016/09/08 04:56:57
Nit: Be cautious with using directives; prefer to
Xi Han
2016/09/08 15:49:09
I will keep this in mind.
|
+namespace { |
+ |
+bool IsInfoEmpty(const ShortcutInfo* info) { |
Peter Kasting
2016/09/08 04:56:57
Nit: Take a const unique_ptr& and you won't have t
Xi Han
2016/09/08 15:49:10
It can't be a unique_ptr since when this function
Peter Kasting
2016/09/08 20:57:05
I said "const unique_ptr&", not "unique_ptr".
|
+ return !info || info->url.is_empty(); |
Peter Kasting
2016/09/08 04:56:57
Note that if you split this class in the future, I
Xi Han
2016/09/08 15:49:09
Acknowledged.
|
+} |
+ |
+} // anonymous namespace |
Peter Kasting
2016/09/08 04:56:56
Nit: No need for this comment
Xi Han
2016/09/08 15:49:10
Done.
|
+ |
namespace banners { |
-AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( |
+// static |
+bool AppBannerInfoBarDelegateAndroid::Create( |
+ content::WebContents* web_contents, |
base::WeakPtr<AppBannerManager> weak_manager, |
const base::string16& app_title, |
- const GURL& manifest_url, |
- const content::Manifest& manifest, |
- const GURL& icon_url, |
+ std::unique_ptr<ShortcutInfo> shortcut_info, |
std::unique_ptr<SkBitmap> icon, |
int event_request_id, |
- bool is_webapk) |
- : weak_manager_(weak_manager), |
- app_title_(app_title), |
- manifest_url_(manifest_url), |
- manifest_(manifest), |
- icon_url_(icon_url), |
- icon_(std::move(icon)), |
- event_request_id_(event_request_id), |
- has_user_interaction_(false), |
- is_webapk_(is_webapk), |
- weak_ptr_factory_(this) { |
- DCHECK(!manifest.IsEmpty()); |
- CreateJavaDelegate(); |
+ bool is_webapk, |
+ bool start_install_webapk) { |
+ const GURL& url = shortcut_info->url; |
Peter Kasting
2016/09/08 04:56:57
Nit: Inline this into the caller below (even if yo
Xi Han
2016/09/08 15:49:09
It has to be done before std::move(shortcut_info)
Peter Kasting
2016/09/08 20:57:05
Oh bah.
|
+ auto infobar_delegate = |
+ base::WrapUnique(new banners::AppBannerInfoBarDelegateAndroid( |
+ weak_manager, app_title, std::move(shortcut_info), std::move(icon), |
+ event_request_id, is_webapk)); |
+ auto raw_delegate = infobar_delegate.get(); |
+ |
Peter Kasting
2016/09/08 04:56:57
Nit: Can't really figure out the logic on when thi
Xi Han
2016/09/08 15:49:09
Sure, updated.
|
+ auto infobar = base::MakeUnique<AppBannerInfoBarAndroid>( |
+ std::move(infobar_delegate), url, is_webapk); |
+ |
+ if (!InfoBarService::FromWebContents(web_contents) |
+ ->AddInfoBar(std::move(infobar))) |
+ return false; |
+ |
+ if (is_webapk && start_install_webapk) |
+ raw_delegate->AcceptWebApk(web_contents); |
+ return true; |
} |
-AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( |
+// static |
+bool AppBannerInfoBarDelegateAndroid::Create( |
+ content::WebContents* web_contents, |
const base::string16& app_title, |
const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, |
std::unique_ptr<SkBitmap> icon, |
const std::string& native_app_package, |
const std::string& referrer, |
- int event_request_id) |
- : app_title_(app_title), |
- native_app_data_(native_app_data), |
- icon_(std::move(icon)), |
- native_app_package_(native_app_package), |
- referrer_(referrer), |
- event_request_id_(event_request_id), |
- has_user_interaction_(false), |
- weak_ptr_factory_(this) { |
- DCHECK(!native_app_data_.is_null()); |
- CreateJavaDelegate(); |
+ int event_request_id) { |
+ auto infobar_delegate = base::WrapUnique(new AppBannerInfoBarDelegateAndroid( |
+ app_title, native_app_data, std::move(icon), native_app_package, referrer, |
+ event_request_id)); |
+ auto infobar = base::MakeUnique<AppBannerInfoBarAndroid>( |
+ std::move(infobar_delegate), native_app_data); |
Peter Kasting
2016/09/08 04:56:57
Nit: Might want to inline this below (or even both
Xi Han
2016/09/08 15:49:09
Inline the infobar one only, since the delegate on
|
+ |
Peter Kasting
2016/09/08 04:56:57
Nit: Maybe remove this newline?
Xi Han
2016/09/08 15:49:10
Done.
|
+ return InfoBarService::FromWebContents(web_contents) |
+ ->AddInfoBar(std::move(infobar)); |
} |
AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() { |
@@ -87,7 +101,7 @@ AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() { |
if (!has_user_interaction_) { |
if (!native_app_data_.is_null()) |
TrackUserResponse(USER_RESPONSE_NATIVE_APP_IGNORED); |
- else if (!manifest_.IsEmpty()) |
+ else if (!IsInfoEmpty(shortcut_info_.get())) |
TrackUserResponse(USER_RESPONSE_WEB_APP_IGNORED); |
} |
@@ -154,6 +168,88 @@ void AppBannerInfoBarDelegateAndroid::OnInstallFinished( |
} |
} |
+bool AppBannerInfoBarDelegateAndroid::AcceptWebApk( |
+ content::WebContents* web_contents) { |
+ if (IsInfoEmpty(shortcut_info_.get())) |
+ return true; |
+ |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ // |webapk_package_name_| is set when the WebAPK has finished installing. |
+ // If the |webapk_package_name_| is empty, it means the "Add to Homescreen" |
+ // button is pressed, so request WebAPK installation. Otherwise, it means |
+ // the "Open" button is pressed, then open the installed WebAPK. |
Peter Kasting
2016/09/08 04:56:57
Nit: then -> so
Xi Han
2016/09/08 15:49:10
Done.
|
+ if (webapk_package_name_.empty()) { |
+ // Request install the WebAPK. |
+ TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED); |
+ |
+ AppBannerSettingsHelper::RecordBannerInstallEvent( |
+ web_contents, shortcut_info_->url.spec(), AppBannerSettingsHelper::WEB); |
+ |
+ Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState( |
+ env, java_delegate_, true); |
+ UpdateInstallState(env, nullptr); |
+ |
+ WebApkInstaller::FinishCallback callback = |
+ base::Bind(&AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ DVLOG(1) << "Trigger the installation of the WebAPK."; |
Peter Kasting
2016/09/08 04:56:56
Nit: Avoid checking in logging if possible.
Xi Han
2016/09/08 15:49:09
Done.
|
+ ShortcutHelper::InstallWebApkWithSkBitmap(web_contents->GetBrowserContext(), |
+ *shortcut_info_.get(), |
Peter Kasting
2016/09/08 04:56:57
Nit: .get() not necessary when dereferencing a sma
Xi Han
2016/09/08 15:49:09
Done.
|
+ *icon_.get(), callback); |
+ |
+ SendBannerAccepted(web_contents, "web"); |
+ // Returns false to prevent the infobar from disappearing. |
Peter Kasting
2016/09/08 04:56:57
Nit: We can see it returns false; maybe instead sa
Xi Han
2016/09/08 15:49:09
Done.
|
+ return false; |
+ } |
+ |
+ // Open the WebAPK. |
Peter Kasting
2016/09/08 04:56:57
Nit: Consider making this shorter arm the one in t
Xi Han
2016/09/08 15:49:09
Done.
|
+ ScopedJavaLocalRef<jstring> java_webapk_package_name = |
+ base::android::ConvertUTF8ToJavaString(env, webapk_package_name_); |
+ Java_AppBannerInfoBarDelegateAndroid_openWebApk(env, java_delegate_, |
+ java_webapk_package_name); |
+ |
+ SendBannerAccepted(web_contents, "web"); |
+ return true; |
+} |
+ |
+AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( |
+ base::WeakPtr<AppBannerManager> weak_manager, |
+ const base::string16& app_title, |
+ std::unique_ptr<ShortcutInfo> shortcut_info, |
+ std::unique_ptr<SkBitmap> icon, |
+ int event_request_id, |
+ bool is_webapk) |
+ : weak_manager_(weak_manager), |
+ app_title_(app_title), |
+ shortcut_info_(std::move(shortcut_info)), |
+ icon_(std::move(icon)), |
+ event_request_id_(event_request_id), |
+ has_user_interaction_(false), |
+ is_webapk_(is_webapk), |
+ weak_ptr_factory_(this) { |
+ DCHECK(!IsInfoEmpty(shortcut_info_.get())); |
+ CreateJavaDelegate(); |
+} |
+ |
+AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( |
+ const base::string16& app_title, |
+ const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, |
+ std::unique_ptr<SkBitmap> icon, |
+ const std::string& native_app_package, |
+ const std::string& referrer, |
+ int event_request_id) |
+ : app_title_(app_title), |
+ native_app_data_(native_app_data), |
+ icon_(std::move(icon)), |
+ native_app_package_(native_app_package), |
+ referrer_(referrer), |
+ event_request_id_(event_request_id), |
+ has_user_interaction_(false), |
+ weak_ptr_factory_(this) { |
+ DCHECK(!native_app_data_.is_null()); |
+ CreateJavaDelegate(); |
+} |
+ |
void AppBannerInfoBarDelegateAndroid::CreateJavaDelegate() { |
JNIEnv* env = base::android::AttachCurrentThread(); |
Peter Kasting
2016/09/08 04:56:57
Nit: Just inline this below
Xi Han
2016/09/08 15:49:10
Done.
|
java_delegate_.Reset(Java_AppBannerInfoBarDelegateAndroid_create( |
@@ -197,11 +293,10 @@ void AppBannerInfoBarDelegateAndroid::InfoBarDismissed() { |
TrackUserResponse(USER_RESPONSE_NATIVE_APP_DISMISSED); |
AppBannerSettingsHelper::RecordBannerDismissEvent( |
web_contents, native_app_package_, AppBannerSettingsHelper::NATIVE); |
- } else if (!manifest_.IsEmpty()) { |
+ } else if (!IsInfoEmpty(shortcut_info_.get())) { |
Peter Kasting
2016/09/08 04:56:57
Can both these conditions fail, or is one always t
Xi Han
2016/09/08 15:49:09
I believe one is always true, see the DCHECH in th
|
TrackUserResponse(USER_RESPONSE_WEB_APP_DISMISSED); |
AppBannerSettingsHelper::RecordBannerDismissEvent( |
- web_contents, manifest_.start_url.spec(), |
- AppBannerSettingsHelper::WEB); |
+ web_contents, shortcut_info_->url.spec(), AppBannerSettingsHelper::WEB); |
} |
} |
@@ -223,12 +318,12 @@ bool AppBannerInfoBarDelegateAndroid::Accept() { |
return true; |
} |
- if (!native_app_data_.is_null()) { |
+ if (!native_app_data_.is_null()) |
return AcceptNativeApp(web_contents); |
- } else if (is_webapk_) { |
+ else if (is_webapk_) |
Peter Kasting
2016/09/08 04:56:56
Nit: No else after return (2 places)
Xi Han
2016/09/08 15:49:09
Done.
|
return AcceptWebApk(web_contents); |
- } |
- return AcceptWebApp(web_contents); |
+ else |
+ return AcceptWebApp(web_contents); |
} |
bool AppBannerInfoBarDelegateAndroid::AcceptNativeApp( |
@@ -260,81 +355,24 @@ bool AppBannerInfoBarDelegateAndroid::AcceptNativeApp( |
bool AppBannerInfoBarDelegateAndroid::AcceptWebApp( |
content::WebContents* web_contents) { |
- if (manifest_.IsEmpty()) |
+ if (IsInfoEmpty(shortcut_info_.get())) |
return true; |
TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED); |
AppBannerSettingsHelper::RecordBannerInstallEvent( |
- web_contents, manifest_.start_url.spec(), |
- AppBannerSettingsHelper::WEB); |
+ web_contents, shortcut_info_->url.spec(), AppBannerSettingsHelper::WEB); |
if (weak_manager_) { |
- ShortcutInfo info(GURL::EmptyGURL()); |
- info.UpdateFromManifest(manifest_); |
- info.manifest_url = manifest_url_; |
- info.icon_url = icon_url_; |
- info.UpdateSource(ShortcutInfo::SOURCE_APP_BANNER); |
- |
const std::string& uid = base::GenerateGUID(); |
ShortcutHelper::AddToLauncherWithSkBitmap( |
- web_contents->GetBrowserContext(), info, uid, *icon_.get(), |
- weak_manager_->FetchWebappSplashScreenImageCallback(uid)); |
+ web_contents->GetBrowserContext(), *shortcut_info_.get(), uid, |
+ *icon_.get(), weak_manager_->FetchWebappSplashScreenImageCallback(uid)); |
} |
SendBannerAccepted(web_contents, "web"); |
return true; |
} |
-bool AppBannerInfoBarDelegateAndroid::AcceptWebApk( |
- content::WebContents* web_contents) { |
- if (manifest_.IsEmpty()) |
- return true; |
- |
- JNIEnv* env = base::android::AttachCurrentThread(); |
- // |webapk_package_name_| is set when the WebAPK has finished installing. |
- // If the |webapk_package_name_| is empty, it means the "Add to Homescreen" |
- // button is pressed, so request WebAPK installation. Otherwise, it means |
- // the "Open" button is pressed, then open the installed WebAPK. |
- if (webapk_package_name_.empty()) { |
- // Request install the WebAPK. |
- TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED); |
- |
- AppBannerSettingsHelper::RecordBannerInstallEvent( |
- web_contents, manifest_.start_url.spec(), |
- AppBannerSettingsHelper::WEB); |
- |
- ShortcutInfo info(GURL::EmptyGURL()); |
- info.UpdateFromManifest(manifest_); |
- info.manifest_url = manifest_url_; |
- info.icon_url = icon_url_; |
- info.UpdateSource(ShortcutInfo::SOURCE_APP_BANNER); |
- |
- Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState( |
- env, java_delegate_, true); |
- UpdateInstallState(env, nullptr); |
- |
- WebApkInstaller::FinishCallback callback = base::Bind( |
- &AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished, |
- weak_ptr_factory_.GetWeakPtr()); |
- DVLOG(1) << "Trigger the installation of the WebAPK."; |
- ShortcutHelper::InstallWebApkWithSkBitmap( |
- web_contents->GetBrowserContext(), info, *icon_.get(), callback); |
- |
- SendBannerAccepted(web_contents, "web"); |
- // Returns false to prevent the infobar from disappearing. |
- return false; |
- } |
- |
- // Open the WebAPK. |
- ScopedJavaLocalRef<jstring> java_webapk_package_name = |
- base::android::ConvertUTF8ToJavaString(env, webapk_package_name_); |
- Java_AppBannerInfoBarDelegateAndroid_openWebApk( |
- env, java_delegate_, java_webapk_package_name); |
- |
- SendBannerAccepted(web_contents, "web"); |
- return true; |
-} |
- |
void AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished( |
bool success, |
const std::string& webapk_package_name) { |