blob: 08447c75276ced2e6046cc02c6c97e35673dae6d [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_SERVICES_MULTIDEVICE_SETUP_FEATURE_STATE_MANAGER_H_
#define CHROMEOS_SERVICES_MULTIDEVICE_SETUP_FEATURE_STATE_MANAGER_H_
#include <ostream>
#include "base/containers/flat_map.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
namespace chromeos {
namespace multidevice_setup {
// Tracks the state of the multi-device features, providing a getter/observer
// interface as well as a way to toggle a feature on/off when appropriate.
class FeatureStateManager {
public:
using FeatureStatesMap = base::flat_map<mojom::Feature, mojom::FeatureState>;
class Observer {
public:
virtual ~Observer() = default;
// Invoked when one or more features have changed state.
virtual void OnFeatureStatesChange(
const FeatureStatesMap& feature_states_map) = 0;
};
virtual ~FeatureStateManager();
virtual FeatureStatesMap GetFeatureStates() = 0;
// Attempts to enable or disable the feature; returns whether this operation
// succeeded. A feature can only be changed via this function if the current
// state is mojom::FeatureState::kEnabledByUser,
// mojom::FeatureState::kFurtherSetupRequired or
// mojom::FeatureState::kDisabledByUser.
bool SetFeatureEnabledState(mojom::Feature feature, bool enabled);
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
protected:
FeatureStateManager();
// Enables or disables the feature; by the time this function has been called,
// it has already been confirmed that the state is indeed able to be changed.
virtual void PerformSetFeatureEnabledState(mojom::Feature feature,
bool enabled) = 0;
void NotifyFeatureStatesChange(const FeatureStatesMap& feature_states_map);
private:
base::ObserverList<Observer>::Unchecked observer_list_;
DISALLOW_COPY_AND_ASSIGN(FeatureStateManager);
};
std::ostream& operator<<(std::ostream& stream,
const FeatureStateManager::FeatureStatesMap& map);
} // namespace multidevice_setup
} // namespace chromeos
#endif // CHROMEOS_SERVICES_MULTIDEVICE_SETUP_FEATURE_STATE_MANAGER_H_