// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.favicon;
import android.graphics.Bitmap;
import android.graphics.Color;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.content_public.browser.WebContents;
/**
* This is a helper class to use favicon_service.cc's functionality.
*
* You can request a favicon image by web page URL. Note that an instance of
* this class should be created & used & destroyed (by destroy()) in the same
* thread due to the C++ base::CancelableTaskTracker class
* requirement.
*/
public class FaviconHelper {
// Please keep in sync with favicon_types.h's IconType.
public static final int INVALID_ICON = 0;
public static final int FAVICON = 1 << 0;
public static final int TOUCH_ICON = 1 << 1;
public static final int TOUCH_PRECOMPOSED_ICON = 1 << 2;
private long mNativeFaviconHelper;
/**
* Callback interface for getting the result from getLocalFaviconImageForURL method.
*/
public interface FaviconImageCallback {
/**
* This method will be called when the result favicon is ready.
* @param image Favicon image.
* @param iconUrl Favicon image's icon url.
*/
@CalledByNative("FaviconImageCallback")
public void onFaviconAvailable(Bitmap image, String iconUrl);
}
/**
* Callback interface for the result of the ensureIconIsAvailable method.
*/
public interface IconAvailabilityCallback {
/**
* This method will be called when the availability of the icon has been checked.
* @param newlyAvailable true if the icon was downloaded and is now available,
* false if the favicon was already there or the download failed.
*/
@CalledByNative("IconAvailabilityCallback")
public void onIconAvailabilityChecked(boolean newlyAvailable);
}
/**
* Allocate and initialize the C++ side of this class.
*/
public FaviconHelper() {
mNativeFaviconHelper = nativeInit();
}
/**
* Clean up the C++ side of this class. After the call, this class instance shouldn't be used.
*/
public void destroy() {
assert mNativeFaviconHelper != 0;
nativeDestroy(mNativeFaviconHelper);
mNativeFaviconHelper = 0;
}
/**
* Get Favicon bitmap for the requested arguments. Retrieves favicons only for pages the user
* has visited on the current device.
* @param profile Profile used for the FaviconService construction.
* @param pageUrl The target Page URL to get the favicon.
* @param desiredSizeInPixel The size of the favicon in pixel we want to get.
* @param faviconImageCallback A method to be called back when the result is available.
* Note that this callback is not called if this method returns
* false.
* @return True if GetLocalFaviconImageForURL is successfully called.
*/
public boolean getLocalFaviconImageForURL(
Profile profile, String pageUrl, int desiredSizeInPixel,
FaviconImageCallback faviconImageCallback) {
assert mNativeFaviconHelper != 0;
return nativeGetLocalFaviconImageForURL(mNativeFaviconHelper, profile, pageUrl,
FAVICON | TOUCH_ICON | TOUCH_PRECOMPOSED_ICON, desiredSizeInPixel,
faviconImageCallback);
}
/**
* Return the dominant color of a given bitmap in {@link Color} format.
* @param image The bitmap image to find the dominant color for.
* @return The dominant color in {@link Color} format.
*/
public static int getDominantColorForBitmap(Bitmap image) {
return nativeGetDominantColorForBitmap(image);
}
/**
* Get 16x16 Favicon bitmap for the requested arguments. Only retrives favicons in synced
* session storage. (e.g. favicons synced from other devices).
* TODO(apiccion): provide a way to obtain higher resolution favicons.
* @param profile Profile used for the FaviconService construction.
* @param pageUrl The target Page URL to get the favicon.
*
* @return 16x16 favicon Bitmap corresponding to the pageUrl.
*/
public Bitmap getSyncedFaviconImageForURL(Profile profile, String pageUrl) {
assert mNativeFaviconHelper != 0;
return nativeGetSyncedFaviconImageForURL(mNativeFaviconHelper, profile, pageUrl);
}
/**
* Tries to make sure that the specified icon is available in the cache of the provided profile.
* @param profile Profile used for the FaviconService construction.
* @param webContents The object used to download the icon.
* @param pageUrl The target Page URL to get the favicon for.
* @param iconUrl The URL of the icon to retrieve.
* @param isLargeIcon Specifies whether the type is TOUCH_ICON (true) or FAVICON (false).
* @param isTemporary Specifies whether the icon at iconUrl is temporary and should be updated
* as soon as the page at pageUrl is revisited.
* @param callback Called when completed (download not needed, finished or failed).
*/
public void ensureIconIsAvailable(Profile profile, WebContents webContents, String pageUrl,
String iconUrl, boolean isLargeIcon, boolean isTemporary,
IconAvailabilityCallback callback) {
nativeEnsureIconIsAvailable(mNativeFaviconHelper, profile, webContents, pageUrl, iconUrl,
isLargeIcon, isTemporary, callback);
}
private static native long nativeInit();
private static native void nativeDestroy(long nativeFaviconHelper);
private static native boolean nativeGetLocalFaviconImageForURL(long nativeFaviconHelper,
Profile profile, String pageUrl, int iconTypes, int desiredSizeInDip,
FaviconImageCallback faviconImageCallback);
private static native Bitmap nativeGetSyncedFaviconImageForURL(long nativeFaviconHelper,
Profile profile, String pageUrl);
private static native int nativeGetDominantColorForBitmap(Bitmap image);
private static native void nativeEnsureIconIsAvailable(long nativeFaviconHelper,
Profile profile, WebContents webContents, String pageUrl, String iconUrl,
boolean isLargeIcon, boolean isTemporary, IconAvailabilityCallback callback);
}