1 // Copyright (c) 2012 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/ui/android/navigation_popup.h" 6 7 #include "base/android/jni_string.h" 8 #include "base/android/scoped_java_ref.h" 9 #include "base/bind.h" 10 #include "chrome/browser/browser_process.h" 11 #include "chrome/browser/favicon/favicon_service.h" 12 #include "chrome/browser/favicon/favicon_service_factory.h" 13 #include "chrome/browser/history/history_types.h" 14 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile_manager.h" 16 #include "chrome/common/url_constants.h" 17 #include "grit/ui_resources.h" 18 #include "jni/NavigationPopup_jni.h" 19 #include "third_party/skia/include/core/SkBitmap.h" 20 #include "ui/base/resource/resource_bundle.h" 21 #include "ui/gfx/android/java_bitmap.h" 22 #include "ui/gfx/favicon_size.h" 23 #include "ui/gfx/image/image.h" 24 #include "url/gurl.h" 25 26 using base::android::ConvertUTF8ToJavaString; 27 using base::android::ScopedJavaLocalRef; 28 29 NavigationPopup::NavigationPopup(JNIEnv* env, jobject obj) 30 : weak_jobject_(env, obj) { 31 } 32 33 NavigationPopup::~NavigationPopup() { 34 } 35 36 void NavigationPopup::Destroy(JNIEnv* env, jobject obj) { 37 delete this; 38 } 39 40 void NavigationPopup::FetchFaviconForUrl(JNIEnv* env, 41 jobject obj, 42 jstring jurl) { 43 Profile* profile = g_browser_process->profile_manager()->GetLastUsedProfile(); 44 FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 45 profile, Profile::EXPLICIT_ACCESS); 46 if (!favicon_service) 47 return; 48 GURL url(base::android::ConvertJavaStringToUTF16(env, jurl)); 49 // TODO(tedchoc): Request higher favicons based on screen density instead of 50 // hardcoding kFaviconSize. 51 favicon_service->GetFaviconImageForPageURL( 52 FaviconService::FaviconForPageURLParams( 53 url, favicon_base::FAVICON, gfx::kFaviconSize), 54 base::Bind(&NavigationPopup::OnFaviconDataAvailable, 55 base::Unretained(this), 56 url), 57 &cancelable_task_tracker_); 58 } 59 60 void NavigationPopup::OnFaviconDataAvailable( 61 GURL navigation_entry_url, 62 const favicon_base::FaviconImageResult& image_result) { 63 gfx::Image image(image_result.image); 64 if (image.IsEmpty()) { 65 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 66 image = rb.GetImageNamed(IDR_DEFAULT_FAVICON); 67 } 68 69 JNIEnv* env = base::android::AttachCurrentThread(); 70 ScopedJavaLocalRef<jobject> obj(weak_jobject_.get(env)); 71 if (!obj.obj()) 72 return; 73 74 ScopedJavaLocalRef<jstring> jurl( 75 ConvertUTF8ToJavaString(env, navigation_entry_url.spec())); 76 77 Java_NavigationPopup_onFaviconUpdated( 78 env, 79 obj.obj(), 80 jurl.obj(), 81 gfx::ConvertToJavaBitmap(image.ToSkBitmap()).obj()); 82 } 83 84 static jstring GetHistoryUrl(JNIEnv* env, jclass clazz) { 85 return ConvertUTF8ToJavaString(env, chrome::kChromeUIHistoryURL).Release(); 86 } 87 88 static jlong Init(JNIEnv* env, jobject obj) { 89 NavigationPopup* popup = new NavigationPopup(env, obj); 90 return reinterpret_cast<intptr_t>(popup); 91 } 92 93 // static 94 bool NavigationPopup::RegisterNavigationPopup(JNIEnv* env) { 95 return RegisterNativesImpl(env); 96 } 97