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 <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/android/jni_android.h" | 10 #include "base/android/jni_android.h" |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 bool AppBannerManagerAndroid::OnAppDetailsRetrieved( | 99 bool AppBannerManagerAndroid::OnAppDetailsRetrieved( |
| 100 JNIEnv* env, | 100 JNIEnv* env, |
| 101 const JavaParamRef<jobject>& obj, | 101 const JavaParamRef<jobject>& obj, |
| 102 const JavaParamRef<jobject>& japp_data, | 102 const JavaParamRef<jobject>& japp_data, |
| 103 const JavaParamRef<jstring>& japp_title, | 103 const JavaParamRef<jstring>& japp_title, |
| 104 const JavaParamRef<jstring>& japp_package, | 104 const JavaParamRef<jstring>& japp_package, |
| 105 const JavaParamRef<jstring>& jicon_url) { | 105 const JavaParamRef<jstring>& jicon_url) { |
| 106 native_app_data_.Reset(japp_data); | 106 native_app_data_.Reset(japp_data); |
| 107 app_title_ = ConvertJavaStringToUTF16(env, japp_title); | 107 app_title_ = ConvertJavaStringToUTF16(env, japp_title); |
| 108 native_app_package_ = ConvertJavaStringToUTF8(env, japp_package); | 108 native_app_package_ = ConvertJavaStringToUTF8(env, japp_package); |
| 109 icon_url_ = GURL(ConvertJavaStringToUTF8(env, jicon_url)); | 109 primary_icon_url_ = GURL(ConvertJavaStringToUTF8(env, jicon_url)); |
| 110 | 110 |
| 111 if (!CheckIfShouldShowBanner()) | 111 if (!CheckIfShouldShowBanner()) |
| 112 return false; | 112 return false; |
| 113 | 113 |
| 114 return ManifestIconDownloader::Download( | 114 return ManifestIconDownloader::Download( |
| 115 web_contents(), icon_url_, GetIdealIconSizeInPx(), | 115 web_contents(), primary_icon_url_, GetIdealPrimaryIconSizeInPx(), |
| 116 GetMinimumIconSizeInPx(), | 116 GetMinimumPrimaryIconSizeInPx(), |
| 117 base::Bind(&AppBannerManager::OnAppIconFetched, GetWeakPtr())); | 117 base::Bind(&AppBannerManager::OnAppIconFetched, GetWeakPtr())); |
| 118 } | 118 } |
| 119 | 119 |
| 120 void AppBannerManagerAndroid::RequestAppBanner(const GURL& validated_url, | 120 void AppBannerManagerAndroid::RequestAppBanner(const GURL& validated_url, |
| 121 bool is_debug_mode) { | 121 bool is_debug_mode) { |
| 122 JNIEnv* env = base::android::AttachCurrentThread(); | 122 JNIEnv* env = base::android::AttachCurrentThread(); |
| 123 if (!Java_AppBannerManager_isEnabledForTab(env, java_banner_manager_)) | 123 if (!Java_AppBannerManager_isEnabledForTab(env, java_banner_manager_)) |
| 124 return; | 124 return; |
| 125 | 125 |
| 126 can_install_webapk_ = ChromeWebApkHost::CanInstallWebApk(); | |
|
dominickn
2017/02/15 23:38:04
Set this in the constructor, not in RequestAppBann
pkotwicz
2017/02/16 15:43:03
Dominick, I differ to your judgement
I am ok with
dominickn
2017/02/17 00:54:44
This class already makes a JNI call when it's init
F
2017/02/21 15:53:36
Done. Thanks for the explanation :)
| |
| 127 | |
| 126 AppBannerManager::RequestAppBanner(validated_url, is_debug_mode); | 128 AppBannerManager::RequestAppBanner(validated_url, is_debug_mode); |
| 127 } | 129 } |
| 128 | 130 |
| 131 int AppBannerManagerAndroid::GetIdealBadgeIconSizeInPx() { | |
| 132 return ShortcutHelper::GetIdealBadgeIconSizeInPx(); | |
| 133 } | |
| 134 | |
| 129 std::string AppBannerManagerAndroid::GetAppIdentifier() { | 135 std::string AppBannerManagerAndroid::GetAppIdentifier() { |
| 130 return native_app_data_.is_null() ? AppBannerManager::GetAppIdentifier() | 136 return native_app_data_.is_null() ? AppBannerManager::GetAppIdentifier() |
| 131 : native_app_package_; | 137 : native_app_package_; |
| 132 } | 138 } |
| 133 | 139 |
| 134 std::string AppBannerManagerAndroid::GetBannerType() { | 140 std::string AppBannerManagerAndroid::GetBannerType() { |
| 135 return native_app_data_.is_null() ? AppBannerManager::GetBannerType() | 141 return native_app_data_.is_null() ? AppBannerManager::GetBannerType() |
| 136 : "play"; | 142 : "play"; |
| 137 } | 143 } |
| 138 | 144 |
| 139 int AppBannerManagerAndroid::GetIdealIconSizeInPx() { | 145 int AppBannerManagerAndroid::GetIdealPrimaryIconSizeInPx() { |
| 140 return ShortcutHelper::GetIdealHomescreenIconSizeInPx(); | 146 return ShortcutHelper::GetIdealHomescreenIconSizeInPx(); |
| 141 } | 147 } |
| 142 | 148 |
| 143 int AppBannerManagerAndroid::GetMinimumIconSizeInPx() { | 149 int AppBannerManagerAndroid::GetMinimumPrimaryIconSizeInPx() { |
| 144 return ShortcutHelper::GetMinimumHomescreenIconSizeInPx(); | 150 return ShortcutHelper::GetMinimumHomescreenIconSizeInPx(); |
| 145 } | 151 } |
| 146 | 152 |
| 147 bool AppBannerManagerAndroid::IsWebAppInstalled( | 153 bool AppBannerManagerAndroid::IsWebAppInstalled( |
| 148 content::BrowserContext* browser_context, | 154 content::BrowserContext* browser_context, |
| 149 const GURL& start_url, | 155 const GURL& start_url, |
| 150 const GURL& manifest_url) { | 156 const GURL& manifest_url) { |
| 151 // Returns true if a WebAPK is installed or is being installed. | 157 // Returns true if a WebAPK is installed or is being installed. |
| 152 // Does not check whether a non-WebAPK web app is installed: this is detected | 158 // Does not check whether a non-WebAPK web app is installed: this is detected |
| 153 // by the content settings check in AppBannerSettingsHelper::ShouldShowBanner | 159 // by the content settings check in AppBannerSettingsHelper::ShouldShowBanner |
| 154 // (due to the lack of an API to detect what is and isn't on the Android | 160 // (due to the lack of an API to detect what is and isn't on the Android |
| 155 // homescreen). This method will still detect the presence of a WebAPK even if | 161 // homescreen). This method will still detect the presence of a WebAPK even if |
| 156 // Chrome's data is cleared. | 162 // Chrome's data is cleared. |
| 157 return ShortcutHelper::IsWebApkInstalled(browser_context, start_url, | 163 return ShortcutHelper::IsWebApkInstalled(browser_context, start_url, |
| 158 manifest_url); | 164 manifest_url); |
| 159 } | 165 } |
| 160 | 166 |
| 167 InstallableParams AppBannerManagerAndroid::ParamsToPerformInstallableCheck() { | |
| 168 InstallableParams params = | |
| 169 AppBannerManager::ParamsToPerformInstallableCheck(); | |
| 170 | |
| 171 if (can_install_webapk_) { | |
| 172 params.ideal_badge_icon_size_in_px = GetIdealBadgeIconSizeInPx(); | |
| 173 params.minimum_badge_icon_size_in_px = GetIdealBadgeIconSizeInPx(); | |
| 174 params.fetch_valid_badge_icon = true; | |
| 175 } | |
| 176 | |
| 177 return params; | |
| 178 } | |
| 179 | |
| 161 void AppBannerManagerAndroid::PerformInstallableCheck() { | 180 void AppBannerManagerAndroid::PerformInstallableCheck() { |
| 162 // Check if the manifest prefers that we show a native app banner. If so, call | 181 // Check if the manifest prefers that we show a native app banner. If so, call |
| 163 // to Java to verify the details. | 182 // to Java to verify the details. |
| 164 if (manifest_.prefer_related_applications && | 183 if (manifest_.prefer_related_applications && |
| 165 manifest_.related_applications.size()) { | 184 manifest_.related_applications.size()) { |
| 166 for (const auto& application : manifest_.related_applications) { | 185 for (const auto& application : manifest_.related_applications) { |
| 167 std::string platform = base::UTF16ToUTF8(application.platform.string()); | 186 std::string platform = base::UTF16ToUTF8(application.platform.string()); |
| 168 std::string id = base::UTF16ToUTF8(application.id.string()); | 187 std::string id = base::UTF16ToUTF8(application.id.string()); |
| 169 if (CanHandleNonWebApp(platform, application.url, id)) | 188 if (CanHandleNonWebApp(platform, application.url, id)) |
| 170 return; | 189 return; |
| 171 } | 190 } |
| 172 Stop(); | 191 Stop(); |
| 173 } | 192 } |
| 174 | 193 |
| 175 if (ChromeWebApkHost::CanInstallWebApk()) { | 194 if (can_install_webapk_) { |
| 176 if (!AreWebManifestUrlsWebApkCompatible(manifest_)) { | 195 if (!AreWebManifestUrlsWebApkCompatible(manifest_)) { |
| 177 ReportStatus(web_contents(), URL_NOT_SUPPORTED_FOR_WEBAPK); | 196 ReportStatus(web_contents(), URL_NOT_SUPPORTED_FOR_WEBAPK); |
| 178 Stop(); | 197 Stop(); |
| 179 return; | 198 return; |
| 180 } | 199 } |
| 181 } | 200 } |
| 182 | 201 |
| 183 // No native app banner was requested. Continue checking for a web app banner. | 202 // No native app banner was requested. Continue checking for a web app banner. |
| 184 AppBannerManager::PerformInstallableCheck(); | 203 AppBannerManager::PerformInstallableCheck(); |
| 185 } | 204 } |
| 186 | 205 |
| 206 void AppBannerManagerAndroid::OnDidPerformInstallableCheck( | |
| 207 const InstallableData& data) { | |
| 208 if (data.badge_icon && !data.badge_icon->drawsNothing()) { | |
| 209 DCHECK(!data.badge_icon_url.is_empty()); | |
| 210 | |
| 211 badge_icon_url_ = data.badge_icon_url; | |
| 212 badge_icon_.reset(new SkBitmap(*data.badge_icon)); | |
| 213 } | |
| 214 | |
| 215 AppBannerManager::OnDidPerformInstallableCheck(data); | |
| 216 } | |
| 217 | |
| 187 void AppBannerManagerAndroid::OnAppIconFetched(const SkBitmap& bitmap) { | 218 void AppBannerManagerAndroid::OnAppIconFetched(const SkBitmap& bitmap) { |
| 188 if (bitmap.drawsNothing()) { | 219 if (bitmap.drawsNothing()) { |
| 189 ReportStatus(web_contents(), NO_ICON_AVAILABLE); | 220 ReportStatus(web_contents(), NO_ICON_AVAILABLE); |
| 190 Stop(); | 221 Stop(); |
| 191 } | 222 } |
| 192 | 223 |
| 193 if (!is_active()) | 224 if (!is_active()) |
| 194 return; | 225 return; |
| 195 | 226 |
| 196 icon_.reset(new SkBitmap(bitmap)); | 227 primary_icon_.reset(new SkBitmap(bitmap)); |
| 197 SendBannerPromptRequest(); | 228 SendBannerPromptRequest(); |
| 198 } | 229 } |
| 199 | 230 |
| 200 void AppBannerManagerAndroid::ResetCurrentPageData() { | 231 void AppBannerManagerAndroid::ResetCurrentPageData() { |
| 201 AppBannerManager::ResetCurrentPageData(); | 232 AppBannerManager::ResetCurrentPageData(); |
| 202 native_app_data_.Reset(); | 233 native_app_data_.Reset(); |
| 203 native_app_package_ = ""; | 234 native_app_package_ = ""; |
| 204 } | 235 } |
| 205 | 236 |
| 206 void AppBannerManagerAndroid::ShowBanner() { | 237 void AppBannerManagerAndroid::ShowBanner() { |
| 207 content::WebContents* contents = web_contents(); | 238 content::WebContents* contents = web_contents(); |
| 208 DCHECK(contents); | 239 DCHECK(contents); |
| 209 | 240 |
| 210 if (native_app_data_.is_null()) { | 241 if (native_app_data_.is_null()) { |
| 242 // TODO(zpeng): Add badge to WebAPK installation flow. | |
| 211 if (AppBannerInfoBarDelegateAndroid::Create( | 243 if (AppBannerInfoBarDelegateAndroid::Create( |
| 212 contents, GetWeakPtr(), app_title_, | 244 contents, GetWeakPtr(), app_title_, |
| 213 CreateShortcutInfo(manifest_url_, manifest_, icon_url_), | 245 CreateShortcutInfo(manifest_url_, manifest_, primary_icon_url_), |
| 214 std::move(icon_), event_request_id(), | 246 std::move(primary_icon_), event_request_id(), |
| 215 webapk::INSTALL_SOURCE_BANNER)) { | 247 webapk::INSTALL_SOURCE_BANNER)) { |
| 216 RecordDidShowBanner("AppBanner.WebApp.Shown"); | 248 RecordDidShowBanner("AppBanner.WebApp.Shown"); |
| 217 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED); | 249 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED); |
| 218 ReportStatus(contents, SHOWING_WEB_APP_BANNER); | 250 ReportStatus(contents, SHOWING_WEB_APP_BANNER); |
| 219 } else { | 251 } else { |
| 220 ReportStatus(contents, FAILED_TO_CREATE_BANNER); | 252 ReportStatus(contents, FAILED_TO_CREATE_BANNER); |
| 221 } | 253 } |
| 222 } else { | 254 } else { |
| 223 if (AppBannerInfoBarDelegateAndroid::Create( | 255 if (AppBannerInfoBarDelegateAndroid::Create( |
| 224 contents, app_title_, native_app_data_, std::move(icon_), | 256 contents, app_title_, native_app_data_, std::move(primary_icon_), |
| 225 native_app_package_, referrer_, event_request_id())) { | 257 native_app_package_, referrer_, event_request_id())) { |
| 226 RecordDidShowBanner("AppBanner.NativeApp.Shown"); | 258 RecordDidShowBanner("AppBanner.NativeApp.Shown"); |
| 227 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED); | 259 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED); |
| 228 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER); | 260 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER); |
| 229 } else { | 261 } else { |
| 230 ReportStatus(contents, FAILED_TO_CREATE_BANNER); | 262 ReportStatus(contents, FAILED_TO_CREATE_BANNER); |
| 231 } | 263 } |
| 232 } | 264 } |
| 233 } | 265 } |
| 234 | 266 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 257 if (!referrer.empty()) | 289 if (!referrer.empty()) |
| 258 referrer += "&"; | 290 referrer += "&"; |
| 259 referrer += "playinline=chrome_inline"; | 291 referrer += "playinline=chrome_inline"; |
| 260 | 292 |
| 261 ScopedJavaLocalRef<jstring> jurl( | 293 ScopedJavaLocalRef<jstring> jurl( |
| 262 ConvertUTF8ToJavaString(env, validated_url_.spec())); | 294 ConvertUTF8ToJavaString(env, validated_url_.spec())); |
| 263 ScopedJavaLocalRef<jstring> jpackage(ConvertUTF8ToJavaString(env, id)); | 295 ScopedJavaLocalRef<jstring> jpackage(ConvertUTF8ToJavaString(env, id)); |
| 264 ScopedJavaLocalRef<jstring> jreferrer(ConvertUTF8ToJavaString(env, referrer)); | 296 ScopedJavaLocalRef<jstring> jreferrer(ConvertUTF8ToJavaString(env, referrer)); |
| 265 Java_AppBannerManager_fetchAppDetails(env, java_banner_manager_, jurl, | 297 Java_AppBannerManager_fetchAppDetails(env, java_banner_manager_, jurl, |
| 266 jpackage, jreferrer, | 298 jpackage, jreferrer, |
| 267 GetIdealIconSizeInPx()); | 299 GetIdealPrimaryIconSizeInPx()); |
| 268 return true; | 300 return true; |
| 269 } | 301 } |
| 270 | 302 |
| 271 void AppBannerManagerAndroid::CreateJavaBannerManager() { | 303 void AppBannerManagerAndroid::CreateJavaBannerManager() { |
| 272 JNIEnv* env = base::android::AttachCurrentThread(); | 304 JNIEnv* env = base::android::AttachCurrentThread(); |
| 273 java_banner_manager_.Reset( | 305 java_banner_manager_.Reset( |
| 274 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this))); | 306 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this))); |
| 275 } | 307 } |
| 276 | 308 |
| 277 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, | 309 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 } | 366 } |
| 335 | 367 |
| 336 // static | 368 // static |
| 337 void SetTotalEngagementToTrigger(JNIEnv* env, | 369 void SetTotalEngagementToTrigger(JNIEnv* env, |
| 338 const JavaParamRef<jclass>& clazz, | 370 const JavaParamRef<jclass>& clazz, |
| 339 jdouble engagement) { | 371 jdouble engagement) { |
| 340 AppBannerSettingsHelper::SetTotalEngagementToTrigger(engagement); | 372 AppBannerSettingsHelper::SetTotalEngagementToTrigger(engagement); |
| 341 } | 373 } |
| 342 | 374 |
| 343 } // namespace banners | 375 } // namespace banners |
| OLD | NEW |