blob: a083bf3997483674206992ba8a273e20dc13fe17 [file] [log] [blame]
// Copyright 2017 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.
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/macros.h"
#include "extensions/browser/extension_icon_image.h"
#include "ui/gfx/image/image_skia.h"
namespace content {
class BrowserContext;
namespace extensions {
class Extension;
class ChromeAppIconDelegate;
// This represents how an extension app icon should finally look. As a base,
// extension icon is used and effects that depend on extension type, state and
// some external conditions are applied. Resulting image is sent via
// ChromeAppIconDelegate. Several updates are expected in case extension
// state or some external conditions are changed.
class ChromeAppIcon : public IconImage::Observer {
using DestroyedCallback = base::OnceCallback<void(ChromeAppIcon*)>;
using ResizeFunction =
base::RepeatingCallback<void(const gfx::Size&, gfx::ImageSkia*)>;
// Applies image processing effects to |image_skia|, such as resizing, adding
// badges, converting to gray and rounding corners.
static void ApplyEffects(int resource_size_in_dip,
const ResizeFunction& resize_function,
bool apply_chrome_badge,
bool app_launchable,
bool from_bookmark,
gfx::ImageSkia* image_skia);
// |resize_function| overrides icon resizing behavior if non-null. Otherwise
// IconLoader with perform the resizing. In both cases |resource_size_in_dip|
// is used to pick the correct icon representation from resources.
ChromeAppIcon(ChromeAppIconDelegate* delegate,
content::BrowserContext* browser_context,
DestroyedCallback destroyed_callback,
const std::string& app_id,
int resource_size_in_dip,
const ResizeFunction& resize_function);
~ChromeAppIcon() override;
// Reloads icon.
void Reload();
// Returns true if the icon still refers to existing extension. Once extension
// is disabled it is discarded from the icon.
bool IsValid() const;
// Re-applies app effects over the current extension icon and dispatches the
// result via |delegate_|.
void UpdateIcon();
const gfx::ImageSkia& image_skia() const { return image_skia_; }
const std::string& app_id() const { return app_id_; }
#if defined(OS_CHROMEOS)
// Returns whether the icon is badged because it's an extension app that has
// its Android analog installed.
bool icon_is_badged() const { return icon_is_badged_; }
const Extension* GetExtension();
// IconImage::Observer:
void OnExtensionIconImageChanged(IconImage* image) override;
// Unowned pointers.
ChromeAppIconDelegate* const delegate_;
content::BrowserContext* const browser_context_;
// Called when this instance of ChromeAppIcon is destroyed.
DestroyedCallback destroyed_callback_;
const std::string app_id_;
// Contains current icon image. This is static image with applied effects and
// it is updated each time when |icon_| is updated.
gfx::ImageSkia image_skia_;
#if defined(OS_CHROMEOS)
// Whether the icon got badged because it's an extension app that has its
// Android analog installed.
bool icon_is_badged_ = false;
const int resource_size_in_dip_;
// Function to be used to resize the image loaded from a resource. If null,
// resize will be performed by ImageLoader.
const ResizeFunction resize_function_;
std::unique_ptr<IconImage> icon_;
} // namespace extensions