avs-device-sdk/applications/acsdkDefaultDeviceSettingsM.../include/acsdkDeviceSettingsManager/DeviceSettingsManagerBuilder.h

227 lines
9.6 KiB
C++

/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0/
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
#ifndef ACSDKDEVICESETTINGSMANAGER_DEVICESETTINGSMANAGERBUILDER_H_
#define ACSDKDEVICESETTINGSMANAGER_DEVICESETTINGSMANAGERBUILDER_H_
#include <cstdint>
#include <functional>
#include <memory>
#include <tuple>
#include <AVSCommon/SDKInterfaces/AVSConnectionManagerInterface.h>
#include <AVSCommon/SDKInterfaces/LocaleAssetsManagerInterface.h>
#include <AVSCommon/SDKInterfaces/MessageSenderInterface.h>
#include <AVSCommon/SDKInterfaces/SystemTimeZoneInterface.h>
#include <acsdkDoNotDisturb/DoNotDisturbCapabilityAgent.h>
#include <RegistrationManager/CustomerDataManager.h>
#include <Settings/CloudControlledSettingProtocol.h>
#include <Settings/DeviceControlledSettingProtocol.h>
#include <Settings/DeviceSettingsManager.h>
#include <Settings/Setting.h>
#include <Settings/SettingEventMetadata.h>
#include <Settings/SettingEventSender.h>
#include <Settings/SettingsManagerBuilderBase.h>
#include <Settings/SharedAVSSettingProtocol.h>
#include <Settings/Storage/DeviceSettingStorageInterface.h>
namespace alexaClientSDK {
namespace acsdkDeviceSettingsManager {
/**
* The builder for @c DeviceSettingsManager.
*/
class DeviceSettingsManagerBuilder : public settings::SettingsManagerBuilderBase<settings::DeviceSettingsManager> {
public:
/**
* Factory method that creates a DeviceSettingsManager.
*
* @param settingStorage The storage used for settings.
* @param messageSender Sender used to send events related to this setting changes.
* @param connectionManager The ACL connection manager.
* @param dataManager A dataManager object that will track the CustomerDataHandler.
* @param localeAssetsManager The object that manages locale assets.
* @param doNotDisturbCapabilityAgent The DoNotDisturb CA. This parameter is needed because currently the
* DoNotDisturbSetting is managed differently than other settings in the SDK (ACSDK-2279). This is a legacy
* anti-pattern, and other CAs should be injected with the DeviceSettingsManager (as opposed to the
* DeviceSettingsManager being injected with the DND CA, as seen here).
* @param systemTimezone Optional parameter responsible for validating / applying timezone changes system wide.
*/
static std::shared_ptr<settings::DeviceSettingsManager> createDeviceSettingsManager(
std::shared_ptr<settings::storage::DeviceSettingStorageInterface> settingStorage,
std::shared_ptr<avsCommon::sdkInterfaces::MessageSenderInterface> messageSender,
std::shared_ptr<avsCommon::sdkInterfaces::AVSConnectionManagerInterface> connectionManager,
std::shared_ptr<registrationManager::CustomerDataManager> dataManager,
std::shared_ptr<avsCommon::sdkInterfaces::LocaleAssetsManagerInterface> localeAssetsManager,
std::shared_ptr<capabilityAgents::doNotDisturb::DoNotDisturbCapabilityAgent> doNotDisturbCapabilityAgent,
std::shared_ptr<avsCommon::sdkInterfaces::SystemTimeZoneInterface> systemTimezone = nullptr);
/**
* Constructor.
*
* @param settingStorage The storage used for settings.
* @param messageSender Sender used to send events related to this setting changes.
* @param connectionManager The ACL connection manager.
* @param dataManager A dataManager object that will track the CustomerDataHandler.
*/
DeviceSettingsManagerBuilder(
std::shared_ptr<settings::storage::DeviceSettingStorageInterface> settingStorage,
std::shared_ptr<avsCommon::sdkInterfaces::MessageSenderInterface> messageSender,
std::shared_ptr<avsCommon::sdkInterfaces::AVSConnectionManagerInterface> connectionManager,
std::shared_ptr<registrationManager::CustomerDataManager> dataManager);
/**
* Configures do not disturb setting.
*
* @param dndCA The do not disturb capability agent which is actually responsible for building the setting.
*
* @return This builder to allow nested calls.
*/
DeviceSettingsManagerBuilder& withDoNotDisturbSetting(
const std::shared_ptr<capabilityAgents::doNotDisturb::DoNotDisturbCapabilityAgent>& dndCA);
/**
* Configures alarm volume ramp setting.
*
* @return This builder to allow nested calls.
*/
DeviceSettingsManagerBuilder& withAlarmVolumeRampSetting();
/**
* Configures wake word confirmation setting.
*
* @return This builder to allow nested calls.
*/
DeviceSettingsManagerBuilder& withWakeWordConfirmationSetting();
/**
* Configures speech confirmation setting.
*
* @return This builder to allow nested calls.
*/
DeviceSettingsManagerBuilder& withSpeechConfirmationSetting();
/**
* Configures time zone setting.
*
* @param systemTimeZone The system timezone is an optional parameter responsible for validating / applying
* timezone changes system wide.
* @return This builder to allow nested calls.
*/
DeviceSettingsManagerBuilder& withTimeZoneSetting(
std::shared_ptr<avsCommon::sdkInterfaces::SystemTimeZoneInterface> systemTimeZone = nullptr);
/**
* Configures locale setting.
*
* @param localeAssetsManager The locale assets manager is responsible for validating / applying locale changes.
* @return This builder to allow nested calls.
*/
DeviceSettingsManagerBuilder& withLocaleSetting(
std::shared_ptr<avsCommon::sdkInterfaces::LocaleAssetsManagerInterface> localeAssetsManager);
/**
* Configures locale and wake words setting.
*
* @param localeAssetsManager The locale assets manager is responsible for validating / applying locale
* related changes.
* @return This builder to allow nested calls.
*/
DeviceSettingsManagerBuilder& withLocaleAndWakeWordsSettings(
std::shared_ptr<avsCommon::sdkInterfaces::LocaleAssetsManagerInterface> localeAssetsManager);
/**
* Configures network info setting.
*
* @return This builder to allow nested calls.
*/
DeviceSettingsManagerBuilder& withNetworkInfoSetting();
/**
* Gets the setting for the given @c index.
*
* @tparam index The setting index.
* @return A pointer for the setting kept in @c index if the setting has been built; @c nullptr otherwise.
* @note This function should be used after @c build() has been called.
*/
template <size_t index>
std::shared_ptr<SettingType<index>> getSetting() const;
/**
* Gets the setting configuration for the given @c index.
*
* @tparam index The setting index.
* @return The setting configuration. An empty setting will be returned if the setting wasn't configured.
* @note This function should be used after @c build() has been called.
*/
template <size_t index>
settings::SettingConfiguration<SettingType<index>> getConfiguration() const;
/**
* Builds a @c DeviceSettingsManager with the settings previously configured.
*
* @return A pointer to a new DeviceSettingsManager if all settings were successfully built; @c nullptr otherwise.
*/
std::unique_ptr<settings::DeviceSettingsManager> build() override;
private:
/**
* Builds a setting that follows the given synchronization protocol.
*
* @tparam index The setting index.
* @tparam ProtocolT The type of the setting protocol.
* @param metadata The setting event metadata.
* @param defaultValue The setting default value.
* @param applyFn Function responsible for validating and applying a new setting value.
* @return This builder to allow nested calls.
*/
template <size_t index, class ProtocolT>
DeviceSettingsManagerBuilder& withSynchronizedSetting(
const settings::SettingEventMetadata& metadata,
const ValueType<index>& defaultValue,
std::function<bool(const ValueType<index>&)> applyFn = std::function<bool(const ValueType<index>&)>());
/// The setting storage used to build persistent settings.
std::shared_ptr<settings::storage::DeviceSettingStorageInterface> m_settingStorage;
/// The message sender used to build settings that are synchronized with AVS.
std::shared_ptr<avsCommon::sdkInterfaces::MessageSenderInterface> m_messageSender;
/// The connection manager that manages the connection with AVS.
std::shared_ptr<avsCommon::sdkInterfaces::AVSConnectionManagerInterface> m_connectionManager;
/// The dataManager object that will track the CustomerDataHandler.
std::shared_ptr<registrationManager::CustomerDataManager> m_dataManager;
/// Flag that indicates if there was any configuration error.
bool m_foundError;
};
template <size_t index>
settings::SettingConfiguration<DeviceSettingsManagerBuilder::SettingType<index>> DeviceSettingsManagerBuilder::
getConfiguration() const {
return std::get<index>(m_settingConfigs);
}
template <size_t index>
std::shared_ptr<DeviceSettingsManagerBuilder::SettingType<index>> DeviceSettingsManagerBuilder::getSetting() const {
return std::get<index>(m_settingConfigs).setting;
}
} // namespace acsdkDeviceSettingsManager
} // namespace alexaClientSDK
#endif // ACSDKDEVICESETTINGSMANAGER_DEVICESETTINGSMANAGERBUILDER_H_