| // Copyright 2014 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; |
| |
| import android.graphics.Bitmap; |
| |
| import org.chromium.base.CalledByNative; |
| import org.chromium.chrome.browser.profiles.Profile; |
| |
| /** |
| * Provides access to the search provider's logo via the C++ LogoService. |
| */ |
| public class LogoBridge { |
| |
| /** |
| * A logo for a search provider (e.g. the Yahoo! logo or Google doodle). |
| */ |
| public static class Logo { |
| /** |
| * The logo image. Non-null. |
| */ |
| public final Bitmap image; |
| |
| /** |
| * The URL to navigate to when the user clicks on the logo. May be null. |
| */ |
| public final String onClickUrl; |
| |
| /** |
| * The accessibility text describing the logo. May be null. |
| */ |
| public final String altText; |
| |
| public Logo(Bitmap image, String onClickUrl, String altText) { |
| this.image = image; |
| this.onClickUrl = onClickUrl; |
| this.altText = altText; |
| } |
| } |
| |
| /** |
| * Observer for receiving the logo when it's available. |
| */ |
| public interface LogoObserver { |
| /** |
| * Called when the cached or fresh logo is available. This may be called up to two times, |
| * once with the cached logo and once with a freshly downloaded logo. |
| * |
| * @param logo The search provider's logo. |
| * @param fromCache Whether the logo was loaded from the cache. |
| */ |
| @CalledByNative("LogoObserver") |
| public void onLogoAvailable(Logo logo, boolean fromCache); |
| } |
| |
| private long mNativeLogoBridge; |
| |
| /** |
| * Creates a LogoBridge for getting the logo of the default search provider. |
| * |
| * @param profile Profile of the tab that will show the logo. |
| */ |
| public LogoBridge(Profile profile) { |
| mNativeLogoBridge = nativeInit(profile); |
| } |
| |
| /** |
| * Cleans up the C++ side of this class. After calling this, LogoObservers passed to |
| * getCurrentLogo() will no longer receive updates. |
| */ |
| public void destroy() { |
| assert mNativeLogoBridge != 0; |
| nativeDestroy(mNativeLogoBridge); |
| mNativeLogoBridge = 0; |
| } |
| |
| /** |
| * Gets the current logo for the default search provider. |
| * |
| * @param logoObserver The observer to receive the cached and/or fresh logos when they're |
| * available. logoObserver.onLogoAvailable() may be called synchronously if |
| * the cached logo is already available. |
| */ |
| public void getCurrentLogo(LogoObserver logoObserver) { |
| nativeGetCurrentLogo(mNativeLogoBridge, logoObserver); |
| } |
| |
| @Override |
| protected void finalize() { |
| // Ensure that destroy() was called. |
| assert mNativeLogoBridge == 0; |
| } |
| |
| @CalledByNative |
| private static Logo createLogo(Bitmap image, String onClickUrl, String altText) { |
| return new Logo(image, onClickUrl, altText); |
| } |
| |
| private native long nativeInit(Profile profile); |
| private native void nativeGetCurrentLogo(long nativeLogoBridge, LogoObserver logoObserver); |
| private native void nativeDestroy(long nativeLogoBridge); |
| } |