/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License 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.
 */

package com.android.server.hdmi;

import static android.hardware.hdmi.HdmiControlManager.SettingName;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringDef;
import android.content.Context;
import android.content.SharedPreferences;
import android.hardware.hdmi.HdmiControlManager;
import android.os.Environment;
import android.os.SystemProperties;
import android.provider.Settings.Global;
import android.util.ArrayMap;
import android.util.Slog;

import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ConcurrentUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.Executor;

/**
 * The {@link HdmiCecConfig} class is used for getting information about
 * available HDMI control settings, including CEC settings and eARC settings.
 *
 * TODO(b/240379115): rename this class and related methods in this package to represent that the
 * settings storage mechanism applies to all HDMI control settings and not just CEC settings.
 */
public class HdmiCecConfig {
    private static final String TAG = "HdmiCecConfig";

    private static final String ETC_DIR = "etc";
    private static final String CONFIG_FILE = "cec_config.xml";
    private static final String SHARED_PREFS_DIR = "shared_prefs";
    private static final String SHARED_PREFS_NAME = "cec_config.xml";

    private static final int STORAGE_SYSPROPS = 0;
    private static final int STORAGE_GLOBAL_SETTINGS = 1;
    private static final int STORAGE_SHARED_PREFS = 2;

    @IntDef({
        STORAGE_SYSPROPS,
        STORAGE_GLOBAL_SETTINGS,
        STORAGE_SHARED_PREFS,
    })
    private @interface Storage {}

    private static final String VALUE_TYPE_STRING = "string";
    private static final String VALUE_TYPE_INT = "int";

    @StringDef({
        VALUE_TYPE_STRING,
        VALUE_TYPE_INT,
    })
    private @interface ValueType {}

    @NonNull private final Context mContext;
    @NonNull private final StorageAdapter mStorageAdapter;

    private final Object mLock = new Object();

    @GuardedBy("mLock")
    private final ArrayMap<Setting, ArrayMap<SettingChangeListener, Executor>>
            mSettingChangeListeners = new ArrayMap<>();

    private LinkedHashMap<String, Setting> mSettings = new LinkedHashMap<>();

    /**
     * Exception thrown when the CEC Configuration setup verification fails.
     * This usually means a settings lacks default value or storage/storage key.
     */
    public static class VerificationException extends RuntimeException {
        public VerificationException(String message) {
            super(message);
        }
    }

    /**
     * Listener used to get notifications when value of a setting changes.
     */
    public interface SettingChangeListener {
        /**
         * Called when value of a setting changes.
         *
         * @param setting name of a CEC setting that changed
         */
        void onChange(@NonNull @SettingName String setting);
    }

    /**
     * Setting storage input/output helper class.
     */
    public static class StorageAdapter {
        @NonNull private final Context mContext;
        @NonNull private final SharedPreferences mSharedPrefs;

        StorageAdapter(@NonNull Context context) {
            mContext = context;
            // The package info in the context isn't initialized in the way it is for normal apps,
            // so the standard, name-based context.getSharedPreferences doesn't work. Instead, we
            // build the path manually below using the same policy that appears in ContextImpl.
            final Context deviceContext = mContext.createDeviceProtectedStorageContext();
            final File prefsFile = new File(new File(Environment.getDataSystemDirectory(),
                                                     SHARED_PREFS_DIR), SHARED_PREFS_NAME);
            mSharedPrefs = deviceContext.getSharedPreferences(prefsFile, Context.MODE_PRIVATE);
        }

        /**
         * Read the value from a system property.
         * Returns the given default value if the system property is not set.
         */
        public String retrieveSystemProperty(@NonNull String storageKey,
                                             @NonNull String defaultValue) {
            return SystemProperties.get(storageKey, defaultValue);
        }

        /**
         * Write the value to a system property.
         */
        public void storeSystemProperty(@NonNull String storageKey,
                                        @NonNull String value) {
            SystemProperties.set(storageKey, value);
        }

        /**
         * Read the value from a global setting.
         * Returns the given default value if the system property is not set.
         */
        public String retrieveGlobalSetting(@NonNull String storageKey,
                                            @NonNull String defaultValue) {
            String value = Global.getString(mContext.getContentResolver(), storageKey);
            return value != null ? value : defaultValue;
        }

        /**
         * Write the value to a global setting.
         */
        public void storeGlobalSetting(@NonNull String storageKey,
                                       @NonNull String value) {
            Global.putString(mContext.getContentResolver(), storageKey, value);
        }

        /**
         * Read the value from a shared preference.
         * Returns the given default value if the preference is not set.
         */
        public String retrieveSharedPref(@NonNull String storageKey,
                                         @NonNull String defaultValue) {
            return mSharedPrefs.getString(storageKey, defaultValue);
        }

        /**
         * Write the value to a shared preference.
         */
        public void storeSharedPref(@NonNull String storageKey,
                                    @NonNull String value) {
            mSharedPrefs.edit().putString(storageKey, value).apply();
        }
    }

    private class Value {
        private final String mStringValue;
        private final Integer mIntValue;

        Value(@NonNull String value) {
            mStringValue = value;
            mIntValue = null;
        }

        Value(@NonNull Integer value) {
            mStringValue = null;
            mIntValue = value;
        }

        String getStringValue() {
            return mStringValue;
        }

        Integer getIntValue() {
            return mIntValue;
        }
    }

    protected class Setting {
        @NonNull private final Context mContext;
        @NonNull private final @SettingName String mName;
        private final boolean mUserConfigurable;

        private Value mDefaultValue = null;
        private List<Value> mAllowedValues = new ArrayList<>();

        Setting(@NonNull Context context,
                @NonNull @SettingName String name,
                int userConfResId) {
            mContext = context;
            mName = name;
            mUserConfigurable = mContext.getResources().getBoolean(userConfResId);
        }

        public @SettingName String getName() {
            return mName;
        }

        public @ValueType String getValueType() {
            return getDefaultValue().getStringValue() != null
                    ? VALUE_TYPE_STRING
                    : VALUE_TYPE_INT;
        }

        public Value getDefaultValue() {
            if (mDefaultValue == null) {
                throw new VerificationException("Invalid CEC setup for '"
                    + this.getName() + "' setting. "
                    + "Setting has no default value.");
            }
            return mDefaultValue;
        }

        public boolean getUserConfigurable() {
            return mUserConfigurable;
        }

        private void registerValue(@NonNull Value value,
                                   int allowedResId, int defaultResId) {
            if (mContext.getResources().getBoolean(allowedResId)) {
                mAllowedValues.add(value);
                if (mContext.getResources().getBoolean(defaultResId)) {
                    if (mDefaultValue != null) {
                        Slog.e(TAG,
                                "Failed to set '" + value + "' as a default for '" + this.getName()
                                        + "': Setting already has a default ('" + mDefaultValue
                                        + "').");
                        return;
                    }
                    mDefaultValue = value;
                }
            }
        }

        public void registerValue(@NonNull String value, int allowedResId,
                                  int defaultResId) {
            registerValue(new Value(value), allowedResId, defaultResId);
        }

        public void registerValue(int value, int allowedResId,
                                  int defaultResId) {
            registerValue(new Value(value), allowedResId, defaultResId);
        }


        public List<Value> getAllowedValues() {
            return mAllowedValues;
        }
    }

    @VisibleForTesting
    HdmiCecConfig(@NonNull Context context,
                  @NonNull StorageAdapter storageAdapter) {
        mContext = context;
        mStorageAdapter = storageAdapter;

        // IMPORTANT: when adding a config value for a particular setting, register that value AFTER
        // the existing values for that setting. That way, defaults set in the RRO are forward
        // compatible even if the RRO doesn't include that new value yet
        // (e.g. because it's ported from a previous release).

        Setting hdmiCecEnabled = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
                R.bool.config_cecHdmiCecEnabled_userConfigurable);
        hdmiCecEnabled.registerValue(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED,
                R.bool.config_cecHdmiCecControlEnabled_allowed,
                R.bool.config_cecHdmiCecControlEnabled_default);
        hdmiCecEnabled.registerValue(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED,
                R.bool.config_cecHdmiCecControlDisabled_allowed,
                R.bool.config_cecHdmiCecControlDisabled_default);

        Setting hdmiCecVersion = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
                R.bool.config_cecHdmiCecVersion_userConfigurable);
        hdmiCecVersion.registerValue(HdmiControlManager.HDMI_CEC_VERSION_1_4_B,
                R.bool.config_cecHdmiCecVersion14b_allowed,
                R.bool.config_cecHdmiCecVersion14b_default);
        hdmiCecVersion.registerValue(HdmiControlManager.HDMI_CEC_VERSION_2_0,
                R.bool.config_cecHdmiCecVersion20_allowed,
                R.bool.config_cecHdmiCecVersion20_default);

        Setting routingControlControl = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_ROUTING_CONTROL,
                R.bool.config_cecRoutingControl_userConfigurable);
        routingControlControl.registerValue(HdmiControlManager.ROUTING_CONTROL_ENABLED,
                R.bool.config_cecRoutingControlEnabled_allowed,
                R.bool.config_cecRoutingControlEnabled_default);
        routingControlControl.registerValue(HdmiControlManager.ROUTING_CONTROL_DISABLED,
                R.bool.config_cecRoutingControlDisabled_allowed,
                R.bool.config_cecRoutingControlDisabled_default);

        Setting soundbarMode = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE,
                R.bool.config_cecSoundbarMode_userConfigurable);
        soundbarMode.registerValue(HdmiControlManager.SOUNDBAR_MODE_ENABLED,
                R.bool.config_cecSoundbarModeEnabled_allowed,
                R.bool.config_cecSoundbarModeEnabled_default);
        soundbarMode.registerValue(HdmiControlManager.SOUNDBAR_MODE_DISABLED,
                R.bool.config_cecSoundbarModeDisabled_allowed,
                R.bool.config_cecSoundbarModeDisabled_default);

        Setting powerControlMode = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
                R.bool.config_cecPowerControlMode_userConfigurable);
        powerControlMode.registerValue(HdmiControlManager.POWER_CONTROL_MODE_TV,
                R.bool.config_cecPowerControlModeTv_allowed,
                R.bool.config_cecPowerControlModeTv_default);
        powerControlMode.registerValue(HdmiControlManager.POWER_CONTROL_MODE_BROADCAST,
                R.bool.config_cecPowerControlModeBroadcast_allowed,
                R.bool.config_cecPowerControlModeBroadcast_default);
        powerControlMode.registerValue(HdmiControlManager.POWER_CONTROL_MODE_NONE,
                R.bool.config_cecPowerControlModeNone_allowed,
                R.bool.config_cecPowerControlModeNone_default);
        powerControlMode.registerValue(HdmiControlManager.POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM,
                R.bool.config_cecPowerControlModeTvAndAudioSystem_allowed,
                R.bool.config_cecPowerControlModeTvAndAudioSystem_default);

        Setting powerStateChangeOnActiveSourceLost = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
                R.bool.config_cecPowerStateChangeOnActiveSourceLost_userConfigurable);
        powerStateChangeOnActiveSourceLost.registerValue(
                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE,
                R.bool.config_cecPowerStateChangeOnActiveSourceLostNone_allowed,
                R.bool.config_cecPowerStateChangeOnActiveSourceLostNone_default);
        powerStateChangeOnActiveSourceLost.registerValue(
                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW,
                R.bool.config_cecPowerStateChangeOnActiveSourceLostStandbyNow_allowed,
                R.bool.config_cecPowerStateChangeOnActiveSourceLostStandbyNow_default);

        Setting systemAudioControl = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL,
                R.bool.config_cecSystemAudioControl_userConfigurable);
        systemAudioControl.registerValue(HdmiControlManager.SYSTEM_AUDIO_CONTROL_ENABLED,
                R.bool.config_cecSystemAudioControlEnabled_allowed,
                R.bool.config_cecSystemAudioControlEnabled_default);
        systemAudioControl.registerValue(HdmiControlManager.SYSTEM_AUDIO_CONTROL_DISABLED,
                R.bool.config_cecSystemAudioControlDisabled_allowed,
                R.bool.config_cecSystemAudioControlDisabled_default);

        Setting systemAudioModeMuting = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                R.bool.config_cecSystemAudioModeMuting_userConfigurable);
        systemAudioModeMuting.registerValue(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED,
                R.bool.config_cecSystemAudioModeMutingEnabled_allowed,
                R.bool.config_cecSystemAudioModeMutingEnabled_default);
        systemAudioModeMuting.registerValue(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED,
                R.bool.config_cecSystemAudioModeMutingDisabled_allowed,
                R.bool.config_cecSystemAudioModeMutingDisabled_default);

        Setting volumeControlMode = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
                R.bool.config_cecVolumeControlMode_userConfigurable);
        volumeControlMode.registerValue(HdmiControlManager.VOLUME_CONTROL_ENABLED,
                R.bool.config_cecVolumeControlModeEnabled_allowed,
                R.bool.config_cecVolumeControlModeEnabled_default);
        volumeControlMode.registerValue(HdmiControlManager.VOLUME_CONTROL_DISABLED,
                R.bool.config_cecVolumeControlModeDisabled_allowed,
                R.bool.config_cecVolumeControlModeDisabled_default);

        Setting tvWakeOnOneTouchPlay = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY,
                R.bool.config_cecTvWakeOnOneTouchPlay_userConfigurable);
        tvWakeOnOneTouchPlay.registerValue(HdmiControlManager.TV_WAKE_ON_ONE_TOUCH_PLAY_ENABLED,
                R.bool.config_cecTvWakeOnOneTouchPlayEnabled_allowed,
                R.bool.config_cecTvWakeOnOneTouchPlayEnabled_default);
        tvWakeOnOneTouchPlay.registerValue(HdmiControlManager.TV_WAKE_ON_ONE_TOUCH_PLAY_DISABLED,
                R.bool.config_cecTvWakeOnOneTouchPlayDisabled_allowed,
                R.bool.config_cecTvWakeOnOneTouchPlayDisabled_default);

        Setting tvSendStandbyOnSleep = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP,
                R.bool.config_cecTvSendStandbyOnSleep_userConfigurable);
        tvSendStandbyOnSleep.registerValue(HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_ENABLED,
                R.bool.config_cecTvSendStandbyOnSleepEnabled_allowed,
                R.bool.config_cecTvSendStandbyOnSleepEnabled_default);
        tvSendStandbyOnSleep.registerValue(HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_DISABLED,
                R.bool.config_cecTvSendStandbyOnSleepDisabled_allowed,
                R.bool.config_cecTvSendStandbyOnSleepDisabled_default);

        Setting setMenuLanguage = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_SET_MENU_LANGUAGE,
                R.bool.config_cecSetMenuLanguage_userConfigurable);
        setMenuLanguage.registerValue(HdmiControlManager.SET_MENU_LANGUAGE_ENABLED,
                R.bool.config_cecSetMenuLanguageEnabled_allowed,
                R.bool.config_cecSetMenuLanguageEnabled_default);
        setMenuLanguage.registerValue(HdmiControlManager.SET_MENU_LANGUAGE_DISABLED,
                R.bool.config_cecSetMenuLanguageDisabled_allowed,
                R.bool.config_cecSetMenuLanguageDisabled_default);

        Setting rcProfileTv = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV,
                R.bool.config_cecRcProfileTv_userConfigurable);
        rcProfileTv.registerValue(HdmiControlManager.RC_PROFILE_TV_NONE,
                R.bool.config_cecRcProfileTvNone_allowed,
                R.bool.config_cecRcProfileTvNone_default);
        rcProfileTv.registerValue(HdmiControlManager.RC_PROFILE_TV_ONE,
                R.bool.config_cecRcProfileTvOne_allowed,
                R.bool.config_cecRcProfileTvOne_default);
        rcProfileTv.registerValue(HdmiControlManager.RC_PROFILE_TV_TWO,
                R.bool.config_cecRcProfileTvTwo_allowed,
                R.bool.config_cecRcProfileTvTwo_default);
        rcProfileTv.registerValue(HdmiControlManager.RC_PROFILE_TV_THREE,
                R.bool.config_cecRcProfileTvThree_allowed,
                R.bool.config_cecRcProfileTvThree_default);
        rcProfileTv.registerValue(HdmiControlManager.RC_PROFILE_TV_FOUR,
                R.bool.config_cecRcProfileTvFour_allowed,
                R.bool.config_cecRcProfileTvFour_default);

        Setting rcProfileSourceRootMenu = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU,
                R.bool.config_cecRcProfileSourceRootMenu_userConfigurable);
        rcProfileSourceRootMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED,
                R.bool.config_cecRcProfileSourceRootMenuHandled_allowed,
                R.bool.config_cecRcProfileSourceRootMenuHandled_default);
        rcProfileSourceRootMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED,
                R.bool.config_cecRcProfileSourceRootMenuNotHandled_allowed,
                R.bool.config_cecRcProfileSourceRootMenuNotHandled_default);

        Setting rcProfileSourceSetupMenu = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU,
                R.bool.config_cecRcProfileSourceSetupMenu_userConfigurable);
        rcProfileSourceSetupMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED,
                R.bool.config_cecRcProfileSourceSetupMenuHandled_allowed,
                R.bool.config_cecRcProfileSourceSetupMenuHandled_default);
        rcProfileSourceSetupMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED,
                R.bool.config_cecRcProfileSourceSetupMenuNotHandled_allowed,
                R.bool.config_cecRcProfileSourceSetupMenuNotHandled_default);

        Setting rcProfileSourceContentsMenu = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU,
                R.bool.config_cecRcProfileSourceContentsMenu_userConfigurable);
        rcProfileSourceContentsMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED,
                R.bool.config_cecRcProfileSourceContentsMenuHandled_allowed,
                R.bool.config_cecRcProfileSourceContentsMenuHandled_default);
        rcProfileSourceContentsMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED,
                R.bool.config_cecRcProfileSourceContentsMenuNotHandled_allowed,
                R.bool.config_cecRcProfileSourceContentsMenuNotHandled_default);

        Setting rcProfileSourceTopMenu = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU,
                R.bool.config_cecRcProfileSourceTopMenu_userConfigurable);
        rcProfileSourceTopMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED,
                R.bool.config_cecRcProfileSourceTopMenuHandled_allowed,
                R.bool.config_cecRcProfileSourceTopMenuHandled_default);
        rcProfileSourceTopMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED,
                R.bool.config_cecRcProfileSourceTopMenuNotHandled_allowed,
                R.bool.config_cecRcProfileSourceTopMenuNotHandled_default);

        Setting rcProfileSourceMediaContextSensitiveMenu = registerSetting(
                HdmiControlManager
                    .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU,
                R.bool.config_cecRcProfileSourceMediaContextSensitiveMenu_userConfigurable);
        rcProfileSourceMediaContextSensitiveMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED,
                R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_allowed,
                R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_default);
        rcProfileSourceMediaContextSensitiveMenu.registerValue(
                HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED,
                R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed,
                R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default);

        Setting querySadLpcm = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM,
                R.bool.config_cecQuerySadLpcm_userConfigurable);
        querySadLpcm.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadLpcmEnabled_allowed,
                R.bool.config_cecQuerySadLpcmEnabled_default);
        querySadLpcm.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadLpcmDisabled_allowed,
                R.bool.config_cecQuerySadLpcmDisabled_default);

        Setting querySadDd = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD,
                R.bool.config_cecQuerySadDd_userConfigurable);
        querySadDd.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadDdEnabled_allowed,
                R.bool.config_cecQuerySadDdEnabled_default);
        querySadDd.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadDdDisabled_allowed,
                R.bool.config_cecQuerySadDdDisabled_default);

        Setting querySadMpeg1 = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1,
                R.bool.config_cecQuerySadMpeg1_userConfigurable);
        querySadMpeg1.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadMpeg1Enabled_allowed,
                R.bool.config_cecQuerySadMpeg1Enabled_default);
        querySadMpeg1.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadMpeg1Disabled_allowed,
                R.bool.config_cecQuerySadMpeg1Disabled_default);

        Setting querySadMp3 = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3,
                R.bool.config_cecQuerySadMp3_userConfigurable);
        querySadMp3.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadMp3Enabled_allowed,
                R.bool.config_cecQuerySadMp3Enabled_default);
        querySadMp3.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadMp3Disabled_allowed,
                R.bool.config_cecQuerySadMp3Disabled_default);

        Setting querySadMpeg2 = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2,
                R.bool.config_cecQuerySadMpeg2_userConfigurable);
        querySadMpeg2.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadMpeg2Enabled_allowed,
                R.bool.config_cecQuerySadMpeg2Enabled_default);
        querySadMpeg2.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadMpeg2Disabled_allowed,
                R.bool.config_cecQuerySadMpeg2Disabled_default);

        Setting querySadAac = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC,
                R.bool.config_cecQuerySadAac_userConfigurable);
        querySadAac.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadAacEnabled_allowed,
                R.bool.config_cecQuerySadAacEnabled_default);
        querySadAac.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadAacDisabled_allowed,
                R.bool.config_cecQuerySadAacDisabled_default);

        Setting querySadDts = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS,
                R.bool.config_cecQuerySadDts_userConfigurable);
        querySadDts.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadDtsEnabled_allowed,
                R.bool.config_cecQuerySadDtsEnabled_default);
        querySadDts.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadDtsDisabled_allowed,
                R.bool.config_cecQuerySadDtsDisabled_default);

        Setting querySadAtrac = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC,
                R.bool.config_cecQuerySadAtrac_userConfigurable);
        querySadAtrac.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadAtracEnabled_allowed,
                R.bool.config_cecQuerySadAtracEnabled_default);
        querySadAtrac.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadAtracDisabled_allowed,
                R.bool.config_cecQuerySadAtracDisabled_default);

        Setting querySadOnebitaudio = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO,
                R.bool.config_cecQuerySadOnebitaudio_userConfigurable);
        querySadOnebitaudio.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadOnebitaudioEnabled_allowed,
                R.bool.config_cecQuerySadOnebitaudioEnabled_default);
        querySadOnebitaudio.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadOnebitaudioDisabled_allowed,
                R.bool.config_cecQuerySadOnebitaudioDisabled_default);

        Setting querySadDdp = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP,
                R.bool.config_cecQuerySadDdp_userConfigurable);
        querySadDdp.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadDdpEnabled_allowed,
                R.bool.config_cecQuerySadDdpEnabled_default);
        querySadDdp.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadDdpDisabled_allowed,
                R.bool.config_cecQuerySadDdpDisabled_default);

        Setting querySadDtshd = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD,
                R.bool.config_cecQuerySadDtshd_userConfigurable);
        querySadDtshd.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadDtshdEnabled_allowed,
                R.bool.config_cecQuerySadDtshdEnabled_default);
        querySadDtshd.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadDtshdDisabled_allowed,
                R.bool.config_cecQuerySadDtshdDisabled_default);

        Setting querySadTruehd = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD,
                R.bool.config_cecQuerySadTruehd_userConfigurable);
        querySadTruehd.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadTruehdEnabled_allowed,
                R.bool.config_cecQuerySadTruehdEnabled_default);
        querySadTruehd.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadTruehdDisabled_allowed,
                R.bool.config_cecQuerySadTruehdDisabled_default);

        Setting querySadDst = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST,
                R.bool.config_cecQuerySadDst_userConfigurable);
        querySadDst.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadDstEnabled_allowed,
                R.bool.config_cecQuerySadDstEnabled_default);
        querySadDst.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadDstDisabled_allowed,
                R.bool.config_cecQuerySadDstDisabled_default);

        Setting querySadWmapro = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO,
                R.bool.config_cecQuerySadWmapro_userConfigurable);
        querySadWmapro.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadWmaproEnabled_allowed,
                R.bool.config_cecQuerySadWmaproEnabled_default);
        querySadWmapro.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadWmaproDisabled_allowed,
                R.bool.config_cecQuerySadWmaproDisabled_default);

        Setting querySadMax = registerSetting(
                HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX,
                R.bool.config_cecQuerySadMax_userConfigurable);
        querySadMax.registerValue(
                HdmiControlManager.QUERY_SAD_ENABLED,
                R.bool.config_cecQuerySadMaxEnabled_allowed,
                R.bool.config_cecQuerySadMaxEnabled_default);
        querySadMax.registerValue(
                HdmiControlManager.QUERY_SAD_DISABLED,
                R.bool.config_cecQuerySadMaxDisabled_allowed,
                R.bool.config_cecQuerySadMaxDisabled_default);

        Setting earcEnabled = registerSetting(
                HdmiControlManager.SETTING_NAME_EARC_ENABLED,
                R.bool.config_earcEnabled_userConfigurable);
        earcEnabled.registerValue(HdmiControlManager.EARC_FEATURE_ENABLED,
                R.bool.config_earcFeatureEnabled_allowed,
                R.bool.config_earcFeatureEnabled_default);
        earcEnabled.registerValue(HdmiControlManager.EARC_FEATURE_DISABLED,
                R.bool.config_earcFeatureDisabled_allowed,
                R.bool.config_earcFeatureDisabled_default);

        verifySettings();
    }

    HdmiCecConfig(@NonNull Context context) {
        this(context, new StorageAdapter(context));
    }

    private Setting registerSetting(@NonNull @SettingName String name,
                               int userConfResId) {
        Setting setting = new Setting(mContext, name, userConfResId);
        mSettings.put(name, setting);
        return setting;
    }

    private void verifySettings() {
        for (Setting setting: mSettings.values()) {
            // This will throw an exception when a setting
            // doesn't have a default value assigned.
            setting.getDefaultValue();
            getStorage(setting);
            getStorageKey(setting);
        }
    }

    @Nullable
    private Setting getSetting(@NonNull String name) {
        return mSettings.containsKey(name) ? mSettings.get(name) : null;
    }

    @Storage
    private int getStorage(@NonNull Setting setting) {
        switch (setting.getName()) {
            case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_ROUTING_CONTROL:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_SET_MENU_LANGUAGE:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager
                    .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.SETTING_NAME_EARC_ENABLED:
                return STORAGE_SHARED_PREFS;
            default:
                throw new VerificationException("Invalid CEC setting '" + setting.getName()
                        + "' storage.");
        }
    }

    private String getStorageKey(@NonNull Setting setting) {
        switch (setting.getName()) {
            case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_ROUTING_CONTROL:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_SET_MENU_LANGUAGE:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU:
                return setting.getName();
            case HdmiControlManager
                    .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX:
                return setting.getName();
            case HdmiControlManager.SETTING_NAME_EARC_ENABLED:
                return setting.getName();
            default:
                throw new VerificationException("Invalid CEC setting '" + setting.getName()
                    + "' storage key.");
        }
    }

    protected String retrieveValue(@NonNull Setting setting, @NonNull String defaultValue) {
        @Storage int storage = getStorage(setting);
        String storageKey = getStorageKey(setting);
        if (storage == STORAGE_SYSPROPS) {
            HdmiLogger.debug("Reading '" + storageKey + "' sysprop.");
            return mStorageAdapter.retrieveSystemProperty(storageKey, defaultValue);
        } else if (storage == STORAGE_GLOBAL_SETTINGS) {
            HdmiLogger.debug("Reading '" + storageKey + "' global setting.");
            return mStorageAdapter.retrieveGlobalSetting(storageKey, defaultValue);
        } else if (storage == STORAGE_SHARED_PREFS) {
            HdmiLogger.debug("Reading '" + storageKey + "' shared preference.");
            return mStorageAdapter.retrieveSharedPref(storageKey, defaultValue);
        }
        return null;
    }

    protected void storeValue(@NonNull Setting setting, @NonNull String value) {
        @Storage int storage = getStorage(setting);
        String storageKey = getStorageKey(setting);
        if (storage == STORAGE_SYSPROPS) {
            HdmiLogger.debug("Setting '" + storageKey + "' sysprop.");
            mStorageAdapter.storeSystemProperty(storageKey, value);
        } else if (storage == STORAGE_GLOBAL_SETTINGS) {
            HdmiLogger.debug("Setting '" + storageKey + "' global setting.");
            mStorageAdapter.storeGlobalSetting(storageKey, value);
        } else if (storage == STORAGE_SHARED_PREFS) {
            HdmiLogger.debug("Setting '" + storageKey + "' shared pref.");
            mStorageAdapter.storeSharedPref(storageKey, value);
            notifySettingChanged(setting);
        }
    }

    protected void notifySettingChanged(@NonNull Setting setting) {
        synchronized (mLock) {
            ArrayMap<SettingChangeListener, Executor> listeners =
                    mSettingChangeListeners.get(setting);
            if (listeners == null) {
                return;  // No listeners registered, do nothing.
            }
            for (Entry<SettingChangeListener, Executor> entry: listeners.entrySet()) {
                SettingChangeListener listener = entry.getKey();
                Executor executor = entry.getValue();
                executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        listener.onChange(setting.getName());
                    }
                });
            }
        }
    }

    /**
     * Register change listener for a given setting name using DirectExecutor.
     */
    public void registerChangeListener(@NonNull @SettingName String name,
                                       SettingChangeListener listener) {
        registerChangeListener(name, listener, ConcurrentUtils.DIRECT_EXECUTOR);
    }

    /**
     * Register change listener for a given setting name and executor.
     */
    public void registerChangeListener(@NonNull @SettingName String name,
                                       SettingChangeListener listener,
                                       Executor executor) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        @Storage int storage = getStorage(setting);
        if (storage != STORAGE_GLOBAL_SETTINGS && storage != STORAGE_SHARED_PREFS) {
            throw new IllegalArgumentException("Change listeners for setting '" + name
                    + "' not supported.");
        }
        synchronized (mLock) {
            if (!mSettingChangeListeners.containsKey(setting)) {
                mSettingChangeListeners.put(setting, new ArrayMap<>());
            }
            mSettingChangeListeners.get(setting).put(listener, executor);
        }
    }

    /**
     * Remove change listener for a given setting name.
     */
    public void removeChangeListener(@NonNull @SettingName String name,
                                     SettingChangeListener listener) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        synchronized (mLock) {
            if (mSettingChangeListeners.containsKey(setting)) {
                ArrayMap<SettingChangeListener, Executor> listeners =
                        mSettingChangeListeners.get(setting);
                listeners.remove(listener);
                if (listeners.isEmpty()) {
                    mSettingChangeListeners.remove(setting);
                }
            }
        }
    }

    /**
     * Returns a list of all settings based on the XML metadata.
     */
    public @SettingName List<String> getAllSettings() {
        return new ArrayList<>(mSettings.keySet());
    }

    /**
     * Returns a list of user-modifiable settings based on the XML metadata.
     */
    public @SettingName List<String> getUserSettings() {
        List<String> settings = new ArrayList<>();
        for (Setting setting: mSettings.values()) {
            if (setting.getUserConfigurable()) {
                settings.add(setting.getName());
            }
        }
        return settings;
    }

    /**
     * For a given setting name returns true if and only if the value type of that
     * setting is a string.
     */
    public boolean isStringValueType(@NonNull @SettingName String name) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        return getSetting(name).getValueType().equals(VALUE_TYPE_STRING);
    }

    /**
     * For a given setting name returns true if and only if the value type of that
     * setting is an int.
     */
    public boolean isIntValueType(@NonNull @SettingName String name) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        return getSetting(name).getValueType().equals(VALUE_TYPE_INT);
    }

    /**
     * For a given setting name returns values that are allowed for that setting (string).
     */
    public List<String> getAllowedStringValues(@NonNull @SettingName String name) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        if (!setting.getValueType().equals(VALUE_TYPE_STRING)) {
            throw new IllegalArgumentException("Setting '" + name
                    + "' is not a string-type setting.");
        }
        List<String> allowedValues = new ArrayList<String>();
        for (Value allowedValue : setting.getAllowedValues()) {
            allowedValues.add(allowedValue.getStringValue());
        }
        return allowedValues;
    }

    /**
     * For a given setting name returns values that are allowed for that setting (string).
     */
    public List<Integer> getAllowedIntValues(@NonNull @SettingName String name) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        if (!setting.getValueType().equals(VALUE_TYPE_INT)) {
            throw new IllegalArgumentException("Setting '" + name
                    + "' is not a string-type setting.");
        }
        List<Integer> allowedValues = new ArrayList<Integer>();
        for (Value allowedValue : setting.getAllowedValues()) {
            allowedValues.add(allowedValue.getIntValue());
        }
        return allowedValues;
    }

    /**
     * For a given setting name returns the default value for that setting (string).
     */
    public String getDefaultStringValue(@NonNull @SettingName String name) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        if (!setting.getValueType().equals(VALUE_TYPE_STRING)) {
            throw new IllegalArgumentException("Setting '" + name
                    + "' is not a string-type setting.");
        }
        return getSetting(name).getDefaultValue().getStringValue();
    }

    /**
     * For a given setting name returns the default value for that setting (int).
     */
    public int getDefaultIntValue(@NonNull @SettingName String name) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        if (!setting.getValueType().equals(VALUE_TYPE_INT)) {
            throw new IllegalArgumentException("Setting '" + name
                    + "' is not a string-type setting.");
        }
        return getSetting(name).getDefaultValue().getIntValue();
    }

    /**
     * For a given setting name returns the current value of that setting (string).
     */
    public String getStringValue(@NonNull @SettingName String name) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        if (!setting.getValueType().equals(VALUE_TYPE_STRING)) {
            throw new IllegalArgumentException("Setting '" + name
                    + "' is not a string-type setting.");
        }
        HdmiLogger.debug("Getting CEC setting value '" + name + "'.");
        return retrieveValue(setting, setting.getDefaultValue().getStringValue());
    }

    /**
     * For a given setting name returns the current value of that setting (int).
     */
    public int getIntValue(@NonNull @SettingName String name) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        if (!setting.getValueType().equals(VALUE_TYPE_INT)) {
            throw new IllegalArgumentException("Setting '" + name
                    + "' is not a int-type setting.");
        }
        HdmiLogger.debug("Getting CEC setting value '" + name + "'.");
        String defaultValue = Integer.toString(setting.getDefaultValue().getIntValue());
        String value = retrieveValue(setting, defaultValue);
        return Integer.parseInt(value);
    }

    /**
     * For a given setting name and value sets the current value of that setting (string).
     */
    public void setStringValue(@NonNull @SettingName String name, @NonNull String value) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        if (!setting.getUserConfigurable()) {
            throw new IllegalArgumentException("Updating CEC setting '" + name + "' prohibited.");
        }
        if (!setting.getValueType().equals(VALUE_TYPE_STRING)) {
            throw new IllegalArgumentException("Setting '" + name
                    + "' is not a string-type setting.");
        }
        if (!getAllowedStringValues(name).contains(value)) {
            throw new IllegalArgumentException("Invalid CEC setting '" + name
                                               + "' value: '" + value + "'.");
        }
        HdmiLogger.debug("Updating CEC setting '" + name + "' to '" + value + "'.");
        storeValue(setting, value);
    }

    /**
     * For a given setting name and value sets the current value of that setting (int).
     */
    public void setIntValue(@NonNull @SettingName String name, int value) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
        }
        if (!setting.getUserConfigurable()) {
            throw new IllegalArgumentException("Updating CEC setting '" + name + "' prohibited.");
        }
        if (!setting.getValueType().equals(VALUE_TYPE_INT)) {
            throw new IllegalArgumentException("Setting '" + name
                    + "' is not a int-type setting.");
        }
        if (!getAllowedIntValues(name).contains(value)) {
            throw new IllegalArgumentException("Invalid CEC setting '" + name
                                               + "' value: '" + value + "'.");
        }
        HdmiLogger.debug("Updating CEC setting '" + name + "' to '" + value + "'.");
        storeValue(setting, Integer.toString(value));
    }
}
