Chromium Code Reviews| 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 |