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