// 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.

#ifndef CHROME_BROWSER_ANDROID_FAVICON_HELPER_H_
#define CHROME_BROWSER_ANDROID_FAVICON_HELPER_H_

#include <jni.h>

#include <memory>

#include "base/android/scoped_java_ref.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/task/cancelable_task_tracker.h"
#include "components/favicon_base/favicon_types.h"
#include "url/gurl.h"

namespace content {
class  WebContents;
}

class Profile;

class FaviconHelper {
 public:
  FaviconHelper();
  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
  jboolean GetLocalFaviconImageForURL(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& obj,
      const base::android::JavaParamRef<jobject>& j_profile,
      const base::android::JavaParamRef<jstring>& j_page_url,
      jint j_desired_size_in_pixel,
      const base::android::JavaParamRef<jobject>& j_favicon_image_callback);
  base::android::ScopedJavaLocalRef<jobject> GetSyncedFaviconImageForURL(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& obj,
      const base::android::JavaParamRef<jobject>& jprofile,
      const base::android::JavaParamRef<jstring>& j_page_url);

  void EnsureIconIsAvailable(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& obj,
      const base::android::JavaParamRef<jobject>& j_profile,
      const base::android::JavaParamRef<jobject>& j_web_contents,
      const base::android::JavaParamRef<jstring>& j_page_url,
      const base::android::JavaParamRef<jstring>& j_icon_url,
      jboolean j_is_large_icon,
      const base::android::JavaParamRef<jobject>& j_availability_callback);
  void TouchOnDemandFavicon(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& obj,
      const base::android::JavaParamRef<jobject>& j_profile,
      const base::android::JavaParamRef<jstring>& j_icon_url);

 private:
  FRIEND_TEST_ALL_PREFIXES(FaviconHelperTest, GetLargestSizeIndex);

  static void OnFaviconImageResultAvailable(
      const base::android::ScopedJavaGlobalRef<jobject>&
          j_availability_callback,
      Profile* profile,
      content::WebContents* web_contents,
      const GURL& page_url,
      const GURL& icon_url,
      favicon_base::IconType icon_type,
      const favicon_base::FaviconImageResult& result);

  static void OnFaviconDownloaded(
      const base::android::ScopedJavaGlobalRef<jobject>&
          j_availability_callback,
      Profile* profile,
      const GURL& page_url,
      favicon_base::IconType icon_type,
      int download_request_id,
      int http_status_code,
      const GURL& image_url,
      const std::vector<SkBitmap>& bitmaps,
      const std::vector<gfx::Size>& original_sizes);

  static size_t GetLargestSizeIndex(const std::vector<gfx::Size>& sizes);

  std::unique_ptr<base::CancelableTaskTracker> cancelable_task_tracker_;

  virtual ~FaviconHelper();

  DISALLOW_COPY_AND_ASSIGN(FaviconHelper);
};

#endif  // CHROME_BROWSER_ANDROID_FAVICON_HELPER_H_
