Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: chrome/browser/android/banners/app_banner_manager_android.cc

Issue 2685363002: Update AppBannerManager & AppBannerManagerAndroid to request badge icon. (Closed)
Patch Set: Addressing comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/android/banners/app_banner_manager_android.h ('k') | chrome/browser/banners/app_banner_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698