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

Side by Side Diff: chrome/browser/android/banners/app_banner_infobar_delegate_android.cc

Issue 2301263004: Add WebAPK installation metrics. (Closed)
Patch Set: domnickn@'s comments. 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"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/strings/string16.h" 12 #include "base/strings/string16.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/android/shortcut_helper.h" 14 #include "chrome/browser/android/shortcut_helper.h"
15 #include "chrome/browser/android/shortcut_info.h" 15 #include "chrome/browser/android/shortcut_info.h"
16 #include "chrome/browser/android/tab_android.h" 16 #include "chrome/browser/android/tab_android.h"
17 #include "chrome/browser/android/webapk/webapk_installer.h" 17 #include "chrome/browser/android/webapk/webapk_installer.h"
18 #include "chrome/browser/android/webapk/webapk_metrics.h"
18 #include "chrome/browser/banners/app_banner_manager.h" 19 #include "chrome/browser/banners/app_banner_manager.h"
19 #include "chrome/browser/banners/app_banner_metrics.h" 20 #include "chrome/browser/banners/app_banner_metrics.h"
20 #include "chrome/browser/banners/app_banner_settings_helper.h" 21 #include "chrome/browser/banners/app_banner_settings_helper.h"
21 #include "chrome/browser/browser_process.h" 22 #include "chrome/browser/browser_process.h"
22 #include "chrome/browser/infobars/infobar_service.h" 23 #include "chrome/browser/infobars/infobar_service.h"
23 #include "chrome/browser/ui/android/infobars/app_banner_infobar_android.h" 24 #include "chrome/browser/ui/android/infobars/app_banner_infobar_android.h"
24 #include "chrome/common/render_messages.h" 25 #include "chrome/common/render_messages.h"
25 #include "components/rappor/rappor_utils.h" 26 #include "components/rappor/rappor_utils.h"
26 #include "content/public/browser/render_frame_host.h" 27 #include "content/public/browser/render_frame_host.h"
27 #include "content/public/browser/web_contents.h" 28 #include "content/public/browser/web_contents.h"
28 #include "content/public/common/manifest.h" 29 #include "content/public/common/manifest.h"
29 #include "jni/AppBannerInfoBarDelegateAndroid_jni.h" 30 #include "jni/AppBannerInfoBarDelegateAndroid_jni.h"
30 #include "ui/gfx/android/java_bitmap.h" 31 #include "ui/gfx/android/java_bitmap.h"
31 #include "url/gurl.h" 32 #include "url/gurl.h"
32 33
33 using base::android::ConvertJavaStringToUTF8; 34 using base::android::ConvertJavaStringToUTF8;
34 using base::android::ConvertJavaStringToUTF16; 35 using base::android::ConvertJavaStringToUTF16;
35 using base::android::ConvertUTF8ToJavaString; 36 using base::android::ConvertUTF8ToJavaString;
36 using base::android::ConvertUTF16ToJavaString; 37 using base::android::ConvertUTF16ToJavaString;
37 using base::android::JavaParamRef; 38 using base::android::JavaParamRef;
38 using base::android::ScopedJavaLocalRef; 39 using base::android::ScopedJavaLocalRef;
39 40
40 namespace { 41 namespace {
41 42
42 bool IsInfoEmpty(const ShortcutInfo* info) { 43 bool IsInfoEmpty(const ShortcutInfo* info) {
43 return !info || info->url.is_empty(); 44 return !info || info->url.is_empty();
44 } 45 }
45 46
47 void TrackWebApkInstallationDismissEvents(banners::InstallState install_state) {
dominickn 2016/09/19 01:38:39 As per comment in the .h file, consider making thi
Xi Han 2016/09/20 18:25:18 Done.
48 if (install_state == banners::WAIT_FOR_START)
49 webapk::TrackInstallEvent(webapk::INSTALL_EVENT_ADD_TO_HOME_SCREEN_DISMISS);
dominickn 2016/09/19 01:38:39 Won't you be in the WAIT_FOR_START state if you tr
Xi Han 2016/09/20 18:25:18 Rename it to DISMISS_BEFORE_INSTALLATION.
50 else if (install_state == banners::INSTALLING)
51 webapk::TrackInstallEvent(webapk::INSTALL_EVENT_ADDING_DISMISS);
52 else if (install_state == banners::INSTALLED)
53 webapk::TrackUserAction(webapk::USER_ACTION_INSTALLED_OPEN_DISMISS);
46 } 54 }
47 55
56 } // namespace
57
48 namespace banners { 58 namespace banners {
49 59
50 // static 60 // static
51 bool AppBannerInfoBarDelegateAndroid::Create( 61 bool AppBannerInfoBarDelegateAndroid::Create(
52 content::WebContents* web_contents, 62 content::WebContents* web_contents,
53 base::WeakPtr<AppBannerManager> weak_manager, 63 base::WeakPtr<AppBannerManager> weak_manager,
54 const base::string16& app_title, 64 const base::string16& app_title,
55 std::unique_ptr<ShortcutInfo> shortcut_info, 65 std::unique_ptr<ShortcutInfo> shortcut_info,
56 std::unique_ptr<SkBitmap> icon, 66 std::unique_ptr<SkBitmap> icon,
57 int event_request_id, 67 int event_request_id,
58 bool is_webapk, 68 bool is_webapk,
59 bool start_install_webapk) { 69 bool start_install_webapk) {
60 const GURL& url = shortcut_info->url; 70 const GURL& url = shortcut_info->url;
61 auto infobar_delegate = 71 auto infobar_delegate =
62 base::WrapUnique(new banners::AppBannerInfoBarDelegateAndroid( 72 base::WrapUnique(new banners::AppBannerInfoBarDelegateAndroid(
63 weak_manager, app_title, std::move(shortcut_info), std::move(icon), 73 weak_manager, app_title, std::move(shortcut_info), std::move(icon),
64 event_request_id, is_webapk)); 74 event_request_id, is_webapk));
65 auto raw_delegate = infobar_delegate.get(); 75 auto raw_delegate = infobar_delegate.get();
66 auto infobar = base::MakeUnique<AppBannerInfoBarAndroid>( 76 auto infobar = base::MakeUnique<AppBannerInfoBarAndroid>(
67 std::move(infobar_delegate), url, is_webapk); 77 std::move(infobar_delegate), url, is_webapk);
68 if (!InfoBarService::FromWebContents(web_contents) 78 if (!InfoBarService::FromWebContents(web_contents)
69 ->AddInfoBar(std::move(infobar))) 79 ->AddInfoBar(std::move(infobar)))
70 return false; 80 return false;
71 81
72 if (is_webapk && start_install_webapk) 82 if (is_webapk) {
73 raw_delegate->AcceptWebApk(web_contents); 83 if (start_install_webapk) {
84 raw_delegate->AcceptWebApk(web_contents);
85 webapk::TrackStartType(webapk::STARTED_FROM_ADD_TO_HOME_SCREEN_MENU);
86 } else {
87 webapk::TrackStartType(webapk::TRIGGERED_FROM_BANNER);
dominickn 2016/09/19 01:38:39 See comment in webapk_metrics.h
Xi Han 2016/09/20 18:25:18 Done.
88 }
89 }
74 90
75 return true; 91 return true;
76 } 92 }
77 93
78 // static 94 // static
79 bool AppBannerInfoBarDelegateAndroid::Create( 95 bool AppBannerInfoBarDelegateAndroid::Create(
80 content::WebContents* web_contents, 96 content::WebContents* web_contents,
81 const base::string16& app_title, 97 const base::string16& app_title,
82 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, 98 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data,
83 std::unique_ptr<SkBitmap> icon, 99 std::unique_ptr<SkBitmap> icon,
84 const std::string& native_app_package, 100 const std::string& native_app_package,
85 const std::string& referrer, 101 const std::string& referrer,
86 int event_request_id) { 102 int event_request_id) {
87 auto infobar_delegate = base::WrapUnique(new AppBannerInfoBarDelegateAndroid( 103 auto infobar_delegate = base::WrapUnique(new AppBannerInfoBarDelegateAndroid(
88 app_title, native_app_data, std::move(icon), native_app_package, referrer, 104 app_title, native_app_data, std::move(icon), native_app_package, referrer,
89 event_request_id)); 105 event_request_id));
90 return InfoBarService::FromWebContents(web_contents) 106 return InfoBarService::FromWebContents(web_contents)
91 ->AddInfoBar(base::MakeUnique<AppBannerInfoBarAndroid>( 107 ->AddInfoBar(base::MakeUnique<AppBannerInfoBarAndroid>(
92 std::move(infobar_delegate), native_app_data)); 108 std::move(infobar_delegate), native_app_data));
93 } 109 }
94 110
95 AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() { 111 AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() {
96 weak_ptr_factory_.InvalidateWeakPtrs(); 112 weak_ptr_factory_.InvalidateWeakPtrs();
97 113
98 if (!has_user_interaction_) { 114 if (!has_user_interaction_) {
99 if (!native_app_data_.is_null()) 115 if (!native_app_data_.is_null()) {
100 TrackUserResponse(USER_RESPONSE_NATIVE_APP_IGNORED); 116 TrackUserResponse(USER_RESPONSE_NATIVE_APP_IGNORED);
101 else if (!IsInfoEmpty(shortcut_info_.get())) 117 } else if (!IsInfoEmpty(shortcut_info_.get())) {
102 TrackUserResponse(USER_RESPONSE_WEB_APP_IGNORED); 118 TrackUserResponse(USER_RESPONSE_WEB_APP_IGNORED);
119 if (is_webapk_)
120 webapk::TrackInstallEvent(webapk::INSTALL_EVENT_BANNER_IGNORED);
121 }
103 } 122 }
104 123
105 TrackDismissEvent(DISMISS_EVENT_DISMISSED); 124 TrackDismissEvent(DISMISS_EVENT_DISMISSED);
106 JNIEnv* env = base::android::AttachCurrentThread(); 125 JNIEnv* env = base::android::AttachCurrentThread();
107 Java_AppBannerInfoBarDelegateAndroid_destroy(env, java_delegate_); 126 Java_AppBannerInfoBarDelegateAndroid_destroy(env, java_delegate_);
108 java_delegate_.Reset(); 127 java_delegate_.Reset();
109 } 128 }
110 129
111 void AppBannerInfoBarDelegateAndroid::UpdateInstallState( 130 void AppBannerInfoBarDelegateAndroid::UpdateInstallState(
112 JNIEnv* env, 131 JNIEnv* env,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 // |webapk_package_name_| is set when the WebAPK has finished installing. 188 // |webapk_package_name_| is set when the WebAPK has finished installing.
170 // If the |webapk_package_name_| is empty, it means the "Add to Homescreen" 189 // If the |webapk_package_name_| is empty, it means the "Add to Homescreen"
171 // button is pressed, so request WebAPK installation. Otherwise, it means 190 // button is pressed, so request WebAPK installation. Otherwise, it means
172 // the "Open" button is pressed, so open the installed WebAPK. 191 // the "Open" button is pressed, so open the installed WebAPK.
173 if (!webapk_package_name_.empty()) { 192 if (!webapk_package_name_.empty()) {
174 // Open the WebAPK. 193 // Open the WebAPK.
175 ScopedJavaLocalRef<jstring> java_webapk_package_name = 194 ScopedJavaLocalRef<jstring> java_webapk_package_name =
176 base::android::ConvertUTF8ToJavaString(env, webapk_package_name_); 195 base::android::ConvertUTF8ToJavaString(env, webapk_package_name_);
177 Java_AppBannerInfoBarDelegateAndroid_openWebApk(env, java_delegate_, 196 Java_AppBannerInfoBarDelegateAndroid_openWebApk(env, java_delegate_,
178 java_webapk_package_name); 197 java_webapk_package_name);
179 198 webapk::TrackUserAction(webapk::USER_ACTION_INSTALLED_OPEN);
180 SendBannerAccepted(web_contents, "web"); 199 SendBannerAccepted(web_contents, "web");
181 return true; 200 return true;
dominickn 2016/09/19 01:38:39 If a user already has the WebAPK installed, it see
Xi Han 2016/09/20 18:25:18 This is a good point. I add "has_user_interaction_
dominickn 2016/09/21 06:54:27 This seems reasonable to me.
182 } 201 }
183 202
184 // Request install the WebAPK. 203 // Request install the WebAPK.
204 install_state_ = INSTALLING;
185 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED); 205 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED);
186 AppBannerSettingsHelper::RecordBannerInstallEvent( 206 AppBannerSettingsHelper::RecordBannerInstallEvent(
187 web_contents, shortcut_info_->url.spec(), AppBannerSettingsHelper::WEB); 207 web_contents, shortcut_info_->url.spec(), AppBannerSettingsHelper::WEB);
188 208
189 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState( 209 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState(
190 env, java_delegate_, true); 210 env, java_delegate_, true);
191 UpdateInstallState(env, nullptr); 211 UpdateInstallState(env, nullptr);
192 WebApkInstaller::FinishCallback callback = 212 WebApkInstaller::FinishCallback callback =
193 base::Bind(&AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished, 213 base::Bind(&AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished,
194 weak_ptr_factory_.GetWeakPtr()); 214 weak_ptr_factory_.GetWeakPtr());
(...skipping 14 matching lines...) Expand all
209 std::unique_ptr<SkBitmap> icon, 229 std::unique_ptr<SkBitmap> icon,
210 int event_request_id, 230 int event_request_id,
211 bool is_webapk) 231 bool is_webapk)
212 : weak_manager_(weak_manager), 232 : weak_manager_(weak_manager),
213 app_title_(app_title), 233 app_title_(app_title),
214 shortcut_info_(std::move(shortcut_info)), 234 shortcut_info_(std::move(shortcut_info)),
215 icon_(std::move(icon)), 235 icon_(std::move(icon)),
216 event_request_id_(event_request_id), 236 event_request_id_(event_request_id),
217 has_user_interaction_(false), 237 has_user_interaction_(false),
218 is_webapk_(is_webapk), 238 is_webapk_(is_webapk),
239 install_state_(WAIT_FOR_START),
219 weak_ptr_factory_(this) { 240 weak_ptr_factory_(this) {
220 DCHECK(!IsInfoEmpty(shortcut_info_.get())); 241 DCHECK(!IsInfoEmpty(shortcut_info_.get()));
221 CreateJavaDelegate(); 242 CreateJavaDelegate();
222 } 243 }
223 244
224 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( 245 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid(
225 const base::string16& app_title, 246 const base::string16& app_title,
226 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, 247 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data,
227 std::unique_ptr<SkBitmap> icon, 248 std::unique_ptr<SkBitmap> icon,
228 const std::string& native_app_package, 249 const std::string& native_app_package,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 web_contents->GetMainFrame()->Send( 295 web_contents->GetMainFrame()->Send(
275 new ChromeViewMsg_AppBannerDismissed( 296 new ChromeViewMsg_AppBannerDismissed(
276 web_contents->GetMainFrame()->GetRoutingID(), 297 web_contents->GetMainFrame()->GetRoutingID(),
277 event_request_id_)); 298 event_request_id_));
278 299
279 if (!native_app_data_.is_null()) { 300 if (!native_app_data_.is_null()) {
280 TrackUserResponse(USER_RESPONSE_NATIVE_APP_DISMISSED); 301 TrackUserResponse(USER_RESPONSE_NATIVE_APP_DISMISSED);
281 AppBannerSettingsHelper::RecordBannerDismissEvent( 302 AppBannerSettingsHelper::RecordBannerDismissEvent(
282 web_contents, native_app_package_, AppBannerSettingsHelper::NATIVE); 303 web_contents, native_app_package_, AppBannerSettingsHelper::NATIVE);
283 } else { 304 } else {
305 if (is_webapk_)
306 TrackWebApkInstallationDismissEvents(install_state_);
284 TrackUserResponse(USER_RESPONSE_WEB_APP_DISMISSED); 307 TrackUserResponse(USER_RESPONSE_WEB_APP_DISMISSED);
285 AppBannerSettingsHelper::RecordBannerDismissEvent( 308 AppBannerSettingsHelper::RecordBannerDismissEvent(
286 web_contents, shortcut_info_->url.spec(), AppBannerSettingsHelper::WEB); 309 web_contents, shortcut_info_->url.spec(), AppBannerSettingsHelper::WEB);
287 } 310 }
288 } 311 }
289 312
290 base::string16 AppBannerInfoBarDelegateAndroid::GetMessageText() const { 313 base::string16 AppBannerInfoBarDelegateAndroid::GetMessageText() const {
291 return app_title_; 314 return app_title_;
292 } 315 }
293 316
294 int AppBannerInfoBarDelegateAndroid::GetButtons() const { 317 int AppBannerInfoBarDelegateAndroid::GetButtons() const {
295 return BUTTON_OK; 318 return BUTTON_OK;
296 } 319 }
297 320
298 bool AppBannerInfoBarDelegateAndroid::Accept() { 321 bool AppBannerInfoBarDelegateAndroid::Accept() {
299 has_user_interaction_ = true; 322 has_user_interaction_ = true;
300 323
301 content::WebContents* web_contents = 324 content::WebContents* web_contents =
302 InfoBarService::WebContentsFromInfoBar(infobar()); 325 InfoBarService::WebContentsFromInfoBar(infobar());
303 if (!web_contents) { 326 if (!web_contents) {
304 TrackDismissEvent(DISMISS_EVENT_ERROR); 327 TrackDismissEvent(DISMISS_EVENT_ERROR);
305 return true; 328 return true;
306 } 329 }
307 330
308 if (!native_app_data_.is_null()) 331 if (!native_app_data_.is_null())
309 return AcceptNativeApp(web_contents); 332 return AcceptNativeApp(web_contents);
310 333
311 if (is_webapk_) 334 if (is_webapk_) {
335 webapk::TrackStartType(webapk::STARTED_FROM_BANNER);
312 return AcceptWebApk(web_contents); 336 return AcceptWebApk(web_contents);
337 }
313 338
314 return AcceptWebApp(web_contents); 339 return AcceptWebApp(web_contents);
315 } 340 }
316 341
317 bool AppBannerInfoBarDelegateAndroid::AcceptNativeApp( 342 bool AppBannerInfoBarDelegateAndroid::AcceptNativeApp(
318 content::WebContents* web_contents) { 343 content::WebContents* web_contents) {
319 TrackUserResponse(USER_RESPONSE_NATIVE_APP_ACCEPTED); 344 TrackUserResponse(USER_RESPONSE_NATIVE_APP_ACCEPTED);
320 JNIEnv* env = base::android::AttachCurrentThread(); 345 JNIEnv* env = base::android::AttachCurrentThread();
321 346
322 TabAndroid* tab = TabAndroid::FromWebContents(web_contents); 347 TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 void AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished( 386 void AppBannerInfoBarDelegateAndroid::OnWebApkInstallFinished(
362 bool success, 387 bool success,
363 const std::string& webapk_package_name) { 388 const std::string& webapk_package_name) {
364 JNIEnv* env = base::android::AttachCurrentThread(); 389 JNIEnv* env = base::android::AttachCurrentThread();
365 if (!success) { 390 if (!success) {
366 // The installation failed. 391 // The installation failed.
367 if (infobar()) 392 if (infobar())
368 infobar()->RemoveSelf(); 393 infobar()->RemoveSelf();
369 Java_AppBannerInfoBarDelegateAndroid_showWebApkInstallFailureToast(env); 394 Java_AppBannerInfoBarDelegateAndroid_showWebApkInstallFailureToast(env);
370 DVLOG(1) << "The WebAPK installation failed."; 395 DVLOG(1) << "The WebAPK installation failed.";
396 webapk::TrackInstallEvent(webapk::INSTALL_EVENT_FAILED);
371 return; 397 return;
372 } 398 }
373 399
374 webapk_package_name_ = webapk_package_name; 400 webapk_package_name_ = webapk_package_name;
375 ScopedJavaLocalRef<jstring> java_webapk_package_name = 401 ScopedJavaLocalRef<jstring> java_webapk_package_name =
376 base::android::ConvertUTF8ToJavaString(env, webapk_package_name); 402 base::android::ConvertUTF8ToJavaString(env, webapk_package_name);
377 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState( 403 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState(
378 env, java_delegate_, false); 404 env, java_delegate_, false);
379 Java_AppBannerInfoBarDelegateAndroid_setWebApkPackageName( 405 Java_AppBannerInfoBarDelegateAndroid_setWebApkPackageName(
380 env, java_delegate_, java_webapk_package_name); 406 env, java_delegate_, java_webapk_package_name);
381 UpdateInstallState(env, nullptr); 407 UpdateInstallState(env, nullptr);
408 install_state_ = INSTALLED;
409 webapk::TrackInstallEvent(webapk::INSTALL_EVENT_COMPLETED);
382 } 410 }
383 411
384 bool AppBannerInfoBarDelegateAndroid::LinkClicked( 412 bool AppBannerInfoBarDelegateAndroid::LinkClicked(
385 WindowOpenDisposition disposition) { 413 WindowOpenDisposition disposition) {
386 if (native_app_data_.is_null()) 414 if (native_app_data_.is_null())
387 return false; 415 return false;
388 416
389 // Try to show the details for the native app. 417 // Try to show the details for the native app.
390 JNIEnv* env = base::android::AttachCurrentThread(); 418 JNIEnv* env = base::android::AttachCurrentThread();
391 419
392 content::WebContents* web_contents = 420 content::WebContents* web_contents =
393 InfoBarService::WebContentsFromInfoBar(infobar()); 421 InfoBarService::WebContentsFromInfoBar(infobar());
394 TabAndroid* tab = TabAndroid::FromWebContents(web_contents); 422 TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
395 DCHECK(tab); 423 DCHECK(tab);
396 424
397 Java_AppBannerInfoBarDelegateAndroid_showAppDetails( 425 Java_AppBannerInfoBarDelegateAndroid_showAppDetails(
398 env, java_delegate_, tab->GetJavaObject(), native_app_data_); 426 env, java_delegate_, tab->GetJavaObject(), native_app_data_);
399 427
400 TrackDismissEvent(DISMISS_EVENT_BANNER_CLICK); 428 TrackDismissEvent(DISMISS_EVENT_BANNER_CLICK);
401 return true; 429 return true;
402 } 430 }
403 431
404 bool RegisterAppBannerInfoBarDelegateAndroid(JNIEnv* env) { 432 bool RegisterAppBannerInfoBarDelegateAndroid(JNIEnv* env) {
405 return RegisterNativesImpl(env); 433 return RegisterNativesImpl(env);
406 } 434 }
407 435
408 } // namespace banners 436 } // namespace banners
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698