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

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() {
166 InstallableParams params =
167 AppBannerManager::ParamsToPerformInstallableCheck();
168
169 if (ChromeWebApkHost::CanInstallWebApk()) {
dominickn 2017/02/15 06:05:47 This is now called twice in this class. I actually
F 2017/02/15 20:05:43 Done.
170 params.ideal_badge_icon_size_in_px = GetIdealBadgeIconSizeInPx();
171 params.minimum_badge_icon_size_in_px = GetIdealBadgeIconSizeInPx();
172 params.fetch_valid_badge_icon = true;
173 }
174
175 return params;
176 }
177
161 void AppBannerManagerAndroid::PerformInstallableCheck() { 178 void AppBannerManagerAndroid::PerformInstallableCheck() {
162 // Check if the manifest prefers that we show a native app banner. If so, call 179 // Check if the manifest prefers that we show a native app banner. If so, call
163 // to Java to verify the details. 180 // to Java to verify the details.
164 if (manifest_.prefer_related_applications && 181 if (manifest_.prefer_related_applications &&
165 manifest_.related_applications.size()) { 182 manifest_.related_applications.size()) {
166 for (const auto& application : manifest_.related_applications) { 183 for (const auto& application : manifest_.related_applications) {
167 std::string platform = base::UTF16ToUTF8(application.platform.string()); 184 std::string platform = base::UTF16ToUTF8(application.platform.string());
168 std::string id = base::UTF16ToUTF8(application.id.string()); 185 std::string id = base::UTF16ToUTF8(application.id.string());
169 if (CanHandleNonWebApp(platform, application.url, id)) 186 if (CanHandleNonWebApp(platform, application.url, id))
170 return; 187 return;
171 } 188 }
172 Stop(); 189 Stop();
173 } 190 }
174 191
175 if (ChromeWebApkHost::CanInstallWebApk()) { 192 if (ChromeWebApkHost::CanInstallWebApk()) {
176 if (!AreWebManifestUrlsWebApkCompatible(manifest_)) { 193 if (!AreWebManifestUrlsWebApkCompatible(manifest_)) {
177 ReportStatus(web_contents(), URL_NOT_SUPPORTED_FOR_WEBAPK); 194 ReportStatus(web_contents(), URL_NOT_SUPPORTED_FOR_WEBAPK);
178 Stop(); 195 Stop();
179 return; 196 return;
180 } 197 }
181 } 198 }
182 199
183 // No native app banner was requested. Continue checking for a web app banner. 200 // No native app banner was requested. Continue checking for a web app banner.
184 AppBannerManager::PerformInstallableCheck(); 201 AppBannerManager::PerformInstallableCheck();
185 } 202 }
186 203
204 void AppBannerManagerAndroid::OnDidPerformInstallableCheck(
205 const InstallableData& data) {
206 if (data.badge_icon && !data.badge_icon->drawsNothing()) {
207 DCHECK(!data.badge_icon_url.is_empty());
208
209 badge_icon_url_ = data.badge_icon_url;
210 badge_icon_.reset(new SkBitmap(*data.badge_icon));
211 }
212
213 AppBannerManager::OnDidPerformInstallableCheck(data);
214 }
215
187 void AppBannerManagerAndroid::OnAppIconFetched(const SkBitmap& bitmap) { 216 void AppBannerManagerAndroid::OnAppIconFetched(const SkBitmap& bitmap) {
188 if (bitmap.drawsNothing()) { 217 if (bitmap.drawsNothing()) {
189 ReportStatus(web_contents(), NO_ICON_AVAILABLE); 218 ReportStatus(web_contents(), NO_ICON_AVAILABLE);
190 Stop(); 219 Stop();
191 } 220 }
192 221
193 if (!is_active()) 222 if (!is_active())
194 return; 223 return;
195 224
196 icon_.reset(new SkBitmap(bitmap)); 225 primary_icon_.reset(new SkBitmap(bitmap));
197 SendBannerPromptRequest(); 226 SendBannerPromptRequest();
198 } 227 }
199 228
200 void AppBannerManagerAndroid::ResetCurrentPageData() { 229 void AppBannerManagerAndroid::ResetCurrentPageData() {
201 AppBannerManager::ResetCurrentPageData(); 230 AppBannerManager::ResetCurrentPageData();
202 native_app_data_.Reset(); 231 native_app_data_.Reset();
203 native_app_package_ = ""; 232 native_app_package_ = "";
204 } 233 }
205 234
206 void AppBannerManagerAndroid::ShowBanner() { 235 void AppBannerManagerAndroid::ShowBanner() {
207 content::WebContents* contents = web_contents(); 236 content::WebContents* contents = web_contents();
208 DCHECK(contents); 237 DCHECK(contents);
209 238
210 if (native_app_data_.is_null()) { 239 if (native_app_data_.is_null()) {
240 // TODO(zpeng): Add badge to WebAPK installation flow.
211 if (AppBannerInfoBarDelegateAndroid::Create( 241 if (AppBannerInfoBarDelegateAndroid::Create(
212 contents, GetWeakPtr(), app_title_, 242 contents, GetWeakPtr(), app_title_,
213 CreateShortcutInfo(manifest_url_, manifest_, icon_url_), 243 CreateShortcutInfo(manifest_url_, manifest_, primary_icon_url_),
214 std::move(icon_), event_request_id(), 244 std::move(primary_icon_), event_request_id(),
215 webapk::INSTALL_SOURCE_BANNER)) { 245 webapk::INSTALL_SOURCE_BANNER)) {
216 RecordDidShowBanner("AppBanner.WebApp.Shown"); 246 RecordDidShowBanner("AppBanner.WebApp.Shown");
217 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED); 247 TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED);
218 ReportStatus(contents, SHOWING_WEB_APP_BANNER); 248 ReportStatus(contents, SHOWING_WEB_APP_BANNER);
219 } else { 249 } else {
220 ReportStatus(contents, FAILED_TO_CREATE_BANNER); 250 ReportStatus(contents, FAILED_TO_CREATE_BANNER);
221 } 251 }
222 } else { 252 } else {
223 if (AppBannerInfoBarDelegateAndroid::Create( 253 if (AppBannerInfoBarDelegateAndroid::Create(
224 contents, app_title_, native_app_data_, std::move(icon_), 254 contents, app_title_, native_app_data_, std::move(primary_icon_),
225 native_app_package_, referrer_, event_request_id())) { 255 native_app_package_, referrer_, event_request_id())) {
226 RecordDidShowBanner("AppBanner.NativeApp.Shown"); 256 RecordDidShowBanner("AppBanner.NativeApp.Shown");
227 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED); 257 TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED);
228 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER); 258 ReportStatus(contents, SHOWING_NATIVE_APP_BANNER);
229 } else { 259 } else {
230 ReportStatus(contents, FAILED_TO_CREATE_BANNER); 260 ReportStatus(contents, FAILED_TO_CREATE_BANNER);
231 } 261 }
232 } 262 }
233 } 263 }
234 264
(...skipping 22 matching lines...) Expand all
257 if (!referrer.empty()) 287 if (!referrer.empty())
258 referrer += "&"; 288 referrer += "&";
259 referrer += "playinline=chrome_inline"; 289 referrer += "playinline=chrome_inline";
260 290
261 ScopedJavaLocalRef<jstring> jurl( 291 ScopedJavaLocalRef<jstring> jurl(
262 ConvertUTF8ToJavaString(env, validated_url_.spec())); 292 ConvertUTF8ToJavaString(env, validated_url_.spec()));
263 ScopedJavaLocalRef<jstring> jpackage(ConvertUTF8ToJavaString(env, id)); 293 ScopedJavaLocalRef<jstring> jpackage(ConvertUTF8ToJavaString(env, id));
264 ScopedJavaLocalRef<jstring> jreferrer(ConvertUTF8ToJavaString(env, referrer)); 294 ScopedJavaLocalRef<jstring> jreferrer(ConvertUTF8ToJavaString(env, referrer));
265 Java_AppBannerManager_fetchAppDetails(env, java_banner_manager_, jurl, 295 Java_AppBannerManager_fetchAppDetails(env, java_banner_manager_, jurl,
266 jpackage, jreferrer, 296 jpackage, jreferrer,
267 GetIdealIconSizeInPx()); 297 GetIdealPrimaryIconSizeInPx());
268 return true; 298 return true;
269 } 299 }
270 300
271 void AppBannerManagerAndroid::CreateJavaBannerManager() { 301 void AppBannerManagerAndroid::CreateJavaBannerManager() {
272 JNIEnv* env = base::android::AttachCurrentThread(); 302 JNIEnv* env = base::android::AttachCurrentThread();
273 java_banner_manager_.Reset( 303 java_banner_manager_.Reset(
274 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this))); 304 Java_AppBannerManager_create(env, reinterpret_cast<intptr_t>(this)));
275 } 305 }
276 306
277 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform, 307 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 } 364 }
335 365
336 // static 366 // static
337 void SetTotalEngagementToTrigger(JNIEnv* env, 367 void SetTotalEngagementToTrigger(JNIEnv* env,
338 const JavaParamRef<jclass>& clazz, 368 const JavaParamRef<jclass>& clazz,
339 jdouble engagement) { 369 jdouble engagement) {
340 AppBannerSettingsHelper::SetTotalEngagementToTrigger(engagement); 370 AppBannerSettingsHelper::SetTotalEngagementToTrigger(engagement);
341 } 371 }
342 372
343 } // namespace banners 373 } // 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