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 |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |