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 21 matching lines...) Expand all Loading... | |
| 32 using base::android::JavaParamRef; | 32 using base::android::JavaParamRef; |
| 33 using base::android::ScopedJavaLocalRef; | 33 using base::android::ScopedJavaLocalRef; |
| 34 | 34 |
| 35 DEFINE_WEB_CONTENTS_USER_DATA_KEY(banners::AppBannerManagerAndroid); | 35 DEFINE_WEB_CONTENTS_USER_DATA_KEY(banners::AppBannerManagerAndroid); |
| 36 | 36 |
| 37 namespace { | 37 namespace { |
| 38 | 38 |
| 39 std::unique_ptr<ShortcutInfo> CreateShortcutInfo( | 39 std::unique_ptr<ShortcutInfo> CreateShortcutInfo( |
| 40 const GURL& manifest_url, | 40 const GURL& manifest_url, |
| 41 const content::Manifest& manifest, | 41 const content::Manifest& manifest, |
| 42 const GURL& icon_url) { | 42 const GURL& primary_icon_url) { |
| 43 auto shortcut_info = base::MakeUnique<ShortcutInfo>(GURL()); | 43 auto shortcut_info = base::MakeUnique<ShortcutInfo>(GURL()); |
| 44 if (!manifest.IsEmpty()) { | 44 if (!manifest.IsEmpty()) { |
| 45 shortcut_info->UpdateFromManifest(manifest); | 45 shortcut_info->UpdateFromManifest(manifest); |
| 46 shortcut_info->manifest_url = manifest_url; | 46 shortcut_info->manifest_url = manifest_url; |
| 47 shortcut_info->best_primary_icon_url = icon_url; | 47 shortcut_info->best_primary_icon_url = primary_icon_url; |
| 48 shortcut_info->UpdateSource(ShortcutInfo::SOURCE_APP_BANNER); | 48 shortcut_info->UpdateSource(ShortcutInfo::SOURCE_APP_BANNER); |
| 49 } | 49 } |
| 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( |
| (...skipping 41 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 std::string AppBannerManagerAndroid::GetAppIdentifier() { | 129 std::string AppBannerManagerAndroid::GetAppIdentifier() { |
| 130 return native_app_data_.is_null() ? AppBannerManager::GetAppIdentifier() | 130 return native_app_data_.is_null() ? AppBannerManager::GetAppIdentifier() |
| 131 : native_app_package_; | 131 : native_app_package_; |
| 132 } | 132 } |
| 133 | 133 |
| 134 std::string AppBannerManagerAndroid::GetBannerType() { | 134 std::string AppBannerManagerAndroid::GetBannerType() { |
| 135 return native_app_data_.is_null() ? AppBannerManager::GetBannerType() | 135 return native_app_data_.is_null() ? AppBannerManager::GetBannerType() |
| 136 : "play"; | 136 : "play"; |
| 137 } | 137 } |
| 138 | 138 |
| 139 int AppBannerManagerAndroid::GetIdealIconSizeInPx() { | 139 int AppBannerManagerAndroid::GetIdealPrimaryIconSizeInPx() { |
| 140 return ShortcutHelper::GetIdealHomescreenIconSizeInPx(); | 140 return ShortcutHelper::GetIdealHomescreenIconSizeInPx(); |
| 141 } | 141 } |
| 142 | 142 |
| 143 int AppBannerManagerAndroid::GetMinimumIconSizeInPx() { | 143 int AppBannerManagerAndroid::GetMinimumPrimaryIconSizeInPx() { |
| 144 return ShortcutHelper::GetMinimumHomescreenIconSizeInPx(); | 144 return ShortcutHelper::GetMinimumHomescreenIconSizeInPx(); |
| 145 } | 145 } |
| 146 | 146 |
| 147 int AppBannerManagerAndroid::GetIdealBadgeIconSizeInPx() { | |
| 148 return ShortcutHelper::GetIdealBadgeIconSizeInPx(); | |
|
dominickn
2017/02/14 00:01:16
Since this is gated on WebAPKs, is there a way to
F
2017/02/14 19:22:42
Done.
| |
| 149 } | |
| 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. |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 186 | 190 |
| 187 void AppBannerManagerAndroid::OnAppIconFetched(const SkBitmap& bitmap) { | 191 void AppBannerManagerAndroid::OnAppIconFetched(const SkBitmap& bitmap) { |
| 188 if (bitmap.drawsNothing()) { | 192 if (bitmap.drawsNothing()) { |
| 189 ReportStatus(web_contents(), NO_ICON_AVAILABLE); | 193 ReportStatus(web_contents(), NO_ICON_AVAILABLE); |
| 190 Stop(); | 194 Stop(); |
| 191 } | 195 } |
| 192 | 196 |
| 193 if (!is_active()) | 197 if (!is_active()) |
| 194 return; | 198 return; |
| 195 | 199 |
| 196 icon_.reset(new SkBitmap(bitmap)); | 200 primary_icon_.reset(new SkBitmap(bitmap)); |
| 197 SendBannerPromptRequest(); | 201 SendBannerPromptRequest(); |
| 198 } | 202 } |
| 199 | 203 |
| 200 void AppBannerManagerAndroid::ResetCurrentPageData() { | 204 void AppBannerManagerAndroid::ResetCurrentPageData() { |
| 201 AppBannerManager::ResetCurrentPageData(); | 205 AppBannerManager::ResetCurrentPageData(); |
| 202 native_app_data_.Reset(); | 206 native_app_data_.Reset(); |
| 203 native_app_package_ = ""; | 207 native_app_package_ = ""; |
| 204 } | 208 } |
| 205 | 209 |
| 206 void AppBannerManagerAndroid::ShowBanner() { | 210 void AppBannerManagerAndroid::ShowBanner() { |
| 207 content::WebContents* contents = web_contents(); | 211 content::WebContents* contents = web_contents(); |
| 208 DCHECK(contents); | 212 DCHECK(contents); |
| 209 | 213 |
| 210 if (native_app_data_.is_null()) { | 214 if (native_app_data_.is_null()) { |
| 215 // TODO(zpeng): Add badge to WebAPK installation flow. | |
| 211 if (AppBannerInfoBarDelegateAndroid::Create( | 216 if (AppBannerInfoBarDelegateAndroid::Create( |
| 212 contents, GetWeakPtr(), app_title_, | 217 contents, GetWeakPtr(), app_title_, |
| 213 CreateShortcutInfo(manifest_url_, manifest_, icon_url_), | 218 CreateShortcutInfo(manifest_url_, manifest_, primary_icon_url_), |
| 214 std::move(icon_), event_request_id(), | 219 std::move(primary_icon_), event_request_id(), |
| 215 webapk::INSTALL_SOURCE_BANNER)) { | 220 webapk::INSTALL_SOURCE_BANNER)) { |
| 216 RecordDidShowBanner("AppBanner.WebApp.Shown"); | 221 RecordDidShowBanner("AppBanner.WebApp.Shown"); |
| 217 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED); | 222 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED); |
| 218 ReportStatus(contents, SHOWING_WEB_APP_BANNER); | 223 ReportStatus(contents, SHOWING_WEB_APP_BANNER); |
| 219 } else { | 224 } else { |
| 220 ReportStatus(contents, FAILED_TO_CREATE_BANNER); | 225 ReportStatus(contents, FAILED_TO_CREATE_BANNER); |
| 221 } | 226 } |
| 222 } else { | 227 } else { |
| 223 if (AppBannerInfoBarDelegateAndroid::Create( | 228 if (AppBannerInfoBarDelegateAndroid::Create( |
| 224 contents, app_title_, native_app_data_, std::move(icon_), | 229 contents, app_title_, native_app_data_, std::move(primary_icon_), |
| 225 native_app_package_, referrer_, event_request_id())) { | 230 native_app_package_, referrer_, event_request_id())) { |
| 226 RecordDidShowBanner("AppBanner.NativeApp.Shown"); | 231 RecordDidShowBanner("AppBanner.NativeApp.Shown"); |
| 227 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED); | 232 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED); |
| 228 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER); | 233 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER); |
| 229 } else { | 234 } else { |
| 230 ReportStatus(contents, FAILED_TO_CREATE_BANNER); | 235 ReportStatus(contents, FAILED_TO_CREATE_BANNER); |
| 231 } | 236 } |
| 232 } | 237 } |
| 233 } | 238 } |
| 234 | 239 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 257 if (!referrer.empty()) | 262 if (!referrer.empty()) |
| 258 referrer += "&"; | 263 referrer += "&"; |
| 259 referrer += "playinline=chrome_inline"; | 264 referrer += "playinline=chrome_inline"; |
| 260 | 265 |
| 261 ScopedJavaLocalRef<jstring> jurl( | 266 ScopedJavaLocalRef<jstring> jurl( |
| 262 ConvertUTF8ToJavaString(env, validated_url_.spec())); | 267 ConvertUTF8ToJavaString(env, validated_url_.spec())); |
| 263 ScopedJavaLocalRef<jstring> jpackage(ConvertUTF8ToJavaString(env, id)); | 268 ScopedJavaLocalRef<jstring> jpackage(ConvertUTF8ToJavaString(env, id)); |
| 264 ScopedJavaLocalRef<jstring> jreferrer(ConvertUTF8ToJavaString(env, referrer)); | 269 ScopedJavaLocalRef<jstring> jreferrer(ConvertUTF8ToJavaString(env, referrer)); |
| 265 Java_AppBannerManager_fetchAppDetails(env, java_banner_manager_, jurl, | 270 Java_AppBannerManager_fetchAppDetails(env, java_banner_manager_, jurl, |
| 266 jpackage, jreferrer, | 271 jpackage, jreferrer, |
| 267 GetIdealIconSizeInPx()); | 272 GetIdealPrimaryIconSizeInPx()); |
| 268 return true; | 273 return true; |
| 269 } | 274 } |
| 270 | 275 |
| 271 void AppBannerManagerAndroid::CreateJavaBannerManager() { | 276 void AppBannerManagerAndroid::CreateJavaBannerManager() { |
| 272 JNIEnv* env = base::android::AttachCurrentThread(); | 277 JNIEnv* env = base::android::AttachCurrentThread(); |
| 273 java_banner_manager_.Reset( | 278 java_banner_manager_.Reset( |
| 274 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this))); | 279 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this))); |
| 275 } | 280 } |
| 276 | 281 |
| 277 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, | 282 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 } | 339 } |
| 335 | 340 |
| 336 // static | 341 // static |
| 337 void SetTotalEngagementToTrigger(JNIEnv* env, | 342 void SetTotalEngagementToTrigger(JNIEnv* env, |
| 338 const JavaParamRef<jclass>& clazz, | 343 const JavaParamRef<jclass>& clazz, |
| 339 jdouble engagement) { | 344 jdouble engagement) { |
| 340 AppBannerSettingsHelper::SetTotalEngagementToTrigger(engagement); | 345 AppBannerSettingsHelper::SetTotalEngagementToTrigger(engagement); |
| 341 } | 346 } |
| 342 | 347 |
| 343 } // namespace banners | 348 } // namespace banners |
| OLD | NEW |