Merge changes from topic "CecConfigRRO" into sc-dev

* changes:
  [CEC Configuration] Remove cec-config XSD and the main cec_config.xml
  [CEC Configuration] Replace custom XML schema with RROs
This commit is contained in:
Michal Olech
2021-03-12 05:16:24 +00:00
committed by Android (Google) Code Review
14 changed files with 814 additions and 1234 deletions

View File

@@ -665,9 +665,8 @@ java_defaults {
],
required: [
"framework-platform-compat-config",
// TODO: remove gps_debug, cec_config.xml and protolog.conf.json when the build system propagates "required" properly.
// TODO: remove gps_debug and protolog.conf.json when the build system propagates "required" properly.
"gps_debug.conf",
"cec_config.xml",
"icu4j-platform-compat-config",
"libcore-platform-compat-config",
"protolog.conf.json.gz",

View File

@@ -4722,4 +4722,97 @@
<!-- Whether to allow the caching of the SIM PIN for verification after unattended reboot -->
<bool name="config_allow_pin_storage_for_unattended_reboot">true</bool>
<!-- CEC Configuration -->
<bool name="config_cecHdmiCecEnabled_userConfigurable">true</bool>
<bool name="config_cecHdmiCecControlEnabled_allowed">true</bool>
<bool name="config_cecHdmiCecControlEnabled_default">true</bool>
<bool name="config_cecHdmiCecControlDisabled_allowed">true</bool>
<bool name="config_cecHdmiCecControlDisabled_default">false</bool>
<bool name="config_cecHdmiCecVersion_userConfigurable">true</bool>
<bool name="config_cecHdmiCecVersion14b_allowed">true</bool>
<bool name="config_cecHdmiCecVersion14b_default">true</bool>
<bool name="config_cecHdmiCecVersion20_allowed">true</bool>
<bool name="config_cecHdmiCecVersion20_default">false</bool>
<bool name="config_cecSendStandbyOnSleep_userConfigurable">true</bool>
<bool name="config_cecPowerControlModeTv_allowed">true</bool>
<bool name="config_cecPowerControlModeTv_default">true</bool>
<bool name="config_cecPowerControlModeBroadcast_allowed">true</bool>
<bool name="config_cecPowerControlModeBroadcast_default">false</bool>
<bool name="config_cecPowerControlModeNone_allowed">true</bool>
<bool name="config_cecPowerControlModeNone_default">false</bool>
<bool name="config_cecPowerStateChangeOnActiveSourceLost_userConfigurable">true</bool>
<bool name="config_cecPowerStateChangeOnActiveSourceLostNone_allowed">true</bool>
<bool name="config_cecPowerStateChangeOnActiveSourceLostNone_default">true</bool>
<bool name="config_cecPowerStateChangeOnActiveSourceLostStandbyNow_allowed">true</bool>
<bool name="config_cecPowerStateChangeOnActiveSourceLostStandbyNow_default">false</bool>
<bool name="config_cecSystemAudioModeMuting_userConfigurable">true</bool>
<bool name="config_cecSystemAudioModeMutingEnabled_allowed">true</bool>
<bool name="config_cecSystemAudioModeMutingEnabled_default">true</bool>
<bool name="config_cecSystemAudioModeMutingDisabled_allowed">true</bool>
<bool name="config_cecSystemAudioModeMutingDisabled_default">false</bool>
<bool name="config_cecVolumeControlMode_userConfigurable">true</bool>
<bool name="config_cecVolumeControlModeEnabled_allowed">true</bool>
<bool name="config_cecVolumeControlModeEnabled_default">true</bool>
<bool name="config_cecVolumeControlModeDisabled_allowed">true</bool>
<bool name="config_cecVolumeControlModeDisabled_default">false</bool>
<bool name="config_cecTvWakeOnOneTouchPlay_userConfigurable">true</bool>
<bool name="config_cecTvWakeOnOneTouchPlayEnabled_allowed">true</bool>
<bool name="config_cecTvWakeOnOneTouchPlayEnabled_default">true</bool>
<bool name="config_cecTvWakeOnOneTouchPlayDisabled_allowed">true</bool>
<bool name="config_cecTvWakeOnOneTouchPlayDisabled_default">false</bool>
<bool name="config_cecTvSendStandbyOnSleep_userConfigurable">true</bool>
<bool name="config_cecTvSendStandbyOnSleepEnabled_allowed">true</bool>
<bool name="config_cecTvSendStandbyOnSleepEnabled_default">true</bool>
<bool name="config_cecTvSendStandbyOnSleepDisabled_allowed">true</bool>
<bool name="config_cecTvSendStandbyOnSleepDisabled_default">false</bool>
<bool name="config_cecRcProfileTv_userConfigurable">true</bool>
<bool name="config_cecRcProfileTvNone_allowed">true</bool>
<bool name="config_cecRcProfileTvNone_default">true</bool>
<bool name="config_cecRcProfileTvOne_allowed">true</bool>
<bool name="config_cecRcProfileTvOne_default">false</bool>
<bool name="config_cecRcProfileTvTwo_allowed">true</bool>
<bool name="config_cecRcProfileTvTwo_default">false</bool>
<bool name="config_cecRcProfileTvThree_allowed">true</bool>
<bool name="config_cecRcProfileTvThree_default">false</bool>
<bool name="config_cecRcProfileTvFour_allowed">true</bool>
<bool name="config_cecRcProfileTvFour_default">false</bool>
<bool name="config_cecRcProfileSourceRootMenu_userConfigurable">true</bool>
<bool name="config_cecRcProfileSourceRootMenuHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceRootMenuHandled_default">true</bool>
<bool name="config_cecRcProfileSourceRootMenuNotHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceRootMenuNotHandled_default">false</bool>
<bool name="config_cecRcProfileSourceSetupMenu_userConfigurable">true</bool>
<bool name="config_cecRcProfileSourceSetupMenuHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceSetupMenuHandled_default">true</bool>
<bool name="config_cecRcProfileSourceSetupMenuNotHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceSetupMenuNotHandled_default">false</bool>
<bool name="config_cecRcProfileSourceContentsMenu_userConfigurable">true</bool>
<bool name="config_cecRcProfileSourceContentsMenuHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceContentsMenuHandled_default">false</bool>
<bool name="config_cecRcProfileSourceContentsMenuNotHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceContentsMenuNotHandled_default">true</bool>
<bool name="config_cecRcProfileSourceTopMenu_userConfigurable">true</bool>
<bool name="config_cecRcProfileSourceTopMenuHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceTopMenuHandled_default">false</bool>
<bool name="config_cecRcProfileSourceTopMenuNotHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceTopMenuNotHandled_default">true</bool>
<bool name="config_cecRcProfileSourceMediaContextSensitiveMenu_userConfigurable">true</bool>
<bool name="config_cecRcProfileSourceMediaContextSensitiveMenuHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceMediaContextSensitiveMenuHandled_default">false</bool>
<bool name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed">true</bool>
<bool name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default">true</bool>
</resources>

View File

@@ -4224,4 +4224,97 @@
<java-symbol type="bool" name="config_voice_data_sms_auto_fallback" />
<java-symbol type="bool" name="config_enableOneHandedKeyguard" />
<!-- CEC Configuration -->
<java-symbol type="bool" name="config_cecHdmiCecEnabled_userConfigurable" />
<java-symbol type="bool" name="config_cecHdmiCecControlEnabled_allowed" />
<java-symbol type="bool" name="config_cecHdmiCecControlEnabled_default" />
<java-symbol type="bool" name="config_cecHdmiCecControlDisabled_allowed" />
<java-symbol type="bool" name="config_cecHdmiCecControlDisabled_default" />
<java-symbol type="bool" name="config_cecHdmiCecVersion_userConfigurable" />
<java-symbol type="bool" name="config_cecHdmiCecVersion14b_allowed" />
<java-symbol type="bool" name="config_cecHdmiCecVersion14b_default" />
<java-symbol type="bool" name="config_cecHdmiCecVersion20_allowed" />
<java-symbol type="bool" name="config_cecHdmiCecVersion20_default" />
<java-symbol type="bool" name="config_cecSendStandbyOnSleep_userConfigurable" />
<java-symbol type="bool" name="config_cecPowerControlModeTv_allowed" />
<java-symbol type="bool" name="config_cecPowerControlModeTv_default" />
<java-symbol type="bool" name="config_cecPowerControlModeBroadcast_allowed" />
<java-symbol type="bool" name="config_cecPowerControlModeBroadcast_default" />
<java-symbol type="bool" name="config_cecPowerControlModeNone_allowed" />
<java-symbol type="bool" name="config_cecPowerControlModeNone_default" />
<java-symbol type="bool" name="config_cecPowerStateChangeOnActiveSourceLost_userConfigurable" />
<java-symbol type="bool" name="config_cecPowerStateChangeOnActiveSourceLostNone_allowed" />
<java-symbol type="bool" name="config_cecPowerStateChangeOnActiveSourceLostNone_default" />
<java-symbol type="bool" name="config_cecPowerStateChangeOnActiveSourceLostStandbyNow_allowed" />
<java-symbol type="bool" name="config_cecPowerStateChangeOnActiveSourceLostStandbyNow_default" />
<java-symbol type="bool" name="config_cecSystemAudioModeMuting_userConfigurable" />
<java-symbol type="bool" name="config_cecSystemAudioModeMutingEnabled_allowed" />
<java-symbol type="bool" name="config_cecSystemAudioModeMutingEnabled_default" />
<java-symbol type="bool" name="config_cecSystemAudioModeMutingDisabled_allowed" />
<java-symbol type="bool" name="config_cecSystemAudioModeMutingDisabled_default" />
<java-symbol type="bool" name="config_cecVolumeControlMode_userConfigurable" />
<java-symbol type="bool" name="config_cecVolumeControlModeEnabled_allowed" />
<java-symbol type="bool" name="config_cecVolumeControlModeEnabled_default" />
<java-symbol type="bool" name="config_cecVolumeControlModeDisabled_allowed" />
<java-symbol type="bool" name="config_cecVolumeControlModeDisabled_default" />
<java-symbol type="bool" name="config_cecTvWakeOnOneTouchPlay_userConfigurable" />
<java-symbol type="bool" name="config_cecTvWakeOnOneTouchPlayEnabled_allowed" />
<java-symbol type="bool" name="config_cecTvWakeOnOneTouchPlayEnabled_default" />
<java-symbol type="bool" name="config_cecTvWakeOnOneTouchPlayDisabled_allowed" />
<java-symbol type="bool" name="config_cecTvWakeOnOneTouchPlayDisabled_default" />
<java-symbol type="bool" name="config_cecTvSendStandbyOnSleep_userConfigurable" />
<java-symbol type="bool" name="config_cecTvSendStandbyOnSleepEnabled_allowed" />
<java-symbol type="bool" name="config_cecTvSendStandbyOnSleepEnabled_default" />
<java-symbol type="bool" name="config_cecTvSendStandbyOnSleepDisabled_allowed" />
<java-symbol type="bool" name="config_cecTvSendStandbyOnSleepDisabled_default" />
<java-symbol type="bool" name="config_cecRcProfileTv_userConfigurable" />
<java-symbol type="bool" name="config_cecRcProfileTvNone_allowed" />
<java-symbol type="bool" name="config_cecRcProfileTvNone_default" />
<java-symbol type="bool" name="config_cecRcProfileTvOne_allowed" />
<java-symbol type="bool" name="config_cecRcProfileTvOne_default" />
<java-symbol type="bool" name="config_cecRcProfileTvTwo_allowed" />
<java-symbol type="bool" name="config_cecRcProfileTvTwo_default" />
<java-symbol type="bool" name="config_cecRcProfileTvThree_allowed" />
<java-symbol type="bool" name="config_cecRcProfileTvThree_default" />
<java-symbol type="bool" name="config_cecRcProfileTvFour_allowed" />
<java-symbol type="bool" name="config_cecRcProfileTvFour_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceRootMenu_userConfigurable" />
<java-symbol type="bool" name="config_cecRcProfileSourceRootMenuHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceRootMenuHandled_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceRootMenuNotHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceRootMenuNotHandled_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceSetupMenu_userConfigurable" />
<java-symbol type="bool" name="config_cecRcProfileSourceSetupMenuHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceSetupMenuHandled_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceSetupMenuNotHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceSetupMenuNotHandled_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceContentsMenu_userConfigurable" />
<java-symbol type="bool" name="config_cecRcProfileSourceContentsMenuHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceContentsMenuHandled_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceContentsMenuNotHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceContentsMenuNotHandled_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceTopMenu_userConfigurable" />
<java-symbol type="bool" name="config_cecRcProfileSourceTopMenuHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceTopMenuHandled_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceTopMenuNotHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceTopMenuNotHandled_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceMediaContextSensitiveMenu_userConfigurable" />
<java-symbol type="bool" name="config_cecRcProfileSourceMediaContextSensitiveMenuHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceMediaContextSensitiveMenuHandled_default" />
<java-symbol type="bool" name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed" />
<java-symbol type="bool" name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default" />
</resources>

View File

@@ -98,7 +98,6 @@ java_library_static {
":platform-compat-overrides",
":display-device-config",
":display-layout-config",
":cec-config",
":device-state-config",
"java/com/android/server/EventLogTags.logtags",
"java/com/android/server/am/EventLogTags.logtags",
@@ -119,7 +118,6 @@ java_library_static {
],
required: [
"cec_config.xml",
"gps_debug.conf",
"protolog.conf.json.gz",
],
@@ -184,11 +182,6 @@ java_library_host {
srcs: ["java/com/android/server/notification/SmallHash.java"]
}
prebuilt_etc {
name: "cec_config.xml",
src: "java/com/android/server/hdmi/cec_config.xml",
}
prebuilt_etc {
name: "gps_debug.conf",
src: "java/com/android/server/location/gnss/gps_debug.conf",

View File

@@ -35,33 +35,19 @@ import android.os.SystemProperties;
import android.os.UserHandle;
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 com.android.server.hdmi.cec.config.CecSettings;
import com.android.server.hdmi.cec.config.Setting;
import com.android.server.hdmi.cec.config.Value;
import com.android.server.hdmi.cec.config.XmlParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.Executor;
import javax.xml.datatype.DatatypeConfigurationException;
/**
* The {@link HdmiCecConfig} class is used for getting information about
* available HDMI CEC settings.
@@ -74,6 +60,10 @@ public class HdmiCecConfig {
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,
@@ -81,10 +71,6 @@ public class HdmiCecConfig {
})
private @interface Storage {}
private static final int STORAGE_SYSPROPS = 0;
private static final int STORAGE_GLOBAL_SETTINGS = 1;
private static final int STORAGE_SHARED_PREFS = 2;
private static final String VALUE_TYPE_STRING = "string";
private static final String VALUE_TYPE_INT = "int";
@@ -96,8 +82,6 @@ public class HdmiCecConfig {
@NonNull private final Context mContext;
@NonNull private final StorageAdapter mStorageAdapter;
@Nullable private final CecSettings mSystemConfig;
@Nullable private final CecSettings mVendorOverride;
private final Object mLock = new Object();
@@ -107,6 +91,18 @@ public class HdmiCecConfig {
private SettingsObserver mSettingsObserver;
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.
*/
@@ -202,91 +198,297 @@ public class HdmiCecConfig {
}
}
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;
}
}
private class Setting {
@NonNull private final Context mContext;
@NonNull private final @CecSettingName String mName;
private final boolean mUserConfigurable;
private Value mDefaultValue = null;
private List<Value> mAllowedValues = new ArrayList<>();
Setting(@NonNull Context context,
@NonNull @CecSettingName String name,
int userConfResId) {
mContext = context;
mName = name;
mUserConfigurable = mContext.getResources().getBoolean(userConfResId);
}
public @CecSettingName 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) {
throw new VerificationException("Invalid CEC setup for '"
+ this.getName() + "' setting. "
+ "Setting already has a default value.");
}
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,
@Nullable CecSettings systemConfig,
@Nullable CecSettings vendorOverride) {
@NonNull StorageAdapter storageAdapter) {
mContext = context;
mStorageAdapter = storageAdapter;
mSystemConfig = systemConfig;
mVendorOverride = vendorOverride;
if (mSystemConfig == null) {
Slog.i(TAG, "CEC system configuration XML missing.");
}
if (mVendorOverride == null) {
Slog.i(TAG, "CEC OEM configuration override XML missing.");
}
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 powerControlMode = registerSetting(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
R.bool.config_cecSendStandbyOnSleep_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);
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 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 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_ROOT_MENU_HANDLED,
R.bool.config_cecRcProfileSourceRootMenuHandled_allowed,
R.bool.config_cecRcProfileSourceRootMenuHandled_default);
rcProfileSourceRootMenu.registerValue(
HdmiControlManager.RC_PROFILE_SOURCE_ROOT_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_SETUP_MENU_HANDLED,
R.bool.config_cecRcProfileSourceSetupMenuHandled_allowed,
R.bool.config_cecRcProfileSourceSetupMenuHandled_default);
rcProfileSourceSetupMenu.registerValue(
HdmiControlManager.RC_PROFILE_SOURCE_SETUP_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_CONTENTS_MENU_HANDLED,
R.bool.config_cecRcProfileSourceContentsMenuHandled_allowed,
R.bool.config_cecRcProfileSourceContentsMenuHandled_default);
rcProfileSourceContentsMenu.registerValue(
HdmiControlManager.RC_PROFILE_SOURCE_CONTENTS_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_TOP_MENU_HANDLED,
R.bool.config_cecRcProfileSourceTopMenuHandled_allowed,
R.bool.config_cecRcProfileSourceTopMenuHandled_default);
rcProfileSourceTopMenu.registerValue(
HdmiControlManager.RC_PROFILE_SOURCE_TOP_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_MEDIA_CONTEXT_SENSITIVE_MENU_HANDLED,
R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_allowed,
R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_default);
rcProfileSourceMediaContextSensitiveMenu.registerValue(
HdmiControlManager.RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_MENU_NOT_HANDLED,
R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed,
R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default);
verifySettings();
}
HdmiCecConfig(@NonNull Context context) {
this(context, new StorageAdapter(context),
readSettingsFromFile(Environment.buildPath(Environment.getRootDirectory(),
ETC_DIR, CONFIG_FILE)),
readSettingsFromFile(Environment.buildPath(Environment.getVendorDirectory(),
ETC_DIR, CONFIG_FILE)));
this(context, new StorageAdapter(context));
}
@Nullable
private static CecSettings readSettingsFromFile(@NonNull File file) {
if (!file.exists()) {
return null;
}
if (!file.isFile()) {
Slog.e(TAG, "CEC configuration is not a file: " + file + ", skipping.");
return null;
}
try (InputStream in = new BufferedInputStream(new FileInputStream(file))) {
return XmlParser.read(in);
} catch (IOException | DatatypeConfigurationException | XmlPullParserException e) {
Slog.e(TAG, "Encountered an error while reading/parsing CEC config file: " + file, e);
}
return null;
private Setting registerSetting(@NonNull @CecSettingName String name,
int userConfResId) {
Setting setting = new Setting(mContext, name, userConfResId);
mSettings.put(name, setting);
return setting;
}
@NonNull
@VisibleForTesting
static HdmiCecConfig createFromStrings(@NonNull Context context,
@NonNull StorageAdapter storageAdapter,
@Nullable String productConfigXml,
@Nullable String vendorOverrideXml) {
CecSettings productConfig = null;
CecSettings vendorOverride = null;
try {
if (productConfigXml != null) {
productConfig = XmlParser.read(
new ByteArrayInputStream(productConfigXml.getBytes()));
}
if (vendorOverrideXml != null) {
vendorOverride = XmlParser.read(
new ByteArrayInputStream(vendorOverrideXml.getBytes()));
}
} catch (IOException | DatatypeConfigurationException | XmlPullParserException e) {
Slog.e(TAG, "Encountered an error while reading/parsing CEC config strings", e);
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);
}
return new HdmiCecConfig(context, storageAdapter, productConfig, vendorOverride);
}
@Nullable
private Setting getSetting(@NonNull String name) {
if (mSystemConfig == null) {
return null;
}
if (mVendorOverride != null) {
// First read from the vendor override.
for (Setting setting : mVendorOverride.getSetting()) {
if (setting.getName().equals(name)) {
return setting;
}
}
}
// If not found, try the system config.
for (Setting setting : mSystemConfig.getSetting()) {
if (setting.getName().equals(name)) {
return setting;
}
}
return null;
return mSettings.containsKey(name) ? mSettings.get(name) : null;
}
@Storage
@@ -322,7 +524,7 @@ public class HdmiCecConfig {
.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU:
return STORAGE_SHARED_PREFS;
default:
throw new RuntimeException("Invalid CEC setting '" + setting.getName()
throw new VerificationException("Invalid CEC setting '" + setting.getName()
+ "' storage.");
}
}
@@ -359,7 +561,7 @@ public class HdmiCecConfig {
.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU:
return setting.getName();
default:
throw new RuntimeException("Invalid CEC setting '" + setting.getName()
throw new VerificationException("Invalid CEC setting '" + setting.getName()
+ "' storage key.");
}
}
@@ -396,10 +598,6 @@ public class HdmiCecConfig {
}
}
private int getIntValue(@NonNull Value value) {
return Integer.decode(value.getIntValue());
}
private void notifyGlobalSettingChanged(String setting) {
switch (setting) {
case Global.HDMI_CONTROL_ENABLED:
@@ -533,41 +731,20 @@ public class HdmiCecConfig {
* Returns a list of all settings based on the XML metadata.
*/
public @CecSettingName List<String> getAllSettings() {
if (mSystemConfig == null) {
return new ArrayList<String>();
}
List<String> allSettings = new ArrayList<String>();
for (Setting setting : mSystemConfig.getSetting()) {
allSettings.add(setting.getName());
}
return allSettings;
return new ArrayList<>(mSettings.keySet());
}
/**
* Returns a list of user-modifiable settings based on the XML metadata.
*/
public @CecSettingName List<String> getUserSettings() {
if (mSystemConfig == null) {
return new ArrayList<String>();
}
Set<String> userSettings = new HashSet<String>();
// First read from the system config.
for (Setting setting : mSystemConfig.getSetting()) {
List<String> settings = new ArrayList<>();
for (Setting setting: mSettings.values()) {
if (setting.getUserConfigurable()) {
userSettings.add(setting.getName());
settings.add(setting.getName());
}
}
if (mVendorOverride != null) {
// Next either add or remove based on the vendor override.
for (Setting setting : mVendorOverride.getSetting()) {
if (setting.getUserConfigurable()) {
userSettings.add(setting.getName());
} else {
userSettings.remove(setting.getName());
}
}
}
return new ArrayList(userSettings);
return settings;
}
/**
@@ -607,7 +784,7 @@ public class HdmiCecConfig {
+ "' is not a string-type setting.");
}
List<String> allowedValues = new ArrayList<String>();
for (Value allowedValue : setting.getAllowedValues().getValue()) {
for (Value allowedValue : setting.getAllowedValues()) {
allowedValues.add(allowedValue.getStringValue());
}
return allowedValues;
@@ -626,8 +803,8 @@ public class HdmiCecConfig {
+ "' is not a string-type setting.");
}
List<Integer> allowedValues = new ArrayList<Integer>();
for (Value allowedValue : setting.getAllowedValues().getValue()) {
allowedValues.add(getIntValue(allowedValue));
for (Value allowedValue : setting.getAllowedValues()) {
allowedValues.add(allowedValue.getIntValue());
}
return allowedValues;
}
@@ -659,7 +836,7 @@ public class HdmiCecConfig {
throw new IllegalArgumentException("Setting '" + name
+ "' is not a string-type setting.");
}
return getIntValue(getSetting(name).getDefaultValue());
return getSetting(name).getDefaultValue().getIntValue();
}
/**
@@ -691,7 +868,7 @@ public class HdmiCecConfig {
+ "' is not a int-type setting.");
}
HdmiLogger.debug("Getting CEC setting value '" + name + "'.");
String defaultValue = Integer.toString(getIntValue(setting.getDefaultValue()));
String defaultValue = Integer.toString(setting.getDefaultValue().getIntValue());
String value = retrieveValue(setting, defaultValue);
return Integer.parseInt(value);
}

View File

@@ -1,133 +0,0 @@
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<cec-settings>
<setting name="hdmi_cec_enabled"
value-type="int"
user-configurable="true">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="1" />
</setting>
<setting name="hdmi_cec_version"
value-type="int"
user-configurable="true">
<allowed-values>
<value int-value="0x05" />
<value int-value="0x06" />
</allowed-values>
<default-value int-value="0x05" />
</setting>
<setting name="send_standby_on_sleep"
value-type="string"
user-configurable="true">
<allowed-values>
<value string-value="to_tv" />
<value string-value="broadcast" />
<value string-value="none" />
</allowed-values>
<default-value string-value="to_tv" />
</setting>
<setting name="power_state_change_on_active_source_lost"
value-type="string"
user-configurable="true">
<allowed-values>
<value string-value="none" />
<value string-value="standby_now" />
</allowed-values>
<default-value string-value="none" />
</setting>
<setting name="system_audio_mode_muting"
value-type="int"
user-configurable="true">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="1" />
</setting>
<setting name="volume_control_enabled"
value-type="int"
user-configurable="true">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="1" />
</setting>
<setting name="tv_wake_on_one_touch_play"
value-type="int"
user-configurable="true">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="1" />
</setting>
<setting name="tv_send_standby_on_sleep"
value-type="int"
user-configurable="true">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="1" />
</setting>
<setting name="rc_profile_tv"
value-type="int"
user-configurable="false">
<allowed-values>
<value int-value="0x0" />
<value int-value="0x2" />
<value int-value="0x6" />
<value int-value="0xA" />
<value int-value="0xE" />
</allowed-values>
<default-value int-value="0x0" />
</setting>
<setting name="rc_profile_source_handles_root_menu"
value-type="int"
user-configurable="false">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="1" />
</setting>
<setting name="rc_profile_source_handles_setup_menu"
value-type="int"
user-configurable="false">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="1" />
</setting>
<setting name="rc_profile_source_handles_contents_menu"
value-type="int"
user-configurable="false">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="0" />
</setting>
<setting name="rc_profile_source_handles_top_menu"
value-type="int"
user-configurable="false">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="0" />
</setting>
<setting name="rc_profile_source_handles_media_context_sensitive_menu"
value-type="int"
user-configurable="false">
<allowed-values>
<value int-value="0" />
<value int-value="1" />
</allowed-values>
<default-value int-value="0" />
</setting>
</cec-settings>

View File

@@ -44,13 +44,6 @@ xsd_config {
package_name: "com.android.server.display.config.layout",
}
xsd_config {
name: "cec-config",
srcs: ["cec-config/cec-config.xsd"],
api_dir: "cec-config/schema",
package_name: "com.android.server.hdmi.cec.config",
}
xsd_config {
name: "device-state-config",
srcs: ["device-state-config/device-state-config.xsd"],

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema version="2.0"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="cec-settings">
<xs:complexType>
<xs:sequence>
<xs:element name="setting" type="setting" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="setting">
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="value-type" type="xs:string"/>
<xs:attribute name="user-configurable" type="xs:boolean"/>
<xs:element name="allowed-values" type="value-list" minOccurs="1" maxOccurs="1"/>
<xs:element name="default-value" type="value" minOccurs="1" maxOccurs="1"/>
</xs:complexType>
<xs:complexType name="value-list">
<xs:sequence>
<xs:element name="value" type="value" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="value">
<xs:attribute name="string-value" type="xs:string"/>
<xs:attribute name="int-value" type="xs:string"/>
</xs:complexType>
</xs:schema>

View File

@@ -1,44 +0,0 @@
// Signature format: 2.0
package com.android.server.hdmi.cec.config {
public class CecSettings {
ctor public CecSettings();
method public java.util.List<com.android.server.hdmi.cec.config.Setting> getSetting();
}
public class Setting {
ctor public Setting();
method public com.android.server.hdmi.cec.config.ValueList getAllowedValues();
method public com.android.server.hdmi.cec.config.Value getDefaultValue();
method public String getName();
method public boolean getUserConfigurable();
method public String getValueType();
method public void setAllowedValues(com.android.server.hdmi.cec.config.ValueList);
method public void setDefaultValue(com.android.server.hdmi.cec.config.Value);
method public void setName(String);
method public void setUserConfigurable(boolean);
method public void setValueType(String);
}
public class Value {
ctor public Value();
method public String getIntValue();
method public String getStringValue();
method public void setIntValue(String);
method public void setStringValue(String);
}
public class ValueList {
ctor public ValueList();
method public java.util.List<com.android.server.hdmi.cec.config.Value> getValue();
}
public class XmlParser {
ctor public XmlParser();
method public static com.android.server.hdmi.cec.config.CecSettings read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
}
}

View File

@@ -1 +0,0 @@
// Signature format: 2.0

View File

@@ -16,183 +16,206 @@
package com.android.server.hdmi;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import android.annotation.NonNull;
import android.content.Context;
import android.util.Slog;
import android.content.ContextWrapper;
import android.content.res.Resources;
import com.android.server.hdmi.cec.config.CecSettings;
import com.android.server.hdmi.cec.config.XmlParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.datatype.DatatypeConfigurationException;
import com.android.internal.R;
/**
* Fake class which loads default system configuration with user-configurable
* Fake class which stubs default system configuration with user-configurable
* settings (useful for testing).
*/
final class FakeHdmiCecConfig extends HdmiCecConfig {
private static final String TAG = "FakeHdmiCecConfig";
private static final String SYSTEM_CONFIG_XML =
"<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
+ "<cec-settings>"
+ " <setting name=\"send_standby_on_sleep\""
+ " value-type=\"string\""
+ " user-configurable=\"true\">"
+ " <allowed-values>"
+ " <value string-value=\"to_tv\" />"
+ " <value string-value=\"broadcast\" />"
+ " <value string-value=\"none\" />"
+ " </allowed-values>"
+ " <default-value string-value=\"to_tv\" />"
+ " </setting>"
+ " <setting name=\"power_state_change_on_active_source_lost\""
+ " value-type=\"string\""
+ " user-configurable=\"true\">"
+ " <allowed-values>"
+ " <value string-value=\"none\" />"
+ " <value string-value=\"standby_now\" />"
+ " </allowed-values>"
+ " <default-value string-value=\"none\" />"
+ " </setting>"
+ " <setting name=\"hdmi_cec_enabled\""
+ " value-type=\"int\""
+ " user-configurable=\"true\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"1\" />"
+ " </setting>"
+ " <setting name=\"hdmi_cec_version\""
+ " value-type=\"int\""
+ " user-configurable=\"true\">"
+ " <allowed-values>"
+ " <value int-value=\"0x05\" />"
+ " <value int-value=\"0x06\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"0x05\" />"
+ " </setting>"
+ " <setting name=\"system_audio_mode_muting\""
+ " value-type=\"int\""
+ " user-configurable=\"true\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"1\" />"
+ " </setting>"
+ " <setting name=\"hdmi_cec_enabled\""
+ " value-type=\"int\""
+ " user-configurable=\"true\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"1\" />"
+ " </setting>"
+ " <setting name=\"volume_control_enabled\""
+ " value-type=\"int\""
+ " user-configurable=\"true\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"1\" />"
+ " </setting>"
+ " <setting name=\"tv_wake_on_one_touch_play\""
+ " value-type=\"int\""
+ " user-configurable=\"true\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"1\" />"
+ " </setting>"
+ " <setting name=\"tv_send_standby_on_sleep\""
+ " value-type=\"int\""
+ " user-configurable=\"true\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"1\" />"
+ " </setting>"
+ " <setting name=\"rc_profile_tv\""
+ " value-type=\"int\""
+ " user-configurable=\"false\">"
+ " <allowed-values>"
+ " <value int-value=\"0x0\" />"
+ " <value int-value=\"0x2\" />"
+ " <value int-value=\"0x6\" />"
+ " <value int-value=\"0xA\" />"
+ " <value int-value=\"0xE\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"0x0\" />"
+ " </setting>"
+ " <setting name=\"rc_profile_source_handles_root_menu\""
+ " value-type=\"int\""
+ " user-configurable=\"false\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"1\" />"
+ " </setting>"
+ " <setting name=\"rc_profile_source_handles_setup_menu\""
+ " value-type=\"int\""
+ " user-configurable=\"false\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"1\" />"
+ " </setting>"
+ " <setting name=\"rc_profile_source_handles_contents_menu\""
+ " value-type=\"int\""
+ " user-configurable=\"false\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"0\" />"
+ " </setting>"
+ " <setting name=\"rc_profile_source_handles_top_menu\""
+ " value-type=\"int\""
+ " user-configurable=\"false\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"0\" />"
+ " </setting>"
+ " <setting name=\"rc_profile_source_handles_media_context_sensitive_menu\""
+ " value-type=\"int\""
+ " user-configurable=\"false\">"
+ " <allowed-values>"
+ " <value int-value=\"0\" />"
+ " <value int-value=\"1\" />"
+ " </allowed-values>"
+ " <default-value int-value=\"0\" />"
+ " </setting>"
+ "</cec-settings>";
public static Context buildContext(Context context) {
Context contextSpy = spy(new ContextWrapper(context));
doReturn(buildResources(context)).when(contextSpy).getResources();
return contextSpy;
}
private static Resources buildResources(Context context) {
Resources resources = spy(context.getResources());
doReturn(true).when(resources).getBoolean(
R.bool.config_cecHdmiCecEnabled_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecHdmiCecControlEnabled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecHdmiCecControlEnabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecHdmiCecControlDisabled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecHdmiCecControlDisabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecHdmiCecVersion_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecHdmiCecVersion14b_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecHdmiCecVersion14b_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecHdmiCecVersion20_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecHdmiCecVersion20_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecSendStandbyOnSleep_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecPowerControlModeTv_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecPowerControlModeTv_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecPowerControlModeBroadcast_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecPowerControlModeBroadcast_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecPowerControlModeNone_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecPowerControlModeNone_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecPowerStateChangeOnActiveSourceLost_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecPowerStateChangeOnActiveSourceLostNone_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecPowerStateChangeOnActiveSourceLostNone_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecPowerStateChangeOnActiveSourceLostStandbyNow_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecPowerStateChangeOnActiveSourceLostStandbyNow_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecSystemAudioModeMuting_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecSystemAudioModeMutingEnabled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecSystemAudioModeMutingEnabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecSystemAudioModeMutingDisabled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecSystemAudioModeMutingDisabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecVolumeControlMode_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecVolumeControlModeEnabled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecVolumeControlModeEnabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecVolumeControlModeDisabled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecVolumeControlModeDisabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecTvWakeOnOneTouchPlay_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecTvWakeOnOneTouchPlayEnabled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecTvWakeOnOneTouchPlayEnabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecTvWakeOnOneTouchPlayDisabled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecTvWakeOnOneTouchPlayDisabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecTvSendStandbyOnSleep_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecTvSendStandbyOnSleepEnabled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecTvSendStandbyOnSleepEnabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecTvSendStandbyOnSleepDisabled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecTvSendStandbyOnSleepDisabled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileTv_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileTvNone_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileTvNone_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileTvOne_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecRcProfileTvOne_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileTvTwo_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecRcProfileTvTwo_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileTvThree_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecRcProfileTvThree_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileTvFour_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecRcProfileTvFour_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceRootMenu_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceRootMenuHandled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceRootMenuHandled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceRootMenuNotHandled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceRootMenuNotHandled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceSetupMenu_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceSetupMenuHandled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceSetupMenuHandled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceSetupMenuNotHandled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceSetupMenuNotHandled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceContentsMenu_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceContentsMenuHandled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceContentsMenuHandled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceContentsMenuNotHandled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceContentsMenuNotHandled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceTopMenu_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceTopMenuHandled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceTopMenuHandled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceTopMenuNotHandled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceTopMenuNotHandled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceMediaContextSensitiveMenu_userConfigurable);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_allowed);
doReturn(false).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_default);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed);
doReturn(true).when(resources).getBoolean(
R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default);
return resources;
}
FakeHdmiCecConfig(@NonNull Context context) {
super(context, new StorageAdapter(context), parseFromString(SYSTEM_CONFIG_XML), null);
}
private static CecSettings parseFromString(@NonNull String configXml) {
CecSettings config = null;
try {
config = XmlParser.read(
new ByteArrayInputStream(configXml.getBytes()));
} catch (IOException | DatatypeConfigurationException | XmlPullParserException e) {
Slog.e(TAG, "Encountered an error while reading/parsing CEC config strings", e);
}
return config;
super(buildContext(context), new StorageAdapter(context));
}
}