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

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 (move can_install init to constructor) 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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