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 AppBannerManager::RequestAppBanner(validated_url, is_debug_mode); | 126 AppBannerManager::RequestAppBanner(validated_url, is_debug_mode); |
| 127 } | 127 } |
| 128 | 128 |
| 129 int AppBannerManagerAndroid::GetIdealBadgeIconSizeInPx() { | |
| 130 return ShortcutHelper::GetIdealBadgeIconSizeInPx(); | |
| 131 } | |
| 132 | |
| 129 std::string AppBannerManagerAndroid::GetAppIdentifier() { | 133 std::string AppBannerManagerAndroid::GetAppIdentifier() { |
| 130 return native_app_data_.is_null() ? AppBannerManager::GetAppIdentifier() | 134 return native_app_data_.is_null() ? AppBannerManager::GetAppIdentifier() |
| 131 : native_app_package_; | 135 : native_app_package_; |
| 132 } | 136 } |
| 133 | 137 |
| 134 std::string AppBannerManagerAndroid::GetBannerType() { | 138 std::string AppBannerManagerAndroid::GetBannerType() { |
| 135 return native_app_data_.is_null() ? AppBannerManager::GetBannerType() | 139 return native_app_data_.is_null() ? AppBannerManager::GetBannerType() |
| 136 : "play"; | 140 : "play"; |
| 137 } | 141 } |
| 138 | 142 |
| 139 int AppBannerManagerAndroid::GetIdealIconSizeInPx() { | 143 int AppBannerManagerAndroid::GetIdealPrimaryIconSizeInPx() { |
| 140 return ShortcutHelper::GetIdealHomescreenIconSizeInPx(); | 144 return ShortcutHelper::GetIdealHomescreenIconSizeInPx(); |
| 141 } | 145 } |
| 142 | 146 |
| 143 int AppBannerManagerAndroid::GetMinimumIconSizeInPx() { | 147 int AppBannerManagerAndroid::GetMinimumPrimaryIconSizeInPx() { |
| 144 return ShortcutHelper::GetMinimumHomescreenIconSizeInPx(); | 148 return ShortcutHelper::GetMinimumHomescreenIconSizeInPx(); |
| 145 } | 149 } |
| 146 | 150 |
| 147 bool AppBannerManagerAndroid::IsWebAppInstalled( | 151 bool AppBannerManagerAndroid::IsWebAppInstalled( |
| 148 content::BrowserContext* browser_context, | 152 content::BrowserContext* browser_context, |
| 149 const GURL& start_url, | 153 const GURL& start_url, |
| 150 const GURL& manifest_url) { | 154 const GURL& manifest_url) { |
| 151 // Returns true if a WebAPK is installed or is being installed. | 155 // 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 | 156 // Does not check whether a non-WebAPK web app is installed: this is detected |
| 153 // by the content settings check in AppBannerSettingsHelper::ShouldShowBanner | 157 // 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 | 158 // (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 | 159 // homescreen). This method will still detect the presence of a WebAPK even if |
| 156 // Chrome's data is cleared. | 160 // Chrome's data is cleared. |
| 157 return ShortcutHelper::IsWebApkInstalled(browser_context, start_url, | 161 return ShortcutHelper::IsWebApkInstalled(browser_context, start_url, |
| 158 manifest_url); | 162 manifest_url); |
| 159 } | 163 } |
| 160 | 164 |
| 165 InstallableParams AppBannerManagerAndroid::ParamsToPerformInstallableCheck() { | |
|
pkotwicz
2017/02/14 20:02:08
Nit: You can replace lines 166-170 with
Installabl
F
2017/02/14 20:11:20
Done. Thanks!
| |
| 166 InstallableParams params; | |
| 167 params.ideal_primary_icon_size_in_px = GetIdealPrimaryIconSizeInPx(); | |
| 168 params.minimum_primary_icon_size_in_px = GetMinimumPrimaryIconSizeInPx(); | |
| 169 params.check_installable = true; | |
| 170 params.fetch_valid_primary_icon = true; | |
| 171 | |
| 172 if (ChromeWebApkHost::CanInstallWebApk()) { | |
| 173 params.ideal_badge_icon_size_in_px = GetIdealBadgeIconSizeInPx(); | |
| 174 params.minimum_badge_icon_size_in_px = GetIdealBadgeIconSizeInPx(); | |
| 175 params.fetch_valid_badge_icon = true; | |
| 176 } | |
| 177 | |
| 178 return params; | |
| 179 } | |
| 180 | |
| 161 void AppBannerManagerAndroid::PerformInstallableCheck() { | 181 void AppBannerManagerAndroid::PerformInstallableCheck() { |
| 162 // Check if the manifest prefers that we show a native app banner. If so, call | 182 // Check if the manifest prefers that we show a native app banner. If so, call |
| 163 // to Java to verify the details. | 183 // to Java to verify the details. |
| 164 if (manifest_.prefer_related_applications && | 184 if (manifest_.prefer_related_applications && |
| 165 manifest_.related_applications.size()) { | 185 manifest_.related_applications.size()) { |
| 166 for (const auto& application : manifest_.related_applications) { | 186 for (const auto& application : manifest_.related_applications) { |
| 167 std::string platform = base::UTF16ToUTF8(application.platform.string()); | 187 std::string platform = base::UTF16ToUTF8(application.platform.string()); |
| 168 std::string id = base::UTF16ToUTF8(application.id.string()); | 188 std::string id = base::UTF16ToUTF8(application.id.string()); |
| 169 if (CanHandleNonWebApp(platform, application.url, id)) | 189 if (CanHandleNonWebApp(platform, application.url, id)) |
| 170 return; | 190 return; |
| 171 } | 191 } |
| 172 Stop(); | 192 Stop(); |
| 173 } | 193 } |
| 174 | 194 |
| 175 if (ChromeWebApkHost::CanInstallWebApk()) { | 195 if (ChromeWebApkHost::CanInstallWebApk()) { |
| 176 if (!AreWebManifestUrlsWebApkCompatible(manifest_)) { | 196 if (!AreWebManifestUrlsWebApkCompatible(manifest_)) { |
| 177 ReportStatus(web_contents(), URL_NOT_SUPPORTED_FOR_WEBAPK); | 197 ReportStatus(web_contents(), URL_NOT_SUPPORTED_FOR_WEBAPK); |
| 178 Stop(); | 198 Stop(); |
| 179 return; | 199 return; |
| 180 } | 200 } |
| 181 } | 201 } |
| 182 | 202 |
| 183 // No native app banner was requested. Continue checking for a web app banner. | 203 // No native app banner was requested. Continue checking for a web app banner. |
| 184 AppBannerManager::PerformInstallableCheck(); | 204 AppBannerManager::PerformInstallableCheck(); |
| 185 } | 205 } |
| 186 | 206 |
| 207 void AppBannerManagerAndroid::OnDidPerformInstallableCheck( | |
| 208 const InstallableData& data) { | |
| 209 if (data.badge_icon) { | |
| 210 DCHECK(!data.badge_icon_url.is_empty()); | |
| 211 | |
| 212 badge_icon_url_ = data.badge_icon_url; | |
| 213 badge_icon_.reset(new SkBitmap(*data.badge_icon)); | |
| 214 } | |
| 215 | |
| 216 AppBannerManager::OnDidPerformInstallableCheck(data); | |
| 217 } | |
| 218 | |
| 187 void AppBannerManagerAndroid::OnAppIconFetched(const SkBitmap& bitmap) { | 219 void AppBannerManagerAndroid::OnAppIconFetched(const SkBitmap& bitmap) { |
| 188 if (bitmap.drawsNothing()) { | 220 if (bitmap.drawsNothing()) { |
| 189 ReportStatus(web_contents(), NO_ICON_AVAILABLE); | 221 ReportStatus(web_contents(), NO_ICON_AVAILABLE); |
| 190 Stop(); | 222 Stop(); |
| 191 } | 223 } |
| 192 | 224 |
| 193 if (!is_active()) | 225 if (!is_active()) |
| 194 return; | 226 return; |
| 195 | 227 |
| 196 icon_.reset(new SkBitmap(bitmap)); | 228 primary_icon_.reset(new SkBitmap(bitmap)); |
| 197 SendBannerPromptRequest(); | 229 SendBannerPromptRequest(); |
| 198 } | 230 } |
| 199 | 231 |
| 200 void AppBannerManagerAndroid::ResetCurrentPageData() { | 232 void AppBannerManagerAndroid::ResetCurrentPageData() { |
| 201 AppBannerManager::ResetCurrentPageData(); | 233 AppBannerManager::ResetCurrentPageData(); |
| 202 native_app_data_.Reset(); | 234 native_app_data_.Reset(); |
| 203 native_app_package_ = ""; | 235 native_app_package_ = ""; |
| 204 } | 236 } |
| 205 | 237 |
| 206 void AppBannerManagerAndroid::ShowBanner() { | 238 void AppBannerManagerAndroid::ShowBanner() { |
| 207 content::WebContents* contents = web_contents(); | 239 content::WebContents* contents = web_contents(); |
| 208 DCHECK(contents); | 240 DCHECK(contents); |
| 209 | 241 |
| 210 if (native_app_data_.is_null()) { | 242 if (native_app_data_.is_null()) { |
| 243 // TODO(zpeng): Add badge to WebAPK installation flow. | |
| 211 if (AppBannerInfoBarDelegateAndroid::Create( | 244 if (AppBannerInfoBarDelegateAndroid::Create( |
| 212 contents, GetWeakPtr(), app_title_, | 245 contents, GetWeakPtr(), app_title_, |
| 213 CreateShortcutInfo(manifest_url_, manifest_, icon_url_), | 246 CreateShortcutInfo(manifest_url_, manifest_, primary_icon_url_), |
| 214 std::move(icon_), event_request_id(), | 247 std::move(primary_icon_), event_request_id(), |
| 215 webapk::INSTALL_SOURCE_BANNER)) { | 248 webapk::INSTALL_SOURCE_BANNER)) { |
| 216 RecordDidShowBanner("AppBanner.WebApp.Shown"); | 249 RecordDidShowBanner("AppBanner.WebApp.Shown"); |
| 217 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED); | 250 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED); |
| 218 ReportStatus(contents, SHOWING_WEB_APP_BANNER); | 251 ReportStatus(contents, SHOWING_WEB_APP_BANNER); |
| 219 } else { | 252 } else { |
| 220 ReportStatus(contents, FAILED_TO_CREATE_BANNER); | 253 ReportStatus(contents, FAILED_TO_CREATE_BANNER); |
| 221 } | 254 } |
| 222 } else { | 255 } else { |
| 223 if (AppBannerInfoBarDelegateAndroid::Create( | 256 if (AppBannerInfoBarDelegateAndroid::Create( |
| 224 contents, app_title_, native_app_data_, std::move(icon_), | 257 contents, app_title_, native_app_data_, std::move(primary_icon_), |
| 225 native_app_package_, referrer_, event_request_id())) { | 258 native_app_package_, referrer_, event_request_id())) { |
| 226 RecordDidShowBanner("AppBanner.NativeApp.Shown"); | 259 RecordDidShowBanner("AppBanner.NativeApp.Shown"); |
| 227 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED); | 260 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED); |
| 228 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER); | 261 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER); |
| 229 } else { | 262 } else { |
| 230 ReportStatus(contents, FAILED_TO_CREATE_BANNER); | 263 ReportStatus(contents, FAILED_TO_CREATE_BANNER); |
| 231 } | 264 } |
| 232 } | 265 } |
| 233 } | 266 } |
| 234 | 267 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 257 if (!referrer.empty()) | 290 if (!referrer.empty()) |
| 258 referrer += "&"; | 291 referrer += "&"; |
| 259 referrer += "playinline=chrome_inline"; | 292 referrer += "playinline=chrome_inline"; |
| 260 | 293 |
| 261 ScopedJavaLocalRef<jstring> jurl( | 294 ScopedJavaLocalRef<jstring> jurl( |
| 262 ConvertUTF8ToJavaString(env, validated_url_.spec())); | 295 ConvertUTF8ToJavaString(env, validated_url_.spec())); |
| 263 ScopedJavaLocalRef<jstring> jpackage(ConvertUTF8ToJavaString(env, id)); | 296 ScopedJavaLocalRef<jstring> jpackage(ConvertUTF8ToJavaString(env, id)); |
| 264 ScopedJavaLocalRef<jstring> jreferrer(ConvertUTF8ToJavaString(env, referrer)); | 297 ScopedJavaLocalRef<jstring> jreferrer(ConvertUTF8ToJavaString(env, referrer)); |
| 265 Java_AppBannerManager_fetchAppDetails(env, java_banner_manager_, jurl, | 298 Java_AppBannerManager_fetchAppDetails(env, java_banner_manager_, jurl, |
| 266 jpackage, jreferrer, | 299 jpackage, jreferrer, |
| 267 GetIdealIconSizeInPx()); | 300 GetIdealPrimaryIconSizeInPx()); |
| 268 return true; | 301 return true; |
| 269 } | 302 } |
| 270 | 303 |
| 271 void AppBannerManagerAndroid::CreateJavaBannerManager() { | 304 void AppBannerManagerAndroid::CreateJavaBannerManager() { |
| 272 JNIEnv* env = base::android::AttachCurrentThread(); | 305 JNIEnv* env = base::android::AttachCurrentThread(); |
| 273 java_banner_manager_.Reset( | 306 java_banner_manager_.Reset( |
| 274 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this))); | 307 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this))); |
| 275 } | 308 } |
| 276 | 309 |
| 277 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, | 310 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 } | 367 } |
| 335 | 368 |
| 336 // static | 369 // static |
| 337 void SetTotalEngagementToTrigger(JNIEnv* env, | 370 void SetTotalEngagementToTrigger(JNIEnv* env, |
| 338 const JavaParamRef<jclass>& clazz, | 371 const JavaParamRef<jclass>& clazz, |
| 339 jdouble engagement) { | 372 jdouble engagement) { |
| 340 AppBannerSettingsHelper::SetTotalEngagementToTrigger(engagement); | 373 AppBannerSettingsHelper::SetTotalEngagementToTrigger(engagement); |
| 341 } | 374 } |
| 342 | 375 |
| 343 } // namespace banners | 376 } // namespace banners |
| OLD | NEW |