favicon_helper.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/android/favicon_helper.h" 6 7#include <jni.h> 8 9#include "base/android/jni_android.h" 10#include "base/android/jni_string.h" 11#include "base/android/scoped_java_ref.h" 12#include "base/bind.h" 13#include "chrome/browser/favicon/favicon_service.h" 14#include "chrome/browser/favicon/favicon_service_factory.h" 15#include "chrome/browser/profiles/profile.h" 16#include "chrome/browser/profiles/profile_android.h" 17#include "jni/FaviconHelper_jni.h" 18#include "third_party/skia/include/core/SkBitmap.h" 19#include "ui/gfx/android/java_bitmap.h" 20 21using base::android::ScopedJavaGlobalRef; 22using base::android::ScopedJavaLocalRef; 23using base::android::AttachCurrentThread; 24using base::android::ConvertJavaStringToUTF16; 25using base::android::ConvertUTF8ToJavaString; 26using base::android::MethodID; 27 28namespace { 29 30void FaviconImageCallback( 31 ScopedJavaGlobalRef<jobject>* java_favicon_image_callback, 32 const chrome::FaviconImageResult& favicon_image_result) { 33 JNIEnv* env = AttachCurrentThread(); 34 35 // Convert favicon_image_result to java objects. 36 ScopedJavaLocalRef<jstring> java_icon_url = ConvertUTF8ToJavaString( 37 env, favicon_image_result.icon_url.spec()); 38 SkBitmap favicon_bitmap = favicon_image_result.image.AsBitmap(); 39 ScopedJavaLocalRef<jobject> java_favicon_bitmap = gfx::ConvertToJavaBitmap( 40 &favicon_bitmap); 41 42 // Call java side FaviconImageCallback method. 43 Java_FaviconImageCallback_onFaviconAvailable( 44 env, java_favicon_image_callback->obj(), java_favicon_bitmap.obj(), 45 java_icon_url.obj()); 46} 47 48} // namespace 49 50static jint Init(JNIEnv* env, jclass clazz) { 51 return reinterpret_cast<jint>(new FaviconHelper()); 52} 53 54FaviconHelper::FaviconHelper() { 55 cancelable_task_tracker_.reset(new CancelableTaskTracker()); 56} 57 58void FaviconHelper::Destroy(JNIEnv* env, jobject obj) { 59 delete this; 60} 61 62jboolean FaviconHelper::GetFaviconImageForURL( 63 JNIEnv* env, jobject obj, jobject jprofile, jstring page_url, 64 jint icon_types, jint desired_size_in_dip, 65 jobject java_favicon_image_callback) { 66 Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile); 67 DCHECK(profile); 68 if (!profile) 69 return false; 70 71 FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 72 profile, Profile::EXPLICIT_ACCESS); 73 DCHECK(favicon_service); 74 if (!favicon_service) 75 return false; 76 77 FaviconService::FaviconForURLParams params( 78 profile, GURL(ConvertJavaStringToUTF16(env, page_url)), 79 static_cast<int>(icon_types), static_cast<int>(desired_size_in_dip)); 80 81 ScopedJavaGlobalRef<jobject>* j_scoped_favicon_callback = 82 new ScopedJavaGlobalRef<jobject>(); 83 j_scoped_favicon_callback->Reset(env, java_favicon_image_callback); 84 85 FaviconService::FaviconImageCallback callback_runner = base::Bind( 86 &FaviconImageCallback, base::Owned(j_scoped_favicon_callback)); 87 88 favicon_service->GetFaviconImageForURL( 89 params, callback_runner, 90 cancelable_task_tracker_.get()); 91 92 return true; 93} 94 95FaviconHelper::~FaviconHelper() { 96} 97 98// static 99bool FaviconHelper::RegisterFaviconHelper(JNIEnv* env) { 100 return RegisterNativesImpl(env); 101} 102