#ifndef CHROME_BROWSER_APPS_APP_SERVICE_UNINSTALL_DIALOG_H_
#define CHROME_BROWSER_APPS_APP_SERVICE_UNINSTALL_DIALOG_H_
#include <memory>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "components/services/app_service/public/cpp/app_types.h"
#include "components/services/app_service/public/cpp/icon_types.h"
#include "ui/gfx/native_ui_types.h"
#include "ui/views/widget/widget.h"
class Profile;
namespace gfx {
class ImageSkia;
}
namespace apps {
class IconLoader;
class UninstallDialog;
}
namespace ui {
class NativeWindowTracker;
}
namespace apps {
using OnUninstallForTestingCallback = base::OnceCallback<void(bool)>;
using OnDialogCreatedCallback = base::OnceCallback<void(views::Widget*)>;
class UninstallDialog {
public:
class UiBase {
public:
explicit UiBase(UninstallDialog* uninstall_dialog)
: uninstall_dialog_(uninstall_dialog) {}
UiBase(const UiBase&) = delete;
UiBase& operator=(const UiBase&) = delete;
virtual ~UiBase() = default;
static views::Widget* Create(Profile* profile,
apps::AppType app_type,
const std::string& app_id,
const std::string& app_name,
gfx::ImageSkia image,
gfx::NativeWindow parent_window,
UninstallDialog* uninstall_dialog);
UninstallDialog* uninstall_dialog() const { return uninstall_dialog_; }
private:
raw_ptr<UninstallDialog, AcrossTasksDanglingUntriaged> uninstall_dialog_;
};
using UninstallCallback =
base::OnceCallback<void(bool uninstall,
bool clear_site_data,
bool report_rebuse,
UninstallDialog* uninstall_dialog)>;
UninstallDialog(Profile* profile,
apps::AppType app_type,
const std::string& app_id,
const std::string& app_name,
gfx::NativeWindow parent_window,
UninstallCallback uninstall_callback);
UninstallDialog(const UninstallDialog&) = delete;
UninstallDialog& operator=(const UninstallDialog&) = delete;
~UninstallDialog();
void PrepareToShow(IconKey icon_key,
apps::IconLoader* icon_loader,
int32_t icon_size);
void CloseDialog();
views::Widget* GetWidget();
void OnDialogClosed(bool uninstall, bool clear_site_data, bool report_abuse);
void SetDialogCreatedCallbackForTesting(
OnUninstallForTestingCallback callback);
private:
void OnLoadIcon(IconValuePtr icon_value);
const raw_ptr<Profile> profile_;
const apps::AppType app_type_;
const std::string app_id_;
const std::string app_name_;
gfx::NativeWindow parent_window_;
UninstallCallback uninstall_callback_;
OnUninstallForTestingCallback uninstall_dialog_created_callback_;
raw_ptr<views::Widget, AcrossTasksDanglingUntriaged> widget_ = nullptr;
std::unique_ptr<ui::NativeWindowTracker> parent_window_tracker_;
base::WeakPtrFactory<UninstallDialog> weak_ptr_factory_{this};
};
}
#endif