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