chromium/components/webapps/browser/android/webapps_icon_utils.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_WEBAPPS_BROWSER_ANDROID_WEBAPPS_ICON_UTILS_H_
#define COMPONENTS_WEBAPPS_BROWSER_ANDROID_WEBAPPS_ICON_UTILS_H_

#include "base/android/scoped_java_ref.h"
#include "base/task/sequenced_task_runner.h"
#include "components/webapk/webapk.pb.h"

class SkBitmap;
class GURL;

namespace webapps {

// Contains utilities that query Java code for information about web
// app/shortcut icons.
class WebappsIconUtils {
 public:
  WebappsIconUtils() = delete;
  WebappsIconUtils& operator=(const WebappsIconUtils&) = delete;
  WebappsIconUtils(const WebappsIconUtils&) = delete;

  // Returns the ideal size for an icon representing a web app or a WebAPK.
  static int GetIdealHomescreenIconSizeInPx();

  // Returns the minimum size for an icon representing a web app or a WebAPK.
  static int GetMinimumHomescreenIconSizeInPx();

  // Returns the ideal size for an image displayed on a web app's splash
  // screen.
  static int GetIdealSplashImageSizeInPx();

  // Returns the minimum size for an image displayed on a web app's splash
  // screen.
  static int GetMinimumSplashImageSizeInPx();

  // Returns the ideal size for an adaptive launcher icon of a WebAPK
  static int GetIdealAdaptiveLauncherIconSizeInPx();

  // Returns the ideal size for a shortcut icon of a WebAPK.
  static int GetIdealShortcutIconSizeInPx();

  // Returns the ideal size for a WebAPK icon of specific type
  static int GetIdealIconSizeForIconType(webapk::Image::Usage usage,
                                         webapk::Image::Purpose purpose);

  // Returns if the Android version supports Adaptive Icon (i.e. API level >=
  // 26)
  static bool DoesAndroidSupportMaskableIcons();

  // Finalize the launcher icon from |icon|. |start_url| is used to generate the
  // icon if |icon| is empty or is not large enough. When complete, posts
  // |callback| on |ui_thread_task_runner| binding:
  // - the generated icon
  // - whether |icon| was used in generating the launcher icon
  static void FinalizeLauncherIconInBackground(
      const SkBitmap& bitmap,
      const GURL& url,
      scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner,
      base::OnceCallback<void(const SkBitmap&, bool)> callback);

  // Generates a home screen icon for the web page at `page_url`. The icon is
  // a single letter on a grey background.
  static SkBitmap GenerateHomeScreenIconInBackground(const GURL& page_url);

  // Generate an adaptive icon for given maskable icon bitmap.
  static SkBitmap GenerateAdaptiveIconBitmap(const SkBitmap& icon);

  static int GetIdealIconCornerRadiusPxForPromptUI();

  static void SetIdealShortcutSizeForTesting(int size);
  static void SetIconSizesForTesting(std::vector<int> sizes);
};

}  // namespace webapps

#endif  // COMPONENTS_WEBAPPS_BROWSER_ANDROID_WEBAPPS_ICON_UTILS_H_