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

Unified Diff: chrome/browser/android/banners/app_banner_infobar_delegate_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 side-by-side diff with in-line comments
Download patch
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..24b1523948bec8f5c58a8083c549c6c793d37c5c 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,59 @@ using base::android::ConvertUTF16ToJavaString;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
+namespace {
+
+bool IsInfoEmpty(const ShortcutInfo* info) {
+ return !info || info->url.is_empty();
+}
+
+}
+
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;
+ 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();
+ 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));
+ return InfoBarService::FromWebContents(web_contents)
+ ->AddInfoBar(base::MakeUnique<AppBannerInfoBarAndroid>(
+ std::move(infobar_delegate), native_app_data));
}
AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() {
@@ -87,7 +98,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);
}
@@ -113,14 +124,10 @@ void AppBannerInfoBarDelegateAndroid::OnInstallIntentReturned(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
jboolean jis_installing) {
- if (!infobar())
- return;
+ DCHECK(infobar());
content::WebContents* web_contents =
InfoBarService::WebContentsFromInfoBar(infobar());
- if (!web_contents)
- return;
-
if (jis_installing) {
AppBannerSettingsHelper::RecordBannerEvent(
web_contents,
@@ -142,8 +149,7 @@ void AppBannerInfoBarDelegateAndroid::OnInstallFinished(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
jboolean success) {
- if (!infobar())
- return;
+ DCHECK(infobar());
if (success) {
TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_COMPLETED);
@@ -154,10 +160,89 @@ void AppBannerInfoBarDelegateAndroid::OnInstallFinished(
}
}
-void AppBannerInfoBarDelegateAndroid::CreateJavaDelegate() {
+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, so open the installed WebAPK.
+ if (!webapk_package_name_.empty()) {
+ // 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;
+ }
+
+ // 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());
+ ShortcutHelper::InstallWebApkWithSkBitmap(web_contents->GetBrowserContext(),
+ *shortcut_info_,
+ *icon_.get(), callback);
+ SendBannerAccepted(web_contents, "web");
+
+ // Prevent the infobar from disappearing, because the infobar will show
+ // "Adding" during the installation process.
+ return false;
+}
+
+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() {
java_delegate_.Reset(Java_AppBannerInfoBarDelegateAndroid_create(
- env,
+ base::android::AttachCurrentThread(),
reinterpret_cast<intptr_t>(this)));
}
@@ -185,8 +270,6 @@ void AppBannerInfoBarDelegateAndroid::InfoBarDismissed() {
content::WebContents* web_contents =
InfoBarService::WebContentsFromInfoBar(infobar());
- if (!web_contents)
- return;
web_contents->GetMainFrame()->Send(
new ChromeViewMsg_AppBannerDismissed(
@@ -197,11 +280,10 @@ void AppBannerInfoBarDelegateAndroid::InfoBarDismissed() {
TrackUserResponse(USER_RESPONSE_NATIVE_APP_DISMISSED);
AppBannerSettingsHelper::RecordBannerDismissEvent(
web_contents, native_app_package_, AppBannerSettingsHelper::NATIVE);
- } else if (!manifest_.IsEmpty()) {
+ } else {
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,11 +305,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_) {
+
+ if (is_webapk_)
return AcceptWebApk(web_contents);
- }
+
return AcceptWebApp(web_contents);
}
@@ -237,10 +320,7 @@ bool AppBannerInfoBarDelegateAndroid::AcceptNativeApp(
JNIEnv* env = base::android::AttachCurrentThread();
TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
- if (tab == nullptr) {
- TrackDismissEvent(DISMISS_EVENT_ERROR);
- return true;
- }
+ DCHECK(tab);
ScopedJavaLocalRef<jstring> jreferrer(
ConvertUTF8ToJavaString(env, referrer_));
@@ -249,92 +329,35 @@ bool AppBannerInfoBarDelegateAndroid::AcceptNativeApp(
env, java_delegate_, tab->GetJavaObject(),
native_app_data_, jreferrer);
- if (was_opened) {
+ if (was_opened)
TrackDismissEvent(DISMISS_EVENT_APP_OPEN);
- } else {
+ else
TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_TRIGGERED);
- }
+
SendBannerAccepted(web_contents, "play");
return was_opened;
}
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_, 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) {
@@ -368,12 +391,8 @@ bool AppBannerInfoBarDelegateAndroid::LinkClicked(
content::WebContents* web_contents =
InfoBarService::WebContentsFromInfoBar(infobar());
- TabAndroid* tab = web_contents ? TabAndroid::FromWebContents(web_contents)
- : nullptr;
- if (tab == nullptr) {
- TrackDismissEvent(DISMISS_EVENT_ERROR);
- return true;
- }
+ TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
+ DCHECK(tab);
Java_AppBannerInfoBarDelegateAndroid_showAppDetails(
env, java_delegate_, tab->GetJavaObject(), native_app_data_);

Powered by Google App Engine
This is Rietveld 408576698