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

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

Issue 1569893003: Add "Request app banner" context menu in DevTools (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Android support Created 4 years, 11 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_manager_android.h" 5 #include "chrome/browser/android/banners/app_banner_manager_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 "chrome/browser/android/banners/app_banner_data_fetcher_android.h" 9 #include "chrome/browser/android/banners/app_banner_data_fetcher_android.h"
10 #include "chrome/browser/android/shortcut_helper.h" 10 #include "chrome/browser/android/shortcut_helper.h"
11 #include "chrome/browser/banners/app_banner_metrics.h" 11 #include "chrome/browser/banners/app_banner_metrics.h"
12 #include "chrome/common/chrome_constants.h" 12 #include "chrome/common/chrome_constants.h"
13 #include "content/public/browser/render_frame_host.h"
13 #include "content/public/browser/web_contents.h" 14 #include "content/public/browser/web_contents.h"
14 #include "content/public/common/frame_navigate_params.h" 15 #include "content/public/common/frame_navigate_params.h"
15 #include "jni/AppBannerManager_jni.h" 16 #include "jni/AppBannerManager_jni.h"
16 17
17 using base::android::ConvertJavaStringToUTF8; 18 using base::android::ConvertJavaStringToUTF8;
18 using base::android::ConvertJavaStringToUTF16; 19 using base::android::ConvertJavaStringToUTF16;
19 using base::android::ConvertUTF8ToJavaString; 20 using base::android::ConvertUTF8ToJavaString;
20 using base::android::ConvertUTF16ToJavaString; 21 using base::android::ConvertUTF16ToJavaString;
21 22
22 namespace { 23 namespace {
(...skipping 26 matching lines...) Expand all
49 JNIEnv* env, 50 JNIEnv* env,
50 const JavaParamRef<jobject>& obj, 51 const JavaParamRef<jobject>& obj,
51 const JavaParamRef<jobject>& jweb_contents) { 52 const JavaParamRef<jobject>& jweb_contents) {
52 content::WebContents* web_contents = 53 content::WebContents* web_contents =
53 content::WebContents::FromJavaWebContents(jweb_contents); 54 content::WebContents::FromJavaWebContents(jweb_contents);
54 AppBannerManager::ReplaceWebContents(web_contents); 55 AppBannerManager::ReplaceWebContents(web_contents);
55 } 56 }
56 57
57 bool AppBannerManagerAndroid::HandleNonWebApp(const std::string& platform, 58 bool AppBannerManagerAndroid::HandleNonWebApp(const std::string& platform,
58 const GURL& url, 59 const GURL& url,
59 const std::string& id) { 60 const std::string& id,
60 if (!CheckPlatformAndId(platform, id)) 61 bool is_debug_mode) {
62 if (!CheckPlatformAndId(platform, id, is_debug_mode))
61 return false; 63 return false;
62 64
63 banners::TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_REQUESTED); 65 banners::TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_REQUESTED);
64 66
65 // Send the info to the Java side to get info about the app. 67 // Send the info to the Java side to get info about the app.
66 JNIEnv* env = base::android::AttachCurrentThread(); 68 JNIEnv* env = base::android::AttachCurrentThread();
67 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env); 69 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env);
68 if (jobj.is_null()) 70 if (jobj.is_null())
69 return false; 71 return false;
70 72
71 std::string id_from_app_url = ExtractQueryValueForName(url, kIdName); 73 std::string id_from_app_url = ExtractQueryValueForName(url, kIdName);
72 if (id_from_app_url.size() && id != id_from_app_url) { 74 if (id_from_app_url.size() && id != id_from_app_url) {
73 banners::OutputDeveloperDebugMessage(web_contents(), 75 banners::OutputDeveloperDebugMessage(
74 banners::kIgnoredIdsDoNotMatch); 76 web_contents(), banners::kIgnoredIdsDoNotMatch, is_debug_mode);
75 return false; 77 return false;
76 } 78 }
77 79
78 std::string referrer = 80 std::string referrer =
79 ExtractQueryValueForName(url, kReferrerName); 81 ExtractQueryValueForName(url, kReferrerName);
80 82
81 // Attach the chrome_inline referrer value, prefixed with "&" if the referrer 83 // Attach the chrome_inline referrer value, prefixed with "&" if the referrer
82 // is non empty. 84 // is non empty.
83 if (referrer.empty()) 85 if (referrer.empty())
84 referrer = kPlayInlineReferrer; 86 referrer = kPlayInlineReferrer;
85 else 87 else
86 referrer.append("&").append(kPlayInlineReferrer); 88 referrer.append("&").append(kPlayInlineReferrer);
87 89
88 ScopedJavaLocalRef<jstring> jurl( 90 ScopedJavaLocalRef<jstring> jurl(
89 ConvertUTF8ToJavaString(env, data_fetcher()->validated_url().spec())); 91 ConvertUTF8ToJavaString(env, data_fetcher()->validated_url().spec()));
90 ScopedJavaLocalRef<jstring> jpackage( 92 ScopedJavaLocalRef<jstring> jpackage(
91 ConvertUTF8ToJavaString(env, id)); 93 ConvertUTF8ToJavaString(env, id));
92 ScopedJavaLocalRef<jstring> jreferrer( 94 ScopedJavaLocalRef<jstring> jreferrer(
93 ConvertUTF8ToJavaString(env, referrer)); 95 ConvertUTF8ToJavaString(env, referrer));
94 Java_AppBannerManager_fetchAppDetails( 96 Java_AppBannerManager_fetchAppDetails(
95 env, jobj.obj(), jurl.obj(), 97 env, jobj.obj(), jurl.obj(),
96 jpackage.obj(), jreferrer.obj(), 98 jpackage.obj(), jreferrer.obj(),
97 ShortcutHelper::GetIdealHomescreenIconSizeInDp()); 99 ShortcutHelper::GetIdealHomescreenIconSizeInDp());
98 return true; 100 return true;
99 } 101 }
100 102
101 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, 103 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform,
102 const std::string& id) { 104 const std::string& id,
105 bool is_debug_mode) {
103 if (platform != kPlayPlatform) { 106 if (platform != kPlayPlatform) {
104 banners::OutputDeveloperDebugMessage( 107 banners::OutputDeveloperDebugMessage(
105 web_contents(), platform + banners::kIgnoredNotSupportedOnAndroid); 108 web_contents(), platform + banners::kIgnoredNotSupportedOnAndroid,
109 is_debug_mode);
106 return false; 110 return false;
107 } 111 }
108 if (id.empty()) { 112 if (id.empty()) {
109 banners::OutputDeveloperDebugMessage(web_contents(), banners::kIgnoredNoId); 113 banners::OutputDeveloperDebugMessage(web_contents(), banners::kIgnoredNoId,
114 is_debug_mode);
110 return false; 115 return false;
111 } 116 }
112 return true; 117 return true;
113 } 118 }
114 119
115 bool AppBannerManagerAndroid::CheckFetcherMatchesContents() { 120 bool AppBannerManagerAndroid::CheckFetcherMatchesContents(bool is_debug_mode) {
116 if (!web_contents()) 121 if (!web_contents())
117 return false; 122 return false;
118 123
119 if (!data_fetcher() || 124 if (!data_fetcher() ||
120 data_fetcher()->validated_url() != web_contents()->GetURL()) { 125 data_fetcher()->validated_url() != web_contents()->GetURL()) {
121 banners::OutputDeveloperNotShownMessage( 126 banners::OutputDeveloperNotShownMessage(
122 web_contents(), banners::kUserNavigatedBeforeBannerShown); 127 web_contents(), banners::kUserNavigatedBeforeBannerShown,
128 is_debug_mode);
123 return false; 129 return false;
124 } 130 }
125 return true; 131 return true;
126 } 132 }
127 133
128 std::string AppBannerManagerAndroid::ExtractQueryValueForName( 134 std::string AppBannerManagerAndroid::ExtractQueryValueForName(
129 const GURL& url, 135 const GURL& url,
130 const std::string& name) { 136 const std::string& name) {
131 url::Component query = url.parsed_for_possibly_invalid_spec().query; 137 url::Component query = url.parsed_for_possibly_invalid_spec().query;
132 url::Component key, value; 138 url::Component key, value;
133 const char* url_spec = url.spec().c_str(); 139 const char* url_spec = url.spec().c_str();
134 140
135 while (url::ExtractQueryKeyValue(url_spec, &query, &key, &value)) { 141 while (url::ExtractQueryKeyValue(url_spec, &query, &key, &value)) {
136 std::string key_str(url_spec, key.begin, key.len); 142 std::string key_str(url_spec, key.begin, key.len);
137 std::string value_str(url_spec, value.begin, value.len); 143 std::string value_str(url_spec, value.begin, value.len);
138 if (key_str == name) 144 if (key_str == name)
139 return value_str; 145 return value_str;
140 } 146 }
141 return ""; 147 return "";
142 } 148 }
143 149
144 AppBannerDataFetcher* AppBannerManagerAndroid::CreateAppBannerDataFetcher( 150 AppBannerDataFetcher* AppBannerManagerAndroid::CreateAppBannerDataFetcher(
145 base::WeakPtr<Delegate> weak_delegate) { 151 base::WeakPtr<Delegate> weak_delegate,
152 bool is_debug_mode) {
146 return new AppBannerDataFetcherAndroid( 153 return new AppBannerDataFetcherAndroid(
147 web_contents(), 154 web_contents(), weak_delegate,
148 weak_delegate,
149 ShortcutHelper::GetIdealHomescreenIconSizeInDp(), 155 ShortcutHelper::GetIdealHomescreenIconSizeInDp(),
150 ShortcutHelper::GetMinimumHomescreenIconSizeInDp(), 156 ShortcutHelper::GetMinimumHomescreenIconSizeInDp(),
151 ShortcutHelper::GetIdealSplashImageSizeInDp(), 157 ShortcutHelper::GetIdealSplashImageSizeInDp(),
152 ShortcutHelper::GetMinimumSplashImageSizeInDp()); 158 ShortcutHelper::GetMinimumSplashImageSizeInDp(), is_debug_mode);
153 } 159 }
154 160
155 bool AppBannerManagerAndroid::OnAppDetailsRetrieved( 161 bool AppBannerManagerAndroid::OnAppDetailsRetrieved(
156 JNIEnv* env, 162 JNIEnv* env,
157 const JavaParamRef<jobject>& obj, 163 const JavaParamRef<jobject>& obj,
158 const JavaParamRef<jobject>& japp_data, 164 const JavaParamRef<jobject>& japp_data,
159 const JavaParamRef<jstring>& japp_title, 165 const JavaParamRef<jstring>& japp_title,
160 const JavaParamRef<jstring>& japp_package, 166 const JavaParamRef<jstring>& japp_package,
161 const JavaParamRef<jstring>& jicon_url) { 167 const JavaParamRef<jstring>& jicon_url) {
162 if (!CheckFetcherMatchesContents()) 168 AppBannerDataFetcherAndroid* android_fetcher =
169 static_cast<AppBannerDataFetcherAndroid*>(data_fetcher().get());
170 if (!CheckFetcherMatchesContents(android_fetcher->is_debug_mode()))
163 return false; 171 return false;
164 172
165 GURL image_url = GURL(ConvertJavaStringToUTF8(env, jicon_url)); 173 GURL image_url = GURL(ConvertJavaStringToUTF8(env, jicon_url));
166 174
167 AppBannerDataFetcherAndroid* android_fetcher =
168 static_cast<AppBannerDataFetcherAndroid*>(data_fetcher().get());
169 return android_fetcher->ContinueFetching( 175 return android_fetcher->ContinueFetching(
170 ConvertJavaStringToUTF16(env, japp_title), 176 ConvertJavaStringToUTF16(env, japp_title),
171 ConvertJavaStringToUTF8(env, japp_package), japp_data, image_url); 177 ConvertJavaStringToUTF8(env, japp_package), japp_data, image_url);
172 } 178 }
173 179
174 bool AppBannerManagerAndroid::IsFetcherActive( 180 bool AppBannerManagerAndroid::IsFetcherActive(
175 JNIEnv* env, 181 JNIEnv* env,
176 const JavaParamRef<jobject>& obj) { 182 const JavaParamRef<jobject>& obj) {
177 return AppBannerManager::IsFetcherActive(); 183 return AppBannerManager::IsFetcherActive();
178 } 184 }
179 185
186 void AppBannerManagerAndroid::OpenAppBanner(JNIEnv* env,
187 const JavaParamRef<jobject>& obj) {
188 content::RenderFrameHost* frame = web_contents()->GetMainFrame();
189 AppBannerManager::TriggerAppBannerFetch(frame, frame->GetLastCommittedURL(),
190 true);
dominickn 2016/01/17 23:20:18 Nit: could you call this as: AppBannerManager::T
horo 2016/01/18 06:28:56 Done.
191 }
192
180 // static 193 // static
181 bool AppBannerManagerAndroid::Register(JNIEnv* env) { 194 bool AppBannerManagerAndroid::Register(JNIEnv* env) {
182 return RegisterNativesImpl(env); 195 return RegisterNativesImpl(env);
183 } 196 }
184 197
185 jlong Init(JNIEnv* env, 198 jlong Init(JNIEnv* env,
186 const JavaParamRef<jobject>& obj) { 199 const JavaParamRef<jobject>& obj) {
187 AppBannerManagerAndroid* manager = new AppBannerManagerAndroid(env, obj); 200 AppBannerManagerAndroid* manager = new AppBannerManagerAndroid(env, obj);
188 return reinterpret_cast<intptr_t>(manager); 201 return reinterpret_cast<intptr_t>(manager);
189 } 202 }
(...skipping 11 matching lines...) Expand all
201 214
202 void SetEngagementWeights(JNIEnv* env, 215 void SetEngagementWeights(JNIEnv* env,
203 const JavaParamRef<jclass>& clazz, 216 const JavaParamRef<jclass>& clazz,
204 jdouble direct_engagement, 217 jdouble direct_engagement,
205 jdouble indirect_engagement) { 218 jdouble indirect_engagement) {
206 AppBannerManager::SetEngagementWeights(direct_engagement, 219 AppBannerManager::SetEngagementWeights(direct_engagement,
207 indirect_engagement); 220 indirect_engagement);
208 } 221 }
209 222
210 } // namespace banners 223 } // namespace banners
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698