// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_APP_INSTANCE_WAITER_H_
#define COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_APP_INSTANCE_WAITER_H_
#include <string>
#include "base/memory/raw_ref.h"
#include "base/run_loop.h"
#include "base/scoped_observation.h"
#include "components/services/app_service/public/cpp/instance_registry.h"
namespace apps {
// Waits for the given app to reach the given state in the given
// InstanceRegistry. Makes the simplifying assumption that there exists at most
// one instance of the app (guarded by CHECKs).
class AppInstanceWaiter : public apps::InstanceRegistry::Observer {
public:
AppInstanceWaiter(apps::InstanceRegistry& registry,
const std::string& app_id,
apps::InstanceState state);
~AppInstanceWaiter() override;
void Await();
void OnInstanceUpdate(const apps::InstanceUpdate& update) override;
void OnInstanceRegistryWillBeDestroyed(
apps::InstanceRegistry* cache) override;
private:
const raw_ref<apps::InstanceRegistry> registry_;
const std::string app_id_;
const apps::InstanceState state_;
base::RunLoop run_loop_;
base::ScopedObservation<apps::InstanceRegistry,
apps::InstanceRegistry::Observer>
observation_{this};
};
} // namespace apps
#endif // COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_APP_INSTANCE_WAITER_H_