Chromium Code Reviews| 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 "chrome/browser/android/logo_service.h" | 13 #include "chrome/browser/android/logo_service.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/profiles/profile_android.h" | 15 #include "chrome/browser/profiles/profile_android.h" |
| 16 #include "components/search_provider_logos/logo_tracker.h" | 16 #include "components/search_provider_logos/logo_tracker.h" |
| 17 #include "jni/LogoBridge_jni.h" | 17 #include "jni/LogoBridge_jni.h" |
| 18 #include "net/url_request/url_fetcher.h" | |
| 19 #include "net/url_request/url_request_context_getter.h" | |
| 20 #include "net/url_request/url_request_status.h" | |
| 18 #include "third_party/skia/include/core/SkBitmap.h" | 21 #include "third_party/skia/include/core/SkBitmap.h" |
| 19 #include "ui/gfx/android/java_bitmap.h" | 22 #include "ui/gfx/android/java_bitmap.h" |
| 20 | 23 |
| 24 using base::android::ConvertJavaStringToUTF8; | |
| 25 using base::android::ConvertUTF8ToJavaString; | |
| 21 using base::android::ScopedJavaLocalRef; | 26 using base::android::ScopedJavaLocalRef; |
| 22 using base::android::ConvertUTF8ToJavaString; | 27 using base::android::ToJavaByteArray; |
| 23 | 28 |
| 24 namespace { | 29 namespace { |
| 25 | 30 |
| 26 // Converts a C++ Logo to a Java Logo. | 31 // Converts a C++ Logo to a Java Logo. |
| 27 ScopedJavaLocalRef<jobject> ConvertLogoToJavaObject( | 32 ScopedJavaLocalRef<jobject> ConvertLogoToJavaObject( |
| 28 JNIEnv* env, | 33 JNIEnv* env, |
| 29 const search_provider_logos::Logo* logo) { | 34 const search_provider_logos::Logo* logo) { |
| 30 if (!logo) | 35 if (!logo) |
| 31 return ScopedJavaLocalRef<jobject>(); | 36 return ScopedJavaLocalRef<jobject>(); |
| 32 | 37 |
| 33 ScopedJavaLocalRef<jobject> j_bitmap = gfx::ConvertToJavaBitmap(&logo->image); | 38 ScopedJavaLocalRef<jobject> j_bitmap = gfx::ConvertToJavaBitmap(&logo->image); |
| 34 | 39 |
| 35 ScopedJavaLocalRef<jstring> j_on_click_url; | 40 ScopedJavaLocalRef<jstring> j_on_click_url; |
| 36 if (!logo->metadata.on_click_url.empty()) | 41 if (!logo->metadata.on_click_url.empty()) |
| 37 j_on_click_url = ConvertUTF8ToJavaString(env, logo->metadata.on_click_url); | 42 j_on_click_url = ConvertUTF8ToJavaString(env, logo->metadata.on_click_url); |
| 38 | 43 |
| 39 ScopedJavaLocalRef<jstring> j_alt_text; | 44 ScopedJavaLocalRef<jstring> j_alt_text; |
| 40 if (!logo->metadata.alt_text.empty()) | 45 if (!logo->metadata.alt_text.empty()) |
| 41 j_alt_text = ConvertUTF8ToJavaString(env, logo->metadata.alt_text); | 46 j_alt_text = ConvertUTF8ToJavaString(env, logo->metadata.alt_text); |
| 42 | 47 |
| 43 return Java_LogoBridge_createLogo( | 48 ScopedJavaLocalRef<jstring> j_animated_url; |
| 44 env, j_bitmap.obj(), j_on_click_url.obj(), j_alt_text.obj()); | 49 if (!logo->metadata.animated_url.empty()) |
| 50 j_animated_url = ConvertUTF8ToJavaString(env, logo->metadata.animated_url); | |
| 51 | |
| 52 return Java_LogoBridge_createLogo(env, j_bitmap.obj(), j_on_click_url.obj(), | |
| 53 j_alt_text.obj(), j_animated_url.obj()); | |
| 45 } | 54 } |
| 46 | 55 |
| 47 class LogoObserverAndroid : public search_provider_logos::LogoObserver { | 56 class LogoObserverAndroid : public search_provider_logos::LogoObserver { |
| 48 public: | 57 public: |
| 49 LogoObserverAndroid(base::WeakPtr<LogoBridge> logo_bridge, | 58 LogoObserverAndroid(base::WeakPtr<LogoBridge> logo_bridge, |
| 50 JNIEnv* env, | 59 JNIEnv* env, |
| 51 jobject j_logo_observer) | 60 jobject j_logo_observer) |
| 52 : logo_bridge_(logo_bridge) { | 61 : logo_bridge_(logo_bridge) { |
| 53 j_logo_observer_.Reset(env, j_logo_observer); | 62 j_logo_observer_.Reset(env, j_logo_observer); |
| 54 } | 63 } |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 81 | 90 |
| 82 static jlong Init(JNIEnv* env, | 91 static jlong Init(JNIEnv* env, |
| 83 const JavaParamRef<jobject>& obj, | 92 const JavaParamRef<jobject>& obj, |
| 84 const JavaParamRef<jobject>& j_profile) { | 93 const JavaParamRef<jobject>& j_profile) { |
| 85 LogoBridge* logo_bridge = new LogoBridge(j_profile); | 94 LogoBridge* logo_bridge = new LogoBridge(j_profile); |
| 86 return reinterpret_cast<intptr_t>(logo_bridge); | 95 return reinterpret_cast<intptr_t>(logo_bridge); |
| 87 } | 96 } |
| 88 | 97 |
| 89 LogoBridge::LogoBridge(jobject j_profile) : weak_ptr_factory_(this) { | 98 LogoBridge::LogoBridge(jobject j_profile) : weak_ptr_factory_(this) { |
| 90 Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); | 99 Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); |
| 91 if (profile) | 100 if (profile) { |
| 92 logo_service_ = LogoServiceFactory::GetForProfile(profile); | 101 logo_service_ = LogoServiceFactory::GetForProfile(profile); |
| 102 request_context_getter_ = profile->GetRequestContext(); | |
| 103 } | |
| 93 } | 104 } |
| 94 | 105 |
| 95 LogoBridge::~LogoBridge() {} | 106 LogoBridge::~LogoBridge() { |
| 107 ClearFetcher(); | |
|
newt (away)
2015/09/23 20:38:43
this isn't technically needed, but I think it's OK
| |
| 108 } | |
| 96 | 109 |
| 97 void LogoBridge::Destroy(JNIEnv* env, jobject obj) { | 110 void LogoBridge::Destroy(JNIEnv* env, jobject obj) { |
| 98 delete this; | 111 delete this; |
| 99 } | 112 } |
| 100 | 113 |
| 101 void LogoBridge::GetCurrentLogo(JNIEnv* env, | 114 void LogoBridge::GetCurrentLogo(JNIEnv* env, |
| 102 jobject obj, | 115 jobject obj, |
| 103 jobject j_logo_observer) { | 116 jobject j_logo_observer) { |
| 104 if (!logo_service_) | 117 if (!logo_service_) |
| 105 return; | 118 return; |
| 106 | 119 |
| 107 // |observer| is deleted in LogoObserverAndroid::OnObserverRemoved(). | 120 // |observer| is deleted in LogoObserverAndroid::OnObserverRemoved(). |
| 108 LogoObserverAndroid* observer = new LogoObserverAndroid( | 121 LogoObserverAndroid* observer = new LogoObserverAndroid( |
| 109 weak_ptr_factory_.GetWeakPtr(), env, j_logo_observer); | 122 weak_ptr_factory_.GetWeakPtr(), env, j_logo_observer); |
| 110 logo_service_->GetLogo(observer); | 123 logo_service_->GetLogo(observer); |
| 111 } | 124 } |
| 112 | 125 |
| 126 jboolean LogoBridge::GetAnimatedLogo(JNIEnv* env, | |
| 127 jobject obj, | |
|
newt (away)
2015/09/23 20:38:43
indentation
Ian Wen
2015/09/23 21:59:52
Done.
| |
| 128 jobject j_callback, | |
| 129 jstring j_url) { | |
| 130 DCHECK(j_callback); | |
| 131 if (!logo_service_) | |
| 132 return false; | |
| 133 | |
| 134 GURL url = GURL(ConvertJavaStringToUTF8(env, j_url)); | |
| 135 if (fetcher_ && fetcher_->GetOriginalURL() == url) { | |
|
newt (away)
2015/09/23 20:38:43
nit: don't use curly braces for single-line if sta
Ian Wen
2015/09/23 21:59:52
Done.
| |
| 136 return false; | |
| 137 } | |
| 138 | |
| 139 j_callback_.Reset(env, j_callback); | |
| 140 fetcher_ = net::URLFetcher::Create(url, net::URLFetcher::GET, this); | |
| 141 fetcher_->SetRequestContext(request_context_getter_.get()); | |
| 142 fetcher_->Start(); | |
| 143 return true; | |
| 144 } | |
| 145 | |
| 146 void LogoBridge::OnURLFetchComplete(const net::URLFetcher* source) { | |
| 147 if (!source->GetStatus().is_success() || (source->GetResponseCode() != 200) || | |
| 148 j_callback_.is_null()) { | |
| 149 ClearFetcher(); | |
| 150 return; | |
| 151 } | |
| 152 | |
| 153 std::string raw_response; | |
|
newt (away)
2015/09/23 20:38:43
Why "raw"? I'd probably just call this "response"
Ian Wen
2015/09/23 21:59:52
Done.
| |
| 154 source->GetResponseAsString(&raw_response); | |
| 155 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 156 | |
| 157 ScopedJavaLocalRef<jbyteArray> j_bytes = | |
| 158 ToJavaByteArray(env, reinterpret_cast<const uint8*>(raw_response.data()), | |
| 159 raw_response.length()); | |
| 160 Java_AnimatedLogoCallback_onGifDownloaded(env, j_callback_.Release(), | |
| 161 j_bytes.obj()); | |
| 162 ClearFetcher(); | |
| 163 } | |
| 164 | |
| 165 void LogoBridge::ClearFetcher() { | |
| 166 fetcher_.reset(); | |
| 167 j_callback_.Reset(); | |
| 168 } | |
| 169 | |
| 113 // static | 170 // static |
| 114 bool RegisterLogoBridge(JNIEnv* env) { | 171 bool RegisterLogoBridge(JNIEnv* env) { |
| 115 return RegisterNativesImpl(env); | 172 return RegisterNativesImpl(env); |
| 116 } | 173 } |
| OLD | NEW |