| 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 | 8 |
| 9 #include "base/android/jni_android.h" | 9 #include "base/android/jni_android.h" |
| 10 #include "base/android/jni_array.h" |
| 10 #include "base/android/jni_string.h" | 11 #include "base/android/jni_string.h" |
| 11 #include "base/android/scoped_java_ref.h" | 12 #include "base/android/scoped_java_ref.h" |
| 12 #include "base/bind.h" | 13 #include "base/bind.h" |
| 13 #include "chrome/browser/android/logo_service.h" | 14 #include "chrome/browser/android/logo_service.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/profiles/profile_android.h" | 16 #include "chrome/browser/profiles/profile_android.h" |
| 16 #include "components/search_provider_logos/logo_tracker.h" | 17 #include "components/search_provider_logos/logo_tracker.h" |
| 17 #include "jni/LogoBridge_jni.h" | 18 #include "jni/LogoBridge_jni.h" |
| 18 #include "third_party/skia/include/core/SkBitmap.h" | 19 #include "third_party/skia/include/core/SkBitmap.h" |
| 19 #include "ui/gfx/android/java_bitmap.h" | 20 #include "ui/gfx/android/java_bitmap.h" |
| 20 | 21 |
| 22 using base::android::ConvertJavaStringToUTF8; |
| 23 using base::android::ConvertUTF8ToJavaString; |
| 21 using base::android::ScopedJavaLocalRef; | 24 using base::android::ScopedJavaLocalRef; |
| 22 using base::android::ConvertUTF8ToJavaString; | 25 using base::android::ToJavaByteArray; |
| 23 | 26 |
| 24 namespace { | 27 namespace { |
| 25 | 28 |
| 26 // Converts a C++ Logo to a Java Logo. | 29 // Converts a C++ Logo to a Java Logo. |
| 27 ScopedJavaLocalRef<jobject> ConvertLogoToJavaObject( | 30 ScopedJavaLocalRef<jobject> ConvertLogoToJavaObject( |
| 28 JNIEnv* env, | 31 JNIEnv* env, |
| 29 const search_provider_logos::Logo* logo) { | 32 const search_provider_logos::Logo* logo) { |
| 30 if (!logo) | 33 if (!logo) |
| 31 return ScopedJavaLocalRef<jobject>(); | 34 return ScopedJavaLocalRef<jobject>(); |
| 32 | 35 |
| 33 ScopedJavaLocalRef<jobject> j_bitmap = gfx::ConvertToJavaBitmap(&logo->image); | 36 ScopedJavaLocalRef<jobject> j_bitmap = gfx::ConvertToJavaBitmap(&logo->image); |
| 34 | 37 |
| 35 ScopedJavaLocalRef<jstring> j_on_click_url; | 38 ScopedJavaLocalRef<jstring> j_on_click_url; |
| 36 if (!logo->metadata.on_click_url.empty()) | 39 if (!logo->metadata.on_click_url.empty()) |
| 37 j_on_click_url = ConvertUTF8ToJavaString(env, logo->metadata.on_click_url); | 40 j_on_click_url = ConvertUTF8ToJavaString(env, logo->metadata.on_click_url); |
| 38 | 41 |
| 39 ScopedJavaLocalRef<jstring> j_alt_text; | 42 ScopedJavaLocalRef<jstring> j_alt_text; |
| 40 if (!logo->metadata.alt_text.empty()) | 43 if (!logo->metadata.alt_text.empty()) |
| 41 j_alt_text = ConvertUTF8ToJavaString(env, logo->metadata.alt_text); | 44 j_alt_text = ConvertUTF8ToJavaString(env, logo->metadata.alt_text); |
| 42 | 45 |
| 43 return Java_LogoBridge_createLogo( | 46 ScopedJavaLocalRef<jstring> j_animated_url; |
| 44 env, j_bitmap.obj(), j_on_click_url.obj(), j_alt_text.obj()); | 47 if (!logo->metadata.animated_url.empty()) |
| 48 j_animated_url = ConvertUTF8ToJavaString(env, logo->metadata.animated_url); |
| 49 |
| 50 return Java_LogoBridge_createLogo(env, j_bitmap.obj(), j_on_click_url.obj(), |
| 51 j_alt_text.obj(), j_animated_url.obj()); |
| 45 } | 52 } |
| 46 | 53 |
| 47 class LogoObserverAndroid : public search_provider_logos::LogoObserver { | 54 class LogoObserverAndroid : public search_provider_logos::LogoObserver { |
| 48 public: | 55 public: |
| 49 LogoObserverAndroid(base::WeakPtr<LogoBridge> logo_bridge, | 56 LogoObserverAndroid(base::WeakPtr<LogoBridge> logo_bridge, |
| 50 JNIEnv* env, | 57 JNIEnv* env, |
| 51 jobject j_logo_observer) | 58 jobject j_logo_observer) |
| 52 : logo_bridge_(logo_bridge) { | 59 : logo_bridge_(logo_bridge) { |
| 53 j_logo_observer_.Reset(env, j_logo_observer); | 60 j_logo_observer_.Reset(env, j_logo_observer); |
| 54 } | 61 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 jobject j_logo_observer) { | 110 jobject j_logo_observer) { |
| 104 if (!logo_service_) | 111 if (!logo_service_) |
| 105 return; | 112 return; |
| 106 | 113 |
| 107 // |observer| is deleted in LogoObserverAndroid::OnObserverRemoved(). | 114 // |observer| is deleted in LogoObserverAndroid::OnObserverRemoved(). |
| 108 LogoObserverAndroid* observer = new LogoObserverAndroid( | 115 LogoObserverAndroid* observer = new LogoObserverAndroid( |
| 109 weak_ptr_factory_.GetWeakPtr(), env, j_logo_observer); | 116 weak_ptr_factory_.GetWeakPtr(), env, j_logo_observer); |
| 110 logo_service_->GetLogo(observer); | 117 logo_service_->GetLogo(observer); |
| 111 } | 118 } |
| 112 | 119 |
| 120 void LogoBridge::GetAnimatedLogo(JNIEnv* env, |
| 121 jobject obj, |
| 122 jobject j_listener, |
| 123 jstring j_url) { |
| 124 if (!logo_service_) |
| 125 return; |
| 126 |
| 127 j_listener_weak_ref = JavaObjectWeakGlobalRef(env, j_listener); |
| 128 std::string url = ConvertJavaStringToUTF8(env, j_url); |
| 129 // Callback will be cancelled if the bridge is destroyed. |
| 130 logo_service_->GetAnimatedLogo(GURL(url), |
| 131 base::Bind(&LogoBridge::OnAnimatedLogoReady, |
| 132 weak_ptr_factory_.GetWeakPtr())); |
| 133 } |
| 134 |
| 135 void LogoBridge::OnAnimatedLogoReady(const std::string& raw_string) { |
| 136 JNIEnv* env = base::android::AttachCurrentThread(); |
| 137 ScopedJavaLocalRef<jobject> j_listener = j_listener_weak_ref.get(env); |
| 138 if (j_listener.is_null()) |
| 139 return; |
| 140 |
| 141 ScopedJavaLocalRef<jbyteArray> j_bytes = |
| 142 ToJavaByteArray(env, reinterpret_cast<const uint8*>(raw_string.data()), |
| 143 raw_string.length()); |
| 144 Java_GifListener_onGifDownloaded(env, j_listener.obj(), j_bytes.obj()); |
| 145 } |
| 146 |
| 113 // static | 147 // static |
| 114 bool RegisterLogoBridge(JNIEnv* env) { | 148 bool RegisterLogoBridge(JNIEnv* env) { |
| 115 return RegisterNativesImpl(env); | 149 return RegisterNativesImpl(env); |
| 116 } | 150 } |
| OLD | NEW |