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

Unified Diff: chrome/browser/android/banners/app_banner_infobar_delegate_android.cc

Issue 2259553002: Make AppBannerInfoBar install WebAPK. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 4 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 74e3965680ec7b3825ffd71da51229320d9c57c2..1e2e973cbef929860fbd4ce586fd014ffe1bb2ee 100644
--- a/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc
+++ b/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/android/shortcut_helper.h"
#include "chrome/browser/android/shortcut_info.h"
#include "chrome/browser/android/tab_android.h"
+#include "chrome/browser/android/webapk/webapk_installer.h"
#include "chrome/browser/banners/app_banner_manager.h"
#include "chrome/browser/banners/app_banner_metrics.h"
#include "chrome/browser/banners/app_banner_settings_helper.h"
@@ -45,7 +46,8 @@ AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid(
const content::Manifest& manifest,
const GURL& icon_url,
std::unique_ptr<SkBitmap> icon,
- int event_request_id)
+ int event_request_id,
+ bool is_webapk)
: weak_manager_(weak_manager),
app_title_(app_title),
manifest_url_(manifest_url),
@@ -53,7 +55,9 @@ AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid(
icon_url_(icon_url),
icon_(std::move(icon)),
event_request_id_(event_request_id),
- has_user_interaction_(false) {
+ has_user_interaction_(false),
+ is_webapk_(is_webapk),
+ weak_ptr_factory_(this) {
DCHECK(!manifest.IsEmpty());
CreateJavaDelegate();
}
@@ -71,12 +75,15 @@ AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid(
native_app_package_(native_app_package),
referrer_(referrer),
event_request_id_(event_request_id),
- has_user_interaction_(false) {
+ has_user_interaction_(false),
+ weak_ptr_factory_(this) {
DCHECK(!native_app_data_.is_null());
CreateJavaDelegate();
}
AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() {
+ weak_ptr_factory_.InvalidateWeakPtrs();
+
if (!has_user_interaction_) {
if (!native_app_data_.is_null())
TrackUserResponse(USER_RESPONSE_NATIVE_APP_IGNORED);
@@ -93,7 +100,7 @@ AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() {
void AppBannerInfoBarDelegateAndroid::UpdateInstallState(
JNIEnv* env,
const JavaParamRef<jobject>& obj) {
- if (native_app_data_.is_null())
+ if (native_app_data_.is_null() && !is_webapk_)
return;
int newState = Java_AppBannerInfoBarDelegateAndroid_determineInstallState(
@@ -217,56 +224,140 @@ bool AppBannerInfoBarDelegateAndroid::Accept() {
}
if (!native_app_data_.is_null()) {
- TrackUserResponse(USER_RESPONSE_NATIVE_APP_ACCEPTED);
- JNIEnv* env = base::android::AttachCurrentThread();
-
- TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
- if (tab == nullptr) {
- TrackDismissEvent(DISMISS_EVENT_ERROR);
- return true;
- }
- ScopedJavaLocalRef<jstring> jreferrer(
- ConvertUTF8ToJavaString(env, referrer_));
-
- bool was_opened =
- Java_AppBannerInfoBarDelegateAndroid_installOrOpenNativeApp(
- env, java_delegate_, tab->GetJavaObject(), native_app_data_,
- jreferrer);
-
- if (was_opened) {
- TrackDismissEvent(DISMISS_EVENT_APP_OPEN);
- } else {
- TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_TRIGGERED);
- }
- SendBannerAccepted(web_contents, "play");
- return was_opened;
- } else if (!manifest_.IsEmpty()) {
+ return AcceptNativeApp(web_contents);
+ } else if (is_webapk_) {
+ return AcceptWebApk(web_contents);
+ }
+ return AcceptWebApp(web_contents);
+}
+
+bool AppBannerInfoBarDelegateAndroid::AcceptNativeApp(
+ content::WebContents* web_contents) {
+ TrackUserResponse(USER_RESPONSE_NATIVE_APP_ACCEPTED);
+ JNIEnv* env = base::android::AttachCurrentThread();
+
+ TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
+ if (tab == nullptr) {
+ TrackDismissEvent(DISMISS_EVENT_ERROR);
+ return true;
+ }
+ ScopedJavaLocalRef<jstring> jreferrer(
+ ConvertUTF8ToJavaString(env, referrer_));
+
+ bool was_opened =
+ Java_AppBannerInfoBarDelegateAndroid_installOrOpenNativeApp(
+ env, java_delegate_, tab->GetJavaObject(),
+ native_app_data_, jreferrer);
+
+ if (was_opened) {
+ TrackDismissEvent(DISMISS_EVENT_APP_OPEN);
+ } 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())
+ return true;
+ TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED);
+
+ AppBannerSettingsHelper::RecordBannerInstallEvent(
+ web_contents, manifest_.start_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));
+ }
+
+ 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);
- 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);
+ 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));
- }
+ 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");
- return true;
+ // 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) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ if (!success) {
+ // The installation failed.
+ if (infobar())
+ infobar()->RemoveSelf();
+ Java_AppBannerInfoBarDelegateAndroid_showWebApkInstallFailureToast(env);
+ DVLOG(1) << "The WebAPK installation failed.";
+ return;
+ }
+
+ webapk_package_name_ = webapk_package_name;
+ ScopedJavaLocalRef<jstring> java_webapk_package_name =
+ base::android::ConvertUTF8ToJavaString(env, webapk_package_name);
+ Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState(
+ env, java_delegate_, false);
+ Java_AppBannerInfoBarDelegateAndroid_setWebApkPackageName(
+ env, java_delegate_, java_webapk_package_name);
+ UpdateInstallState(env, nullptr);
+}
+
bool AppBannerInfoBarDelegateAndroid::LinkClicked(
WindowOpenDisposition disposition) {
if (native_app_data_.is_null())

Powered by Google App Engine
This is Rietveld 408576698