Home | History | Annotate | Download | only in android
      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