// Copyright 2022 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_CROSAPI_WEB_APP_SERVICE_ASH_H_
#define CHROME_BROWSER_ASH_CROSAPI_WEB_APP_SERVICE_ASH_H_
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "chromeos/crosapi/mojom/web_app_service.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"
namespace crosapi {
// Created in ash-chrome. Allows lacros-chrome:
// 1) to query web-app-related information in ash-chrome,
// 2) to register its own |crosapi::mojom::WebAppProviderBridge| to let
// ash-chrome to modify or query WebAppProvider in lacros-chrome.
class WebAppServiceAsh : public crosapi::mojom::WebAppService {
public:
class Observer : public base::CheckedObserver {
public:
virtual void OnWebAppProviderBridgeConnected() {}
virtual void OnWebAppProviderBridgeDisconnected() {}
virtual void OnWebAppServiceAshDestroyed() = 0;
};
WebAppServiceAsh();
~WebAppServiceAsh() override;
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
void BindReceiver(mojo::PendingReceiver<mojom::WebAppService> receiver);
// crosapi::mojom::WebAppService:
void RegisterWebAppProviderBridge(
mojo::PendingRemote<mojom::WebAppProviderBridge> web_app_provider_bridge)
override;
void GetAssociatedAndroidPackage(
const std::string& app_id,
GetAssociatedAndroidPackageCallback callback) override;
void MigrateLauncherState(const std::string& from_app_id,
const std::string& to_app_id,
MigrateLauncherStateCallback callback) override;
// Returns the web app provider bridge of the currently connected
// lacros-chrome, or nullptr if there is no connection.
mojom::WebAppProviderBridge* GetWebAppProviderBridge();
private:
// Called when |web_app_provider_bridge_| is disconnected.
void OnBridgeDisconnected();
// Crosapi clients connected to this object.
mojo::ReceiverSet<mojom::WebAppService> receivers_;
// Remote lacros-chrome web app bridge to send commands to.
// At the moment only a single connection is supported.
// TODO(crbug.com/40167449): Support SxS lacros.
mojo::Remote<mojom::WebAppProviderBridge> web_app_provider_bridge_;
base::ObserverList<Observer> observers_;
base::WeakPtrFactory<WebAppServiceAsh> weak_factory_{this};
};
} // namespace crosapi
#endif // CHROME_BROWSER_ASH_CROSAPI_WEB_APP_SERVICE_ASH_H_