OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/webapk/webapk_update_data_fetcher.h" | 5 #include "chrome/browser/android/webapk/webapk_update_data_fetcher.h" |
6 | 6 |
7 #include <jni.h> | 7 #include <jni.h> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/android/jni_array.h" | 10 #include "base/android/jni_array.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 if (!IsInScope(url, scope_)) { | 107 if (!IsInScope(url, scope_)) { |
108 OnWebManifestNotWebApkCompatible(); | 108 OnWebManifestNotWebApkCompatible(); |
109 return; | 109 return; |
110 } | 110 } |
111 | 111 |
112 InstallableParams params; | 112 InstallableParams params; |
113 params.ideal_primary_icon_size_in_px = | 113 params.ideal_primary_icon_size_in_px = |
114 ShortcutHelper::GetIdealHomescreenIconSizeInPx(); | 114 ShortcutHelper::GetIdealHomescreenIconSizeInPx(); |
115 params.minimum_primary_icon_size_in_px = | 115 params.minimum_primary_icon_size_in_px = |
116 ShortcutHelper::GetMinimumHomescreenIconSizeInPx(); | 116 ShortcutHelper::GetMinimumHomescreenIconSizeInPx(); |
| 117 params.ideal_badge_icon_size_in_px = |
| 118 ShortcutHelper::GetIdealBadgeIconSizeInPx(); |
| 119 params.minimum_badge_icon_size_in_px = |
| 120 ShortcutHelper::GetIdealBadgeIconSizeInPx(); |
117 params.check_installable = true; | 121 params.check_installable = true; |
118 params.fetch_valid_primary_icon = true; | 122 params.fetch_valid_primary_icon = true; |
| 123 params.fetch_valid_badge_icon = true; |
119 InstallableManager::CreateForWebContents(web_contents()); | 124 InstallableManager::CreateForWebContents(web_contents()); |
120 InstallableManager* installable_manager = | 125 InstallableManager* installable_manager = |
121 InstallableManager::FromWebContents(web_contents()); | 126 InstallableManager::FromWebContents(web_contents()); |
122 installable_manager->GetData( | 127 installable_manager->GetData( |
123 params, base::Bind(&WebApkUpdateDataFetcher::OnDidGetInstallableData, | 128 params, base::Bind(&WebApkUpdateDataFetcher::OnDidGetInstallableData, |
124 weak_ptr_factory_.GetWeakPtr())); | 129 weak_ptr_factory_.GetWeakPtr())); |
125 } | 130 } |
126 | 131 |
127 void WebApkUpdateDataFetcher::OnDidGetInstallableData( | 132 void WebApkUpdateDataFetcher::OnDidGetInstallableData( |
128 const InstallableData& data) { | 133 const InstallableData& data) { |
(...skipping 14 matching lines...) Expand all Loading... |
143 if (data.error_code != NO_ERROR_DETECTED || data.manifest.IsEmpty() || | 148 if (data.error_code != NO_ERROR_DETECTED || data.manifest.IsEmpty() || |
144 web_manifest_url_ != data.manifest_url || | 149 web_manifest_url_ != data.manifest_url || |
145 !AreWebManifestUrlsWebApkCompatible(data.manifest)) { | 150 !AreWebManifestUrlsWebApkCompatible(data.manifest)) { |
146 OnWebManifestNotWebApkCompatible(); | 151 OnWebManifestNotWebApkCompatible(); |
147 return; | 152 return; |
148 } | 153 } |
149 | 154 |
150 info_.UpdateFromManifest(data.manifest); | 155 info_.UpdateFromManifest(data.manifest); |
151 info_.manifest_url = data.manifest_url; | 156 info_.manifest_url = data.manifest_url; |
152 info_.best_primary_icon_url = data.primary_icon_url; | 157 info_.best_primary_icon_url = data.primary_icon_url; |
153 best_primary_icon_ = *data.primary_icon; | 158 primary_icon_ = *data.primary_icon; |
| 159 |
| 160 if (data.badge_icon && !data.badge_icon->drawsNothing()) { |
| 161 info_.best_badge_icon_url = data.badge_icon_url; |
| 162 badge_icon_ = *data.badge_icon; |
| 163 } |
154 | 164 |
155 Profile* profile = | 165 Profile* profile = |
156 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | 166 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
157 | 167 |
158 WebApkIconHasher::DownloadAndComputeMurmur2Hash( | 168 WebApkIconHasher::DownloadAndComputeMurmur2Hash( |
159 profile->GetRequestContext(), data.primary_icon_url, | 169 profile->GetRequestContext(), info_.best_primary_icon_url, |
160 base::Bind(&WebApkUpdateDataFetcher::OnGotIconMurmur2Hash, | 170 base::Bind(&WebApkUpdateDataFetcher::OnGotPrimaryIconMurmur2Hash, |
161 weak_ptr_factory_.GetWeakPtr())); | 171 weak_ptr_factory_.GetWeakPtr())); |
162 } | 172 } |
163 | 173 |
164 void WebApkUpdateDataFetcher::OnGotIconMurmur2Hash( | 174 void WebApkUpdateDataFetcher::OnGotPrimaryIconMurmur2Hash( |
165 const std::string& best_primary_icon_murmur2_hash) { | 175 const std::string& primary_icon_murmur2_hash) { |
166 if (best_primary_icon_murmur2_hash.empty()) { | 176 if (primary_icon_murmur2_hash.empty()) { |
167 OnWebManifestNotWebApkCompatible(); | 177 OnWebManifestNotWebApkCompatible(); |
168 return; | 178 return; |
169 } | 179 } |
170 | 180 |
171 OnDataAvailable(info_, best_primary_icon_murmur2_hash, best_primary_icon_); | 181 if (!info_.best_badge_icon_url.is_empty() && |
| 182 info_.best_badge_icon_url != info_.best_primary_icon_url) { |
| 183 Profile* profile = |
| 184 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
| 185 |
| 186 WebApkIconHasher::DownloadAndComputeMurmur2Hash( |
| 187 profile->GetRequestContext(), info_.best_badge_icon_url, |
| 188 base::Bind(&WebApkUpdateDataFetcher::OnDataAvailable, |
| 189 weak_ptr_factory_.GetWeakPtr(), primary_icon_murmur2_hash, |
| 190 true)); |
| 191 } else { |
| 192 OnDataAvailable(primary_icon_murmur2_hash, false, ""); |
| 193 } |
172 } | 194 } |
173 | 195 |
174 void WebApkUpdateDataFetcher::OnDataAvailable( | 196 void WebApkUpdateDataFetcher::OnDataAvailable( |
175 const ShortcutInfo& info, | 197 const std::string& primary_icon_murmur2_hash, |
176 const std::string& best_primary_icon_murmur2_hash, | 198 bool did_fetch_badge_icon, |
177 const SkBitmap& best_primary_icon) { | 199 const std::string& badge_icon_murmur2_hash) { |
| 200 if (did_fetch_badge_icon && badge_icon_murmur2_hash.empty()) { |
| 201 OnWebManifestNotWebApkCompatible(); |
| 202 return; |
| 203 } |
| 204 |
178 JNIEnv* env = base::android::AttachCurrentThread(); | 205 JNIEnv* env = base::android::AttachCurrentThread(); |
179 | 206 |
180 ScopedJavaLocalRef<jstring> java_url = | 207 ScopedJavaLocalRef<jstring> java_url = |
181 base::android::ConvertUTF8ToJavaString(env, info.url.spec()); | 208 base::android::ConvertUTF8ToJavaString(env, info_.url.spec()); |
182 ScopedJavaLocalRef<jstring> java_scope = | 209 ScopedJavaLocalRef<jstring> java_scope = |
183 base::android::ConvertUTF8ToJavaString(env, info.scope.spec()); | 210 base::android::ConvertUTF8ToJavaString(env, info_.scope.spec()); |
184 ScopedJavaLocalRef<jstring> java_name = | 211 ScopedJavaLocalRef<jstring> java_name = |
185 base::android::ConvertUTF16ToJavaString(env, info.name); | 212 base::android::ConvertUTF16ToJavaString(env, info_.name); |
186 ScopedJavaLocalRef<jstring> java_short_name = | 213 ScopedJavaLocalRef<jstring> java_short_name = |
187 base::android::ConvertUTF16ToJavaString(env, info.short_name); | 214 base::android::ConvertUTF16ToJavaString(env, info_.short_name); |
188 ScopedJavaLocalRef<jstring> java_best_primary_icon_url = | 215 ScopedJavaLocalRef<jstring> java_primary_icon_url = |
| 216 base::android::ConvertUTF8ToJavaString( |
| 217 env, info_.best_primary_icon_url.spec()); |
| 218 ScopedJavaLocalRef<jstring> java_primary_icon_murmur2_hash = |
189 base::android::ConvertUTF8ToJavaString(env, | 219 base::android::ConvertUTF8ToJavaString(env, |
190 info.best_primary_icon_url.spec()); | 220 primary_icon_murmur2_hash); |
191 ScopedJavaLocalRef<jstring> java_best_primary_icon_murmur2_hash = | 221 ScopedJavaLocalRef<jobject> java_primary_icon = |
| 222 gfx::ConvertToJavaBitmap(&primary_icon_); |
| 223 ScopedJavaLocalRef<jstring> java_badge_icon_url = |
192 base::android::ConvertUTF8ToJavaString(env, | 224 base::android::ConvertUTF8ToJavaString(env, |
193 best_primary_icon_murmur2_hash); | 225 info_.best_badge_icon_url.spec()); |
194 ScopedJavaLocalRef<jobject> java_best_primary_icon = | 226 ScopedJavaLocalRef<jstring> java_badge_icon_murmur2_hash = |
195 gfx::ConvertToJavaBitmap(&best_primary_icon); | 227 base::android::ConvertUTF8ToJavaString(env, |
196 | 228 badge_icon_murmur2_hash); |
| 229 ScopedJavaLocalRef<jobject> java_badge_icon; |
| 230 if (!badge_icon_.drawsNothing()) |
| 231 java_badge_icon = gfx::ConvertToJavaBitmap(&badge_icon_); |
197 ScopedJavaLocalRef<jobjectArray> java_icon_urls = | 232 ScopedJavaLocalRef<jobjectArray> java_icon_urls = |
198 base::android::ToJavaArrayOfStrings(env, info.icon_urls); | 233 base::android::ToJavaArrayOfStrings(env, info_.icon_urls); |
199 | 234 |
200 Java_WebApkUpdateDataFetcher_onDataAvailable( | 235 Java_WebApkUpdateDataFetcher_onDataAvailable( |
201 env, java_ref_, java_url, java_scope, java_name, java_short_name, | 236 env, java_ref_, java_url, java_scope, java_name, java_short_name, |
202 java_best_primary_icon_url, java_best_primary_icon_murmur2_hash, | 237 java_primary_icon_url, java_primary_icon_murmur2_hash, |
203 java_best_primary_icon, java_icon_urls, info.display, info.orientation, | 238 java_primary_icon, java_badge_icon_url, java_badge_icon_murmur2_hash, |
204 info.theme_color, info.background_color); | 239 java_badge_icon, java_icon_urls, info_.display, info_.orientation, |
| 240 info_.theme_color, info_.background_color); |
205 } | 241 } |
206 | 242 |
207 void WebApkUpdateDataFetcher::OnWebManifestNotWebApkCompatible() { | 243 void WebApkUpdateDataFetcher::OnWebManifestNotWebApkCompatible() { |
208 if (!is_initial_fetch_) | 244 if (!is_initial_fetch_) |
209 return; | 245 return; |
210 | 246 |
211 Java_WebApkUpdateDataFetcher_onWebManifestForInitialUrlNotWebApkCompatible( | 247 Java_WebApkUpdateDataFetcher_onWebManifestForInitialUrlNotWebApkCompatible( |
212 base::android::AttachCurrentThread(), java_ref_); | 248 base::android::AttachCurrentThread(), java_ref_); |
213 } | 249 } |
OLD | NEW |