| 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" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 JNIEnv* env, | 49 JNIEnv* env, |
| 50 const JavaParamRef<jobject>& obj, | 50 const JavaParamRef<jobject>& obj, |
| 51 const JavaParamRef<jobject>& jweb_contents) { | 51 const JavaParamRef<jobject>& jweb_contents) { |
| 52 content::WebContents* web_contents = | 52 content::WebContents* web_contents = |
| 53 content::WebContents::FromJavaWebContents(jweb_contents); | 53 content::WebContents::FromJavaWebContents(jweb_contents); |
| 54 AppBannerManager::ReplaceWebContents(web_contents); | 54 AppBannerManager::ReplaceWebContents(web_contents); |
| 55 } | 55 } |
| 56 | 56 |
| 57 bool AppBannerManagerAndroid::HandleNonWebApp(const std::string& platform, | 57 bool AppBannerManagerAndroid::HandleNonWebApp(const std::string& platform, |
| 58 const GURL& url, | 58 const GURL& url, |
| 59 const std::string& id) { | 59 const std::string& id, |
| 60 if (!CheckPlatformAndId(platform, id)) | 60 bool is_debug_mode) { |
| 61 if (!CheckPlatformAndId(platform, id, is_debug_mode)) |
| 61 return false; | 62 return false; |
| 62 | 63 |
| 63 banners::TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_REQUESTED); | 64 banners::TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_REQUESTED); |
| 64 | 65 |
| 65 // Send the info to the Java side to get info about the app. | 66 // Send the info to the Java side to get info about the app. |
| 66 JNIEnv* env = base::android::AttachCurrentThread(); | 67 JNIEnv* env = base::android::AttachCurrentThread(); |
| 67 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env); | 68 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env); |
| 68 if (jobj.is_null()) | 69 if (jobj.is_null()) |
| 69 return false; | 70 return false; |
| 70 | 71 |
| 71 std::string id_from_app_url = ExtractQueryValueForName(url, kIdName); | 72 std::string id_from_app_url = ExtractQueryValueForName(url, kIdName); |
| 72 if (id_from_app_url.size() && id != id_from_app_url) { | 73 if (id_from_app_url.size() && id != id_from_app_url) { |
| 73 banners::OutputDeveloperDebugMessage(web_contents(), | 74 banners::OutputDeveloperDebugMessage( |
| 74 banners::kIgnoredIdsDoNotMatch); | 75 web_contents(), banners::kIgnoredIdsDoNotMatch, is_debug_mode); |
| 75 return false; | 76 return false; |
| 76 } | 77 } |
| 77 | 78 |
| 78 std::string referrer = | 79 std::string referrer = |
| 79 ExtractQueryValueForName(url, kReferrerName); | 80 ExtractQueryValueForName(url, kReferrerName); |
| 80 | 81 |
| 81 // Attach the chrome_inline referrer value, prefixed with "&" if the referrer | 82 // Attach the chrome_inline referrer value, prefixed with "&" if the referrer |
| 82 // is non empty. | 83 // is non empty. |
| 83 if (referrer.empty()) | 84 if (referrer.empty()) |
| 84 referrer = kPlayInlineReferrer; | 85 referrer = kPlayInlineReferrer; |
| 85 else | 86 else |
| 86 referrer.append("&").append(kPlayInlineReferrer); | 87 referrer.append("&").append(kPlayInlineReferrer); |
| 87 | 88 |
| 88 ScopedJavaLocalRef<jstring> jurl( | 89 ScopedJavaLocalRef<jstring> jurl( |
| 89 ConvertUTF8ToJavaString(env, data_fetcher()->validated_url().spec())); | 90 ConvertUTF8ToJavaString(env, data_fetcher()->validated_url().spec())); |
| 90 ScopedJavaLocalRef<jstring> jpackage( | 91 ScopedJavaLocalRef<jstring> jpackage( |
| 91 ConvertUTF8ToJavaString(env, id)); | 92 ConvertUTF8ToJavaString(env, id)); |
| 92 ScopedJavaLocalRef<jstring> jreferrer( | 93 ScopedJavaLocalRef<jstring> jreferrer( |
| 93 ConvertUTF8ToJavaString(env, referrer)); | 94 ConvertUTF8ToJavaString(env, referrer)); |
| 94 Java_AppBannerManager_fetchAppDetails( | 95 Java_AppBannerManager_fetchAppDetails( |
| 95 env, jobj.obj(), jurl.obj(), | 96 env, jobj.obj(), jurl.obj(), |
| 96 jpackage.obj(), jreferrer.obj(), | 97 jpackage.obj(), jreferrer.obj(), |
| 97 ShortcutHelper::GetIdealHomescreenIconSizeInDp()); | 98 ShortcutHelper::GetIdealHomescreenIconSizeInDp()); |
| 98 return true; | 99 return true; |
| 99 } | 100 } |
| 100 | 101 |
| 101 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, | 102 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, |
| 102 const std::string& id) { | 103 const std::string& id, |
| 104 bool is_debug_mode) { |
| 103 if (platform != kPlayPlatform) { | 105 if (platform != kPlayPlatform) { |
| 104 banners::OutputDeveloperDebugMessage( | 106 banners::OutputDeveloperDebugMessage( |
| 105 web_contents(), platform + banners::kIgnoredNotSupportedOnAndroid); | 107 web_contents(), platform + banners::kIgnoredNotSupportedOnAndroid, |
| 108 is_debug_mode); |
| 106 return false; | 109 return false; |
| 107 } | 110 } |
| 108 if (id.empty()) { | 111 if (id.empty()) { |
| 109 banners::OutputDeveloperDebugMessage(web_contents(), banners::kIgnoredNoId); | 112 banners::OutputDeveloperDebugMessage(web_contents(), banners::kIgnoredNoId, |
| 113 is_debug_mode); |
| 110 return false; | 114 return false; |
| 111 } | 115 } |
| 112 return true; | 116 return true; |
| 113 } | 117 } |
| 114 | 118 |
| 115 bool AppBannerManagerAndroid::CheckFetcherMatchesContents() { | 119 bool AppBannerManagerAndroid::CheckFetcherMatchesContents(bool is_debug_mode) { |
| 116 if (!web_contents()) | 120 if (!web_contents()) |
| 117 return false; | 121 return false; |
| 118 | 122 |
| 119 if (!data_fetcher() || | 123 if (!data_fetcher() || |
| 120 data_fetcher()->validated_url() != web_contents()->GetURL()) { | 124 data_fetcher()->validated_url() != web_contents()->GetURL()) { |
| 121 banners::OutputDeveloperNotShownMessage( | 125 banners::OutputDeveloperNotShownMessage( |
| 122 web_contents(), banners::kUserNavigatedBeforeBannerShown); | 126 web_contents(), banners::kUserNavigatedBeforeBannerShown, |
| 127 is_debug_mode); |
| 123 return false; | 128 return false; |
| 124 } | 129 } |
| 125 return true; | 130 return true; |
| 126 } | 131 } |
| 127 | 132 |
| 128 std::string AppBannerManagerAndroid::ExtractQueryValueForName( | 133 std::string AppBannerManagerAndroid::ExtractQueryValueForName( |
| 129 const GURL& url, | 134 const GURL& url, |
| 130 const std::string& name) { | 135 const std::string& name) { |
| 131 url::Component query = url.parsed_for_possibly_invalid_spec().query; | 136 url::Component query = url.parsed_for_possibly_invalid_spec().query; |
| 132 url::Component key, value; | 137 url::Component key, value; |
| 133 const char* url_spec = url.spec().c_str(); | 138 const char* url_spec = url.spec().c_str(); |
| 134 | 139 |
| 135 while (url::ExtractQueryKeyValue(url_spec, &query, &key, &value)) { | 140 while (url::ExtractQueryKeyValue(url_spec, &query, &key, &value)) { |
| 136 std::string key_str(url_spec, key.begin, key.len); | 141 std::string key_str(url_spec, key.begin, key.len); |
| 137 std::string value_str(url_spec, value.begin, value.len); | 142 std::string value_str(url_spec, value.begin, value.len); |
| 138 if (key_str == name) | 143 if (key_str == name) |
| 139 return value_str; | 144 return value_str; |
| 140 } | 145 } |
| 141 return ""; | 146 return ""; |
| 142 } | 147 } |
| 143 | 148 |
| 144 AppBannerDataFetcher* AppBannerManagerAndroid::CreateAppBannerDataFetcher( | 149 AppBannerDataFetcher* AppBannerManagerAndroid::CreateAppBannerDataFetcher( |
| 145 base::WeakPtr<Delegate> weak_delegate) { | 150 base::WeakPtr<Delegate> weak_delegate, |
| 151 bool is_debug_mode) { |
| 146 return new AppBannerDataFetcherAndroid( | 152 return new AppBannerDataFetcherAndroid( |
| 147 web_contents(), | 153 web_contents(), weak_delegate, |
| 148 weak_delegate, | |
| 149 ShortcutHelper::GetIdealHomescreenIconSizeInDp(), | 154 ShortcutHelper::GetIdealHomescreenIconSizeInDp(), |
| 150 ShortcutHelper::GetMinimumHomescreenIconSizeInDp(), | 155 ShortcutHelper::GetMinimumHomescreenIconSizeInDp(), |
| 151 ShortcutHelper::GetIdealSplashImageSizeInDp(), | 156 ShortcutHelper::GetIdealSplashImageSizeInDp(), |
| 152 ShortcutHelper::GetMinimumSplashImageSizeInDp()); | 157 ShortcutHelper::GetMinimumSplashImageSizeInDp(), is_debug_mode); |
| 153 } | 158 } |
| 154 | 159 |
| 155 bool AppBannerManagerAndroid::OnAppDetailsRetrieved( | 160 bool AppBannerManagerAndroid::OnAppDetailsRetrieved( |
| 156 JNIEnv* env, | 161 JNIEnv* env, |
| 157 const JavaParamRef<jobject>& obj, | 162 const JavaParamRef<jobject>& obj, |
| 158 const JavaParamRef<jobject>& japp_data, | 163 const JavaParamRef<jobject>& japp_data, |
| 159 const JavaParamRef<jstring>& japp_title, | 164 const JavaParamRef<jstring>& japp_title, |
| 160 const JavaParamRef<jstring>& japp_package, | 165 const JavaParamRef<jstring>& japp_package, |
| 161 const JavaParamRef<jstring>& jicon_url) { | 166 const JavaParamRef<jstring>& jicon_url) { |
| 162 if (!CheckFetcherMatchesContents()) | 167 AppBannerDataFetcherAndroid* android_fetcher = |
| 168 static_cast<AppBannerDataFetcherAndroid*>(data_fetcher().get()); |
| 169 if (!CheckFetcherMatchesContents(android_fetcher->is_debug_mode())) |
| 163 return false; | 170 return false; |
| 164 | 171 |
| 165 GURL image_url = GURL(ConvertJavaStringToUTF8(env, jicon_url)); | 172 GURL image_url = GURL(ConvertJavaStringToUTF8(env, jicon_url)); |
| 166 | 173 |
| 167 AppBannerDataFetcherAndroid* android_fetcher = | |
| 168 static_cast<AppBannerDataFetcherAndroid*>(data_fetcher().get()); | |
| 169 return android_fetcher->ContinueFetching( | 174 return android_fetcher->ContinueFetching( |
| 170 ConvertJavaStringToUTF16(env, japp_title), | 175 ConvertJavaStringToUTF16(env, japp_title), |
| 171 ConvertJavaStringToUTF8(env, japp_package), japp_data, image_url); | 176 ConvertJavaStringToUTF8(env, japp_package), japp_data, image_url); |
| 172 } | 177 } |
| 173 | 178 |
| 174 bool AppBannerManagerAndroid::IsFetcherActive( | 179 bool AppBannerManagerAndroid::IsFetcherActive( |
| 175 JNIEnv* env, | 180 JNIEnv* env, |
| 176 const JavaParamRef<jobject>& obj) { | 181 const JavaParamRef<jobject>& obj) { |
| 177 return AppBannerManager::IsFetcherActive(); | 182 return AppBannerManager::IsFetcherActive(); |
| 178 } | 183 } |
| 179 | 184 |
| 185 void AppBannerManagerAndroid::RequestAppBanner( |
| 186 JNIEnv* env, |
| 187 const JavaParamRef<jobject>& obj) { |
| 188 AppBannerManager::RequestAppBanner(web_contents()->GetMainFrame(), |
| 189 web_contents()->GetLastCommittedURL(), |
| 190 true); |
| 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 |