// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_ECHE_APP_ECHE_APP_MANAGER_FACTORY_H_
#define CHROME_BROWSER_ASH_ECHE_APP_ECHE_APP_MANAGER_FACTORY_H_
#include <optional>
#include "ash/webui/eche_app_ui/launch_app_helper.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/no_destructor.h"
#include "chrome/browser/profiles/profile_keyed_service_factory.h"
#include "ui/gfx/image/image.h"
class Profile;
namespace ash {
namespace eche_app {
class EcheAppManager;
class EcheAppNotificationController;
class SystemInfo;
class AppsLaunchInfoProvider;
class LaunchedAppInfo {
public:
class Builder {
public:
Builder();
~Builder();
std::unique_ptr<LaunchedAppInfo> Build() {
return base::WrapUnique(new LaunchedAppInfo(package_name_, visible_name_,
user_id_, icon_, phone_name_,
apps_launch_info_provider_));
}
Builder& SetPackageName(const std::string& package_name) {
package_name_ = package_name;
return *this;
}
Builder& SetVisibleName(const std::u16string& visible_name) {
visible_name_ = visible_name;
return *this;
}
Builder& SetUserId(const std::optional<int64_t>& user_id) {
user_id_ = user_id;
return *this;
}
Builder& SetIcon(const gfx::Image& icon) {
icon_ = icon;
return *this;
}
Builder& SetPhoneName(const std::u16string& phone_name) {
phone_name_ = phone_name;
return *this;
}
Builder& SetAppsLaunchInfoProvider(
AppsLaunchInfoProvider* apps_launch_info_provider) {
apps_launch_info_provider_ = apps_launch_info_provider;
return *this;
}
private:
std::string package_name_;
std::u16string visible_name_;
std::optional<int64_t> user_id_;
gfx::Image icon_;
std::u16string phone_name_;
raw_ptr<AppsLaunchInfoProvider> apps_launch_info_provider_;
};
LaunchedAppInfo() = delete;
LaunchedAppInfo(const LaunchedAppInfo&) = delete;
LaunchedAppInfo& operator=(const LaunchedAppInfo&) = delete;
~LaunchedAppInfo();
std::string package_name() const { return package_name_; }
std::u16string visible_name() const { return visible_name_; }
std::optional<int64_t> user_id() const { return user_id_; }
gfx::Image icon() const { return icon_; }
std::u16string phone_name() const { return phone_name_; }
AppsLaunchInfoProvider* apps_launch_info_provider() {
return apps_launch_info_provider_;
}
protected:
LaunchedAppInfo(const std::string& package_name,
const std::u16string& visible_name,
const std::optional<int64_t>& user_id,
const gfx::Image& icon,
const std::u16string& phone_name,
AppsLaunchInfoProvider* apps_launch_info_provider);
private:
std::string package_name_;
std::u16string visible_name_;
std::optional<int64_t> user_id_;
gfx::Image icon_;
std::u16string phone_name_;
raw_ptr<AppsLaunchInfoProvider, DanglingUntriaged> apps_launch_info_provider_;
};
// Factory to create a single EcheAppManager.
class EcheAppManagerFactory : public ProfileKeyedServiceFactory {
public:
static EcheAppManager* GetForProfile(Profile* profile);
static EcheAppManagerFactory* GetInstance();
static void ShowNotification(
base::WeakPtr<EcheAppManagerFactory> weak_ptr,
Profile* profile,
const std::optional<std::u16string>& title,
const std::optional<std::u16string>& message,
std::unique_ptr<LaunchAppHelper::NotificationInfo> info);
static void CloseNotification(base::WeakPtr<EcheAppManagerFactory> weak_ptr,
Profile* profile,
const std::string& notification_id);
static void LaunchEcheApp(Profile* profile,
const std::optional<int64_t>& notification_id,
const std::string& package_name,
const std::u16string& visible_name,
const std::optional<int64_t>& user_id,
const gfx::Image& icon,
const std::u16string& phone_name,
AppsLaunchInfoProvider* apps_launch_info_provider);
void SetLastLaunchedAppInfo(
std::unique_ptr<LaunchedAppInfo> last_launched_app_info);
std::unique_ptr<LaunchedAppInfo> GetLastLaunchedAppInfo();
void CloseConnectionOrLaunchErrorNotifications();
EcheAppManagerFactory(const EcheAppManagerFactory&) = delete;
EcheAppManagerFactory& operator=(const EcheAppManagerFactory&) = delete;
std::unique_ptr<SystemInfo> GetSystemInfo(Profile* profile) const;
private:
friend base::NoDestructor<EcheAppManagerFactory>;
friend class EcheAppManagerFactoryTest;
EcheAppManagerFactory();
~EcheAppManagerFactory() override;
// BrowserContextKeyedServiceFactory:
std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
content::BrowserContext* context) const override;
void RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) override;
std::unique_ptr<LaunchedAppInfo> last_launched_app_info_;
std::unique_ptr<EcheAppNotificationController> notification_controller_;
base::WeakPtrFactory<EcheAppManagerFactory> weak_ptr_factory_{this};
};
} // namespace eche_app
} // namespace ash
#endif // CHROME_BROWSER_ASH_ECHE_APP_ECHE_APP_MANAGER_FACTORY_H_