OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/logo_bridge.h" | 5 #include "chrome/browser/android/logo_bridge.h" |
6 | 6 |
7 #include <jni.h> | 7 #include <jni.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include "base/android/jni_android.h" | 10 #include "base/android/jni_android.h" |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 void LogoBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 219 void LogoBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
220 delete this; | 220 delete this; |
221 } | 221 } |
222 | 222 |
223 void LogoBridge::GetCurrentLogo(JNIEnv* env, | 223 void LogoBridge::GetCurrentLogo(JNIEnv* env, |
224 const JavaParamRef<jobject>& obj, | 224 const JavaParamRef<jobject>& obj, |
225 const JavaParamRef<jobject>& j_logo_observer) { | 225 const JavaParamRef<jobject>& j_logo_observer) { |
226 if (doodle_service_) { | 226 if (doodle_service_) { |
227 j_logo_observer_.Reset(j_logo_observer); | 227 j_logo_observer_.Reset(j_logo_observer); |
228 | 228 |
229 // Immediately hand out any current cached config. | 229 bool has_cached_config = doodle_service_->config().has_value(); |
230 DoodleConfigReceived(doodle_service_->config(), /*from_cache=*/true); | 230 if (has_cached_config) { |
| 231 FetchDoodleImage(doodle_service_->config().value(), /*from_cache=*/true); |
| 232 } |
231 // Also request a refresh, in case something changed. | 233 // Also request a refresh, in case something changed. |
232 doodle_service_->Refresh(); | 234 bool has_triggered_refresh = doodle_service_->Refresh(); |
| 235 if (!has_cached_config && !has_triggered_refresh) { |
| 236 // With neither cache hit or refresh, no doodle can be expected soon. |
| 237 NotifyNoLogoAvailable(/*from_cache=*/true); |
| 238 } |
233 } else { | 239 } else { |
234 // |observer| is deleted in LogoObserverAndroid::OnObserverRemoved(). | 240 // |observer| is deleted in LogoObserverAndroid::OnObserverRemoved(). |
235 LogoObserverAndroid* observer = new LogoObserverAndroid( | 241 LogoObserverAndroid* observer = new LogoObserverAndroid( |
236 weak_ptr_factory_.GetWeakPtr(), env, j_logo_observer); | 242 weak_ptr_factory_.GetWeakPtr(), env, j_logo_observer); |
237 logo_service_->GetLogo(observer); | 243 logo_service_->GetLogo(observer); |
238 } | 244 } |
239 } | 245 } |
240 | 246 |
241 void LogoBridge::GetAnimatedLogo(JNIEnv* env, | 247 void LogoBridge::GetAnimatedLogo(JNIEnv* env, |
242 const JavaParamRef<jobject>& obj, | 248 const JavaParamRef<jobject>& obj, |
243 const JavaParamRef<jobject>& j_callback, | 249 const JavaParamRef<jobject>& j_callback, |
244 const JavaParamRef<jstring>& j_url) { | 250 const JavaParamRef<jstring>& j_url) { |
245 GURL url = GURL(ConvertJavaStringToUTF8(env, j_url)); | 251 GURL url = GURL(ConvertJavaStringToUTF8(env, j_url)); |
246 animated_logo_fetcher_->Start(env, url, j_callback); | 252 animated_logo_fetcher_->Start(env, url, j_callback); |
247 } | 253 } |
248 | 254 |
249 void LogoBridge::OnDoodleConfigUpdated( | 255 void LogoBridge::OnDoodleConfigUpdated( |
250 const base::Optional<doodle::DoodleConfig>& maybe_doodle_config) { | 256 const base::Optional<doodle::DoodleConfig>& maybe_doodle_config) { |
251 if (j_logo_observer_.is_null()) { | 257 if (j_logo_observer_.is_null()) { |
252 return; | 258 return; |
253 } | 259 } |
254 DoodleConfigReceived(maybe_doodle_config, /*from_cache=*/false); | 260 if (!maybe_doodle_config.has_value()) { |
| 261 NotifyNoLogoAvailable(/*from_cache=*/false); |
| 262 return; |
| 263 } |
| 264 FetchDoodleImage(maybe_doodle_config.value(), /*from_cache=*/false); |
255 } | 265 } |
256 | 266 |
257 void LogoBridge::DoodleConfigReceived( | 267 void LogoBridge::NotifyNoLogoAvailable(bool from_cache) { |
258 const base::Optional<doodle::DoodleConfig>& maybe_doodle_config, | 268 JNIEnv* env = base::android::AttachCurrentThread(); |
259 bool from_cache) { | 269 Java_LogoObserver_onLogoAvailable(env, j_logo_observer_, |
| 270 ScopedJavaLocalRef<jobject>(), from_cache); |
| 271 } |
| 272 |
| 273 void LogoBridge::FetchDoodleImage(const doodle::DoodleConfig& doodle_config, |
| 274 bool from_cache) { |
260 DCHECK(!j_logo_observer_.is_null()); | 275 DCHECK(!j_logo_observer_.is_null()); |
261 | 276 |
262 if (!maybe_doodle_config.has_value()) { | |
263 JNIEnv* env = base::android::AttachCurrentThread(); | |
264 Java_LogoObserver_onLogoAvailable( | |
265 env, j_logo_observer_, ScopedJavaLocalRef<jobject>(), from_cache); | |
266 return; | |
267 } | |
268 const doodle::DoodleConfig& doodle_config = maybe_doodle_config.value(); | |
269 // If there is a CTA image, that means the main image is animated. Show the | 277 // If there is a CTA image, that means the main image is animated. Show the |
270 // non-animated CTA image first, and load the animated one only when the | 278 // non-animated CTA image first, and load the animated one only when the |
271 // user requests it. | 279 // user requests it. |
272 bool has_cta = doodle_config.large_cta_image.has_value(); | 280 bool has_cta = doodle_config.large_cta_image.has_value(); |
273 const GURL& image_url = has_cta ? doodle_config.large_cta_image->url | 281 const GURL& image_url = has_cta ? doodle_config.large_cta_image->url |
274 : doodle_config.large_image.url; | 282 : doodle_config.large_image.url; |
275 const GURL& animated_image_url = | 283 const GURL& animated_image_url = |
276 has_cta ? doodle_config.large_image.url : GURL::EmptyGURL(); | 284 has_cta ? doodle_config.large_image.url : GURL::EmptyGURL(); |
277 // TODO(treib): For interactive doodles, use |fullpage_interactive_url| | 285 // TODO(treib): For interactive doodles, use |fullpage_interactive_url| |
278 // instead of |target_url|? | 286 // instead of |target_url|? |
(...skipping 29 matching lines...) Expand all Loading... |
308 ScopedJavaLocalRef<jobject> j_logo = MakeJavaLogo( | 316 ScopedJavaLocalRef<jobject> j_logo = MakeJavaLogo( |
309 env, image.ToSkBitmap(), on_click_url, alt_text, animated_image_url); | 317 env, image.ToSkBitmap(), on_click_url, alt_text, animated_image_url); |
310 Java_LogoObserver_onLogoAvailable(env, j_logo_observer_, j_logo, | 318 Java_LogoObserver_onLogoAvailable(env, j_logo_observer_, j_logo, |
311 config_from_cache); | 319 config_from_cache); |
312 } | 320 } |
313 | 321 |
314 // static | 322 // static |
315 bool RegisterLogoBridge(JNIEnv* env) { | 323 bool RegisterLogoBridge(JNIEnv* env) { |
316 return RegisterNativesImpl(env); | 324 return RegisterNativesImpl(env); |
317 } | 325 } |
OLD | NEW |