Index: chrome/browser/android/logo_bridge.cc |
diff --git a/chrome/browser/android/logo_bridge.cc b/chrome/browser/android/logo_bridge.cc |
index d2250b2232e067f2e334d15deb60ca23118d2b4c..2c4a83a4e1a06e653d211f6d6f9b04dc1b9ab37b 100644 |
--- a/chrome/browser/android/logo_bridge.cc |
+++ b/chrome/browser/android/logo_bridge.cc |
@@ -7,6 +7,7 @@ |
#include <jni.h> |
#include "base/android/jni_android.h" |
+#include "base/android/jni_array.h" |
#include "base/android/jni_string.h" |
#include "base/android/scoped_java_ref.h" |
#include "base/bind.h" |
@@ -18,8 +19,10 @@ |
#include "third_party/skia/include/core/SkBitmap.h" |
#include "ui/gfx/android/java_bitmap.h" |
-using base::android::ScopedJavaLocalRef; |
+using base::android::ConvertJavaStringToUTF8; |
using base::android::ConvertUTF8ToJavaString; |
+using base::android::ScopedJavaLocalRef; |
+using base::android::ToJavaByteArray; |
namespace { |
@@ -40,8 +43,12 @@ ScopedJavaLocalRef<jobject> ConvertLogoToJavaObject( |
if (!logo->metadata.alt_text.empty()) |
j_alt_text = ConvertUTF8ToJavaString(env, logo->metadata.alt_text); |
- return Java_LogoBridge_createLogo( |
- env, j_bitmap.obj(), j_on_click_url.obj(), j_alt_text.obj()); |
+ ScopedJavaLocalRef<jstring> j_animated_url; |
+ if (!logo->metadata.animated_url.empty()) |
+ j_animated_url = ConvertUTF8ToJavaString(env, logo->metadata.animated_url); |
+ |
+ return Java_LogoBridge_createLogo(env, j_bitmap.obj(), j_on_click_url.obj(), |
+ j_alt_text.obj(), j_animated_url.obj()); |
} |
class LogoObserverAndroid : public search_provider_logos::LogoObserver { |
@@ -110,6 +117,33 @@ void LogoBridge::GetCurrentLogo(JNIEnv* env, |
logo_service_->GetLogo(observer); |
} |
+void LogoBridge::GetAnimatedLogo(JNIEnv* env, |
+ jobject obj, |
+ jobject j_listener, |
+ jstring j_url) { |
+ if (!logo_service_) |
+ return; |
+ |
+ j_listener_weak_ref = JavaObjectWeakGlobalRef(env, j_listener); |
+ std::string url = ConvertJavaStringToUTF8(env, j_url); |
+ // Callback will be cancelled if the bridge is destroyed. |
+ logo_service_->GetAnimatedLogo(GURL(url), |
+ base::Bind(&LogoBridge::OnAnimatedLogoReady, |
+ weak_ptr_factory_.GetWeakPtr())); |
+} |
+ |
+void LogoBridge::OnAnimatedLogoReady(const std::string& raw_string) { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ ScopedJavaLocalRef<jobject> j_listener = j_listener_weak_ref.get(env); |
+ if (j_listener.is_null()) |
+ return; |
+ |
+ ScopedJavaLocalRef<jbyteArray> j_bytes = |
+ ToJavaByteArray(env, reinterpret_cast<const uint8*>(raw_string.data()), |
+ raw_string.length()); |
+ Java_GifListener_onGifDownloaded(env, j_listener.obj(), j_bytes.obj()); |
+} |
+ |
// static |
bool RegisterLogoBridge(JNIEnv* env) { |
return RegisterNativesImpl(env); |