Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: chrome/browser/android/logo_bridge.cc

Issue 1343913002: Introduce Animated Logo to Chrome on Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/android/logo_bridge.h ('k') | chrome/browser/android/logo_service.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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();
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 void LogoBridge::GetAnimatedLogo(JNIEnv* env,
127 jobject obj,
128 jobject j_callback,
129 jstring j_url) {
130 DCHECK(j_callback);
131 if (!logo_service_)
132 return;
133
134 GURL url = GURL(ConvertJavaStringToUTF8(env, j_url));
135 if (fetcher_ && fetcher_->GetOriginalURL() == url)
136 return;
137
138 j_callback_.Reset(env, j_callback);
139 fetcher_ = net::URLFetcher::Create(url, net::URLFetcher::GET, this);
140 fetcher_->SetRequestContext(request_context_getter_.get());
141 fetcher_->Start();
142 }
143
144 void LogoBridge::OnURLFetchComplete(const net::URLFetcher* source) {
145 if (!source->GetStatus().is_success() || (source->GetResponseCode() != 200) ||
146 j_callback_.is_null()) {
147 ClearFetcher();
148 return;
149 }
150
151 std::string response;
152 source->GetResponseAsString(&response);
153 JNIEnv* env = base::android::AttachCurrentThread();
154
155 ScopedJavaLocalRef<jbyteArray> j_bytes = ToJavaByteArray(
156 env, reinterpret_cast<const uint8*>(response.data()), response.length());
157 ScopedJavaLocalRef<jobject> j_gif_image =
158 Java_LogoBridge_createGifImage(env, j_bytes.obj());
159 Java_AnimatedLogoCallback_onAnimatedLogoAvailable(env, j_callback_.obj(),
160 j_gif_image.obj());
161 ClearFetcher();
162 }
163
164 void LogoBridge::ClearFetcher() {
165 fetcher_.reset();
166 j_callback_.Reset();
167 }
168
113 // static 169 // static
114 bool RegisterLogoBridge(JNIEnv* env) { 170 bool RegisterLogoBridge(JNIEnv* env) {
115 return RegisterNativesImpl(env); 171 return RegisterNativesImpl(env);
116 } 172 }
OLDNEW
« no previous file with comments | « chrome/browser/android/logo_bridge.h ('k') | chrome/browser/android/logo_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698