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

Side by Side 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: Remove InstallWebApk from infobar. 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 "chrome/browser/android/banners/app_banner_infobar_delegate_android.h" 5 #include "chrome/browser/android/banners/app_banner_infobar_delegate_android.h"
6 6
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/guid.h" 9 #include "base/guid.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 19 matching lines...) Expand all
30 #include "ui/gfx/android/java_bitmap.h" 30 #include "ui/gfx/android/java_bitmap.h"
31 #include "url/gurl.h" 31 #include "url/gurl.h"
32 32
33 using base::android::ConvertJavaStringToUTF8; 33 using base::android::ConvertJavaStringToUTF8;
34 using base::android::ConvertJavaStringToUTF16; 34 using base::android::ConvertJavaStringToUTF16;
35 using base::android::ConvertUTF8ToJavaString; 35 using base::android::ConvertUTF8ToJavaString;
36 using base::android::ConvertUTF16ToJavaString; 36 using base::android::ConvertUTF16ToJavaString;
37 using base::android::JavaParamRef; 37 using base::android::JavaParamRef;
38 using base::android::ScopedJavaLocalRef; 38 using base::android::ScopedJavaLocalRef;
39 39
40 namespace {
41
42 bool isShortcutInfoEmpty(ShortcutInfo* info) {
dominickn 2016/09/01 05:22:00 Nit: IsInfoEmpty(), and it should take a const Sho
Xi Han 2016/09/01 18:44:14 Done.
43 return !info || info->url.is_empty();
44 }
45
46 } // anonymous namespace
47
40 namespace banners { 48 namespace banners {
41 49
42 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( 50 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid(
43 base::WeakPtr<AppBannerManager> weak_manager, 51 base::WeakPtr<AppBannerManager> weak_manager,
44 const base::string16& app_title, 52 const base::string16& app_title,
45 const GURL& manifest_url, 53 const GURL& manifest_url,
46 const content::Manifest& manifest, 54 std::unique_ptr<ShortcutInfo> info,
dominickn 2016/09/01 05:22:00 Don't change the signature of this method. Instead
Xi Han 2016/09/01 18:44:13 I change the signature because AddToHonmeScreenMan
dominickn 2016/09/02 01:00:58 Acknowledged - nice delegation of constructors. Ho
Xi Han 2016/09/02 13:58:23 I am confused, since that is what I did before. I
dominickn 2016/09/02 14:30:48 Oh, wow, sorry for the water-in-the-brain reviewin
Xi Han 2016/09/02 15:01:50 No worries, just reverted it:)
47 const GURL& icon_url, 55 const GURL& icon_url,
48 std::unique_ptr<SkBitmap> icon, 56 std::unique_ptr<SkBitmap> icon,
49 int event_request_id, 57 int event_request_id,
50 bool is_webapk) 58 bool is_webapk)
51 : weak_manager_(weak_manager), 59 : weak_manager_(weak_manager),
52 app_title_(app_title), 60 app_title_(app_title),
53 manifest_url_(manifest_url), 61 manifest_url_(manifest_url),
54 manifest_(manifest), 62 info_(std::move(info)),
55 icon_url_(icon_url), 63 icon_url_(icon_url),
56 icon_(std::move(icon)), 64 icon_(std::move(icon)),
57 event_request_id_(event_request_id), 65 event_request_id_(event_request_id),
58 has_user_interaction_(false), 66 has_user_interaction_(false),
59 is_webapk_(is_webapk), 67 is_webapk_(is_webapk),
60 weak_ptr_factory_(this) { 68 weak_ptr_factory_(this) {
61 DCHECK(!manifest.IsEmpty()); 69 DCHECK(!isShortcutInfoEmpty(info_.get()));
62 CreateJavaDelegate(); 70 CreateJavaDelegate();
63 } 71 }
64 72
65 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( 73 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid(
66 const base::string16& app_title, 74 const base::string16& app_title,
67 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, 75 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data,
68 std::unique_ptr<SkBitmap> icon, 76 std::unique_ptr<SkBitmap> icon,
69 const std::string& native_app_package, 77 const std::string& native_app_package,
70 const std::string& referrer, 78 const std::string& referrer,
71 int event_request_id) 79 int event_request_id)
72 : app_title_(app_title), 80 : app_title_(app_title),
73 native_app_data_(native_app_data), 81 native_app_data_(native_app_data),
74 icon_(std::move(icon)), 82 icon_(std::move(icon)),
75 native_app_package_(native_app_package), 83 native_app_package_(native_app_package),
76 referrer_(referrer), 84 referrer_(referrer),
77 event_request_id_(event_request_id), 85 event_request_id_(event_request_id),
78 has_user_interaction_(false), 86 has_user_interaction_(false),
79 weak_ptr_factory_(this) { 87 weak_ptr_factory_(this) {
80 DCHECK(!native_app_data_.is_null()); 88 DCHECK(!native_app_data_.is_null());
81 CreateJavaDelegate(); 89 CreateJavaDelegate();
82 } 90 }
83 91
84 AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() { 92 AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() {
85 weak_ptr_factory_.InvalidateWeakPtrs(); 93 weak_ptr_factory_.InvalidateWeakPtrs();
86 94
87 if (!has_user_interaction_) { 95 if (!has_user_interaction_) {
88 if (!native_app_data_.is_null()) 96 if (!native_app_data_.is_null())
89 TrackUserResponse(USER_RESPONSE_NATIVE_APP_IGNORED); 97 TrackUserResponse(USER_RESPONSE_NATIVE_APP_IGNORED);
90 else if (!manifest_.IsEmpty()) 98 else if (!isShortcutInfoEmpty(info_.get()))
91 TrackUserResponse(USER_RESPONSE_WEB_APP_IGNORED); 99 TrackUserResponse(USER_RESPONSE_WEB_APP_IGNORED);
92 } 100 }
93 101
94 TrackDismissEvent(DISMISS_EVENT_DISMISSED); 102 TrackDismissEvent(DISMISS_EVENT_DISMISSED);
95 JNIEnv* env = base::android::AttachCurrentThread(); 103 JNIEnv* env = base::android::AttachCurrentThread();
96 Java_AppBannerInfoBarDelegateAndroid_destroy(env, java_delegate_); 104 Java_AppBannerInfoBarDelegateAndroid_destroy(env, java_delegate_);
97 java_delegate_.Reset(); 105 java_delegate_.Reset();
98 } 106 }
99 107
100 void AppBannerInfoBarDelegateAndroid::UpdateInstallState( 108 void AppBannerInfoBarDelegateAndroid::UpdateInstallState(
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 155
148 if (success) { 156 if (success) {
149 TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_COMPLETED); 157 TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_COMPLETED);
150 UpdateInstallState(env, obj); 158 UpdateInstallState(env, obj);
151 } else if (infobar()->owner()) { 159 } else if (infobar()->owner()) {
152 TrackDismissEvent(DISMISS_EVENT_INSTALL_TIMEOUT); 160 TrackDismissEvent(DISMISS_EVENT_INSTALL_TIMEOUT);
153 infobar()->owner()->RemoveInfoBar(infobar()); 161 infobar()->owner()->RemoveInfoBar(infobar());
154 } 162 }
155 } 163 }
156 164
165 void AppBannerInfoBarDelegateAndroid::InstallWebApk(
166 content::WebContents* web_contents) {
167 if (!web_contents) {
168 LOG(ERROR) << "Failed to create infobar to install the WebAPK: "
169 << "the associated WebContents is null.";
170 return;
171 }
172 AcceptWebApk(web_contents);
173 }
174
157 void AppBannerInfoBarDelegateAndroid::CreateJavaDelegate() { 175 void AppBannerInfoBarDelegateAndroid::CreateJavaDelegate() {
158 JNIEnv* env = base::android::AttachCurrentThread(); 176 JNIEnv* env = base::android::AttachCurrentThread();
159 java_delegate_.Reset(Java_AppBannerInfoBarDelegateAndroid_create( 177 java_delegate_.Reset(Java_AppBannerInfoBarDelegateAndroid_create(
160 env, 178 env,
161 reinterpret_cast<intptr_t>(this))); 179 reinterpret_cast<intptr_t>(this)));
162 } 180 }
163 181
164 void AppBannerInfoBarDelegateAndroid::SendBannerAccepted( 182 void AppBannerInfoBarDelegateAndroid::SendBannerAccepted(
165 content::WebContents* web_contents, 183 content::WebContents* web_contents,
166 const std::string& platform) { 184 const std::string& platform) {
(...skipping 23 matching lines...) Expand all
190 208
191 web_contents->GetMainFrame()->Send( 209 web_contents->GetMainFrame()->Send(
192 new ChromeViewMsg_AppBannerDismissed( 210 new ChromeViewMsg_AppBannerDismissed(
193 web_contents->GetMainFrame()->GetRoutingID(), 211 web_contents->GetMainFrame()->GetRoutingID(),
194 event_request_id_)); 212 event_request_id_));
195 213
196 if (!native_app_data_.is_null()) { 214 if (!native_app_data_.is_null()) {
197 TrackUserResponse(USER_RESPONSE_NATIVE_APP_DISMISSED); 215 TrackUserResponse(USER_RESPONSE_NATIVE_APP_DISMISSED);
198 AppBannerSettingsHelper::RecordBannerDismissEvent( 216 AppBannerSettingsHelper::RecordBannerDismissEvent(
199 web_contents, native_app_package_, AppBannerSettingsHelper::NATIVE); 217 web_contents, native_app_package_, AppBannerSettingsHelper::NATIVE);
200 } else if (!manifest_.IsEmpty()) { 218 } else if (!isShortcutInfoEmpty(info_.get())) {
201 TrackUserResponse(USER_RESPONSE_WEB_APP_DISMISSED); 219 TrackUserResponse(USER_RESPONSE_WEB_APP_DISMISSED);
202 AppBannerSettingsHelper::RecordBannerDismissEvent( 220 AppBannerSettingsHelper::RecordBannerDismissEvent(
203 web_contents, manifest_.start_url.spec(), 221 web_contents, info_->url.spec(),
204 AppBannerSettingsHelper::WEB); 222 AppBannerSettingsHelper::WEB);
205 } 223 }
206 } 224 }
207 225
208 base::string16 AppBannerInfoBarDelegateAndroid::GetMessageText() const { 226 base::string16 AppBannerInfoBarDelegateAndroid::GetMessageText() const {
209 return app_title_; 227 return app_title_;
210 } 228 }
211 229
212 int AppBannerInfoBarDelegateAndroid::GetButtons() const { 230 int AppBannerInfoBarDelegateAndroid::GetButtons() const {
213 return BUTTON_OK; 231 return BUTTON_OK;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 TrackDismissEvent(DISMISS_EVENT_APP_OPEN); 271 TrackDismissEvent(DISMISS_EVENT_APP_OPEN);
254 } else { 272 } else {
255 TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_TRIGGERED); 273 TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_TRIGGERED);
256 } 274 }
257 SendBannerAccepted(web_contents, "play"); 275 SendBannerAccepted(web_contents, "play");
258 return was_opened; 276 return was_opened;
259 } 277 }
260 278
261 bool AppBannerInfoBarDelegateAndroid::AcceptWebApp( 279 bool AppBannerInfoBarDelegateAndroid::AcceptWebApp(
262 content::WebContents* web_contents) { 280 content::WebContents* web_contents) {
263 if (manifest_.IsEmpty()) 281 if (isShortcutInfoEmpty(info_.get()))
264 return true; 282 return true;
265 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED); 283 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED);
266 284
267 AppBannerSettingsHelper::RecordBannerInstallEvent( 285 AppBannerSettingsHelper::RecordBannerInstallEvent(
268 web_contents, manifest_.start_url.spec(), 286 web_contents, info_->url.spec(),
269 AppBannerSettingsHelper::WEB); 287 AppBannerSettingsHelper::WEB);
270 288
271 if (weak_manager_) { 289 if (weak_manager_) {
272 ShortcutInfo info(GURL::EmptyGURL());
273 info.UpdateFromManifest(manifest_);
274 info.manifest_url = manifest_url_;
275 info.icon_url = icon_url_;
276 info.UpdateSource(ShortcutInfo::SOURCE_APP_BANNER);
277
278 const std::string& uid = base::GenerateGUID(); 290 const std::string& uid = base::GenerateGUID();
279 ShortcutHelper::AddToLauncherWithSkBitmap( 291 ShortcutHelper::AddToLauncherWithSkBitmap(
280 web_contents->GetBrowserContext(), info, uid, *icon_.get(), 292 web_contents->GetBrowserContext(), *info_.get(), uid, *icon_.get(),
281 weak_manager_->FetchWebappSplashScreenImageCallback(uid)); 293 weak_manager_->FetchWebappSplashScreenImageCallback(uid));
282 } 294 }
283 295
284 SendBannerAccepted(web_contents, "web"); 296 SendBannerAccepted(web_contents, "web");
285 return true; 297 return true;
286 } 298 }
287 299
288 bool AppBannerInfoBarDelegateAndroid::AcceptWebApk( 300 bool AppBannerInfoBarDelegateAndroid::AcceptWebApk(
289 content::WebContents* web_contents) { 301 content::WebContents* web_contents) {
290 if (manifest_.IsEmpty()) 302 if (isShortcutInfoEmpty(info_.get()))
291 return true; 303 return true;
292 304
293 JNIEnv* env = base::android::AttachCurrentThread(); 305 JNIEnv* env = base::android::AttachCurrentThread();
294 // |webapk_package_name_| is set when the WebAPK has finished installing. 306 // |webapk_package_name_| is set when the WebAPK has finished installing.
295 // If the |webapk_package_name_| is empty, it means the "Add to Homescreen" 307 // If the |webapk_package_name_| is empty, it means the "Add to Homescreen"
296 // button is pressed, so request WebAPK installation. Otherwise, it means 308 // button is pressed, so request WebAPK installation. Otherwise, it means
297 // the "Open" button is pressed, then open the installed WebAPK. 309 // the "Open" button is pressed, then open the installed WebAPK.
298 if (webapk_package_name_.empty()) { 310 if (webapk_package_name_.empty()) {
299 // Request install the WebAPK. 311 // Request install the WebAPK.
300 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED); 312 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED);
301 313
302 AppBannerSettingsHelper::RecordBannerInstallEvent( 314 AppBannerSettingsHelper::RecordBannerInstallEvent(
303 web_contents, manifest_.start_url.spec(), 315 web_contents, info_->url.spec(),
304 AppBannerSettingsHelper::WEB); 316 AppBannerSettingsHelper::WEB);
305 317
306 ShortcutInfo info(GURL::EmptyGURL());
307 info.UpdateFromManifest(manifest_);
308 info.manifest_url = manifest_url_;
309 info.icon_url = icon_url_;
310 info.UpdateSource(ShortcutInfo::SOURCE_APP_BANNER);
311
312 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState( 318 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState(
313 env, java_delegate_, true); 319 env, java_delegate_, true);
314 UpdateInstallState(env, nullptr); 320 UpdateInstallState(env, nullptr);
315 321
316 WebApkInstaller::FinishCallback callback = base::Bind( 322 WebApkInstaller::FinishCallback callback = base::Bind(
317 &AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished, 323 &AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished,
318 weak_ptr_factory_.GetWeakPtr()); 324 weak_ptr_factory_.GetWeakPtr());
319 DVLOG(1) << "Trigger the installation of the WebAPK."; 325 DVLOG(1) << "Trigger the installation of the WebAPK.";
320 ShortcutHelper::InstallWebApkWithSkBitmap( 326 ShortcutHelper::InstallWebApkWithSkBitmap(
321 web_contents->GetBrowserContext(), info, *icon_.get(), callback); 327 web_contents->GetBrowserContext(), *info_.get(),
328 *icon_.get(), callback);
322 329
323 SendBannerAccepted(web_contents, "web"); 330 SendBannerAccepted(web_contents, "web");
324 // Returns false to prevent the infobar from disappearing. 331 // Returns false to prevent the infobar from disappearing.
325 return false; 332 return false;
326 } 333 }
327 334
328 // Open the WebAPK. 335 // Open the WebAPK.
329 ScopedJavaLocalRef<jstring> java_webapk_package_name = 336 ScopedJavaLocalRef<jstring> java_webapk_package_name =
330 base::android::ConvertUTF8ToJavaString(env, webapk_package_name_); 337 base::android::ConvertUTF8ToJavaString(env, webapk_package_name_);
331 Java_AppBannerInfoBarDelegateAndroid_openWebApk( 338 Java_AppBannerInfoBarDelegateAndroid_openWebApk(
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 387
381 TrackDismissEvent(DISMISS_EVENT_BANNER_CLICK); 388 TrackDismissEvent(DISMISS_EVENT_BANNER_CLICK);
382 return true; 389 return true;
383 } 390 }
384 391
385 bool RegisterAppBannerInfoBarDelegateAndroid(JNIEnv* env) { 392 bool RegisterAppBannerInfoBarDelegateAndroid(JNIEnv* env) {
386 return RegisterNativesImpl(env); 393 return RegisterNativesImpl(env);
387 } 394 }
388 395
389 } // namespace banners 396 } // namespace banners
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698