#ifndef CHROME_BROWSER_APPS_APP_SERVICE_APP_SERVICE_PROXY_ASH_H_
#define CHROME_BROWSER_APPS_APP_SERVICE_APP_SERVICE_PROXY_ASH_H_
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/containers/unique_ptr_adapters.h"
#include "base/functional/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/weak_ptr.h"
#include "base/one_shot_event.h"
#include "base/scoped_observation.h"
#include "chrome/browser/apps/app_service/app_icon/app_icon_reader.h"
#include "chrome/browser/apps/app_service/app_icon/app_icon_writer.h"
#include "chrome/browser/apps/app_service/app_service_proxy_base.h"
#include "chrome/browser/apps/app_service/launch_result_type.h"
#include "chrome/browser/apps/app_service/paused_apps.h"
#include "chrome/browser/apps/app_service/publisher_host.h"
#include "components/services/app_service/public/cpp/app_launch_util.h"
#include "components/services/app_service/public/cpp/app_registry_cache.h"
#include "components/services/app_service/public/cpp/app_types.h"
#include "components/services/app_service/public/cpp/icon_types.h"
#include "components/services/app_service/public/cpp/instance_registry.h"
#include "components/services/app_service/public/cpp/package_id.h"
#include "components/services/app_service/public/cpp/preferred_app.h"
#include "ui/gfx/native_ui_types.h"
class Profile;
namespace gfx {
class ImageSkia;
}
namespace apps {
class AppInstallService;
class AppPlatformMetrics;
class AppPlatformMetricsService;
class PackageId;
class PromiseAppRegistryCache;
class PromiseAppService;
class UninstallDialog;
struct PromiseApp;
using PromiseAppPtr = std::unique_ptr<PromiseApp>;
struct PauseData {
int hours = 0;
int minutes = 0;
bool should_show_pause_dialog = false;
};
class AppServiceProxyAsh : public AppServiceProxyBase,
public apps::AppRegistryCache::Observer,
public apps::InstanceRegistry::Observer {
public:
using OnPauseDialogClosedCallback = base::OnceCallback<void()>;
using OnUninstallForTestingCallback = base::OnceCallback<void(bool)>;
explicit AppServiceProxyAsh(Profile* profile,
PublisherHostFactory* publisher_host_factory);
AppServiceProxyAsh(const AppServiceProxyAsh&) = delete;
AppServiceProxyAsh& operator=(const AppServiceProxyAsh&) = delete;
~AppServiceProxyAsh() override;
apps::InstanceRegistry& InstanceRegistry();
apps::AppPlatformMetrics* AppPlatformMetrics();
apps::AppPlatformMetricsService* AppPlatformMetricsService();
void SetPublisherUnavailable(AppType app_type);
apps::AppInstallService& AppInstallService();
void OnApps(std::vector<AppPtr> deltas,
AppType app_type,
bool should_notify_initialized) override;
void Uninstall(const std::string& app_id,
UninstallSource uninstall_source,
gfx::NativeWindow parent_window);
void PauseApps(const std::map<std::string, PauseData>& pause_data);
void UnpauseApps(const std::set<std::string>& app_ids);
void BlockApps(const std::set<std::string>& app_ids,
bool show_block_dialog = false);
void UnblockApps(const std::set<std::string>& app_ids);
void SetResizeLocked(const std::string& app_id, bool locked);
void SetArcIsRegistered();
void LaunchAppWithIntent(const std::string& app_id,
int32_t event_flags,
IntentPtr intent,
LaunchSource launch_source,
WindowInfoPtr window_info,
LaunchCallback callback) override;
base::WeakPtr<AppServiceProxyAsh> GetWeakPtr();
void ReInitializeCrostiniForTesting();
void SetDialogCreatedCallbackForTesting(base::OnceClosure callback);
void UninstallForTesting(const std::string& app_id,
gfx::NativeWindow parent_window,
OnUninstallForTestingCallback callback);
void SetAppPlatformMetricsServiceForTesting(
std::unique_ptr<apps::AppPlatformMetricsService>
app_platform_metrics_service);
void RegisterPublishersForTesting();
void ReadIconsForTesting(AppType app_type,
const std::string& app_id,
int32_t size_in_dip,
const IconKey& icon_key,
IconType icon_type,
LoadIconCallback callback);
apps::PromiseAppRegistryCache* PromiseAppRegistryCache();
apps::PromiseAppService* PromiseAppService();
void OnPromiseApp(PromiseAppPtr delta);
void LoadPromiseIcon(const PackageId& package_id,
int32_t size_hint_in_dip,
IconEffects icon_effects,
apps::LoadIconCallback callback);
void LoadDefaultIcon(AppType app_type,
int32_t size_in_dip,
IconEffects icon_effects,
IconType icon_type,
LoadIconCallback callback);
void SetAppLocale(const std::string& app_id, const std::string& locale_tag);
void SetProtocolLinkPreference(std::string_view app_id,
std::string_view protocol_scheme);
private:
struct OnAppsRequest {
OnAppsRequest(std::vector<AppPtr> deltas,
AppType app_type,
bool should_notify_initialized);
OnAppsRequest(const OnAppsRequest&) = delete;
OnAppsRequest& operator=(const OnAppsRequest&) = delete;
~OnAppsRequest();
std::vector<AppPtr> deltas_;
AppType app_type_;
bool should_notify_initialized_;
};
friend class AppServiceProxyFactory;
friend class AppServiceProxyTest;
FRIEND_TEST_ALL_PREFIXES(AppServiceProxyTest, LaunchCallback);
using UninstallDialogs =
base::flat_map<std::string, std::unique_ptr<apps::UninstallDialog>>;
bool IsValidProfile() override;
void Initialize() override;
void Shutdown() override;
static void CreateBlockDialog(const std::string& app_name,
const gfx::ImageSkia& image,
Profile* profile);
static void CreateLocalBlockDialog(const std::string& app_name);
static void CreatePauseDialog(apps::AppType app_type,
const std::string& app_name,
const gfx::ImageSkia& image,
const PauseData& pause_data,
OnPauseDialogClosedCallback pause_callback);
void UninstallImpl(const std::string& app_id,
UninstallSource uninstall_source,
gfx::NativeWindow parent_window,
OnUninstallForTestingCallback callback);
void OnUninstallDialogClosed(apps::AppType app_type,
const std::string& app_id,
UninstallSource uninstall_source,
bool uninstall,
bool clear_site_data,
bool report_abuse,
UninstallDialog* uninstall_dialog);
bool MaybeShowLaunchPreventionDialog(const apps::AppUpdate& update) override;
void OnLaunched(LaunchCallback callback,
LaunchResult&& launch_result) override;
void LoadIconForDialog(const apps::AppUpdate& update,
apps::LoadIconCallback callback);
void OnLoadIconForBlockDialog(const std::string& app_name,
IconValuePtr icon_value);
void OnLoadIconForPauseDialog(apps::AppType app_type,
const std::string& app_id,
const std::string& app_name,
const PauseData& pause_data,
IconValuePtr icon_value);
void OnPauseDialogClosed(apps::AppType app_type, const std::string& app_id);
bool ShouldExcludeBrowserTabApps(bool exclude_browser_tab_apps,
WindowMode window_mode) override;
void OnAppUpdate(const apps::AppUpdate& update) override;
void OnAppRegistryCacheWillBeDestroyed(
apps::AppRegistryCache* cache) override;
void PerformPostLaunchTasks(apps::LaunchSource launch_source) override;
void RecordAppPlatformMetrics(Profile* profile,
const apps::AppUpdate& update,
apps::LaunchSource launch_source,
apps::LaunchContainer container) override;
void InitAppPlatformMetrics();
void PerformPostUninstallTasks(apps::AppType app_type,
const std::string& app_id,
UninstallSource uninstall_source) override;
void OnInstanceUpdate(const apps::InstanceUpdate& update) override;
void OnInstanceRegistryWillBeDestroyed(
apps::InstanceRegistry* cache) override;
bool CanRunLaunchCallback(
const std::vector<base::UnguessableToken>& instance_ids);
void LaunchAppWithIntentIfAllowed(const std::string& app_id,
int32_t event_flags,
IntentPtr intent,
LaunchSource launch_source,
WindowInfoPtr window_info,
LaunchCallback callback,
bool is_allowed);
bool ShouldReadIcons(AppType app_type) override;
void ReadIcons(AppType app_type,
const std::string& app_id,
int32_t size_in_dip,
std::unique_ptr<IconKey> icon_key,
IconType icon_type,
LoadIconCallback callback) override;
void OnIconRead(AppType app_type,
const std::string& app_id,
int32_t size_in_dip,
IconEffects icon_effects,
IconType icon_type,
LoadIconCallback callback,
IconValuePtr iv);
void OnIconInstalled(AppType app_type,
const std::string& app_id,
int32_t size_in_dip,
IconEffects icon_effects,
IconType icon_type,
int default_icon_resource_id,
LoadIconCallback callback,
bool install_success);
void PostIconFoldersDeletion(const std::vector<std::string>& ids);
IntentLaunchInfo CreateIntentLaunchInfo(
const apps::IntentPtr& intent,
const apps::IntentFilterPtr& filter,
const apps::AppUpdate& update) override;
std::unique_ptr<PublisherHost> publisher_host_;
AppIconReader icon_reader_;
AppIconWriter icon_writer_;
bool arc_is_registered_ = false;
apps::InstanceRegistry instance_registry_;
std::unique_ptr<apps::PromiseAppService> promise_app_service_;
PausedApps pending_pause_requests_;
UninstallDialogs uninstall_dialogs_;
std::map<std::string, std::vector<base::OnceCallback<void()>>>
pending_read_icon_requests_;
std::unique_ptr<apps::AppPlatformMetricsService>
app_platform_metrics_service_;
base::ScopedObservation<apps::InstanceRegistry,
apps::InstanceRegistry::Observer>
instance_registry_observer_{this};
base::ScopedObservation<apps::AppRegistryCache,
apps::AppRegistryCache::Observer>
app_registry_cache_observer_{this};
std::list<std::pair<base::RepeatingCallback<bool(void)>, base::OnceClosure>>
callback_list_;
std::unique_ptr<apps::AppInstallService> app_install_service_;
base::WeakPtrFactory<AppServiceProxyAsh> weak_ptr_factory_{this};
};
}
#endif