diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 9471e49d4090a..401bb9d324920 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -424,36 +424,37 @@ public final class HdmiControlManager { * * @hide */ - public static final String SETTING_NAME_HDMI_CEC_ENABLED = "hdmi_cec_enabled"; + public static final String CEC_SETTING_NAME_HDMI_CEC_ENABLED = "hdmi_cec_enabled"; /** * Name of a setting deciding on the Standby message behaviour on sleep. * * @hide */ - public static final String SETTING_NAME_SEND_STANDBY_ON_SLEEP = "send_standby_on_sleep"; + public static final String CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP = "send_standby_on_sleep"; /** * Name of a setting deciding on power state action when losing Active Source. * * @hide */ - public static final String SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST = + public static final String CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST = "power_state_change_on_active_source_lost"; /** * Name of a setting deciding whether System Audio Muting is allowed. * * @hide */ - public static final String SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING = "system_audio_mode_muting"; + public static final String CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING = + "system_audio_mode_muting"; /** * @hide */ @StringDef({ - SETTING_NAME_HDMI_CEC_ENABLED, - SETTING_NAME_SEND_STANDBY_ON_SLEEP, - SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, - SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING, + CEC_SETTING_NAME_HDMI_CEC_ENABLED, + CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP, + CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, + CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING, }) - public @interface SettingName {} + public @interface CecSettingName {} // True if we have a logical device of type playback hosted in the system. private final boolean mHasPlaybackDevice; @@ -1301,14 +1302,15 @@ public final class HdmiControlManager { * @hide */ @NonNull + @CecSettingName @RequiresPermission(android.Manifest.permission.HDMI_CEC) - public List getAvailableCecSettings() { + public List getUserCecSettings() { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); throw new RuntimeException("HdmiControlService is not available"); } try { - return mService.getAvailableCecSettings(); + return mService.getUserCecSettings(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1326,7 +1328,7 @@ public final class HdmiControlManager { */ @NonNull @RequiresPermission(android.Manifest.permission.HDMI_CEC) - public List getAllowedCecSettingValues(@NonNull String name) { + public List getAllowedCecSettingValues(@NonNull @CecSettingName String name) { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); throw new RuntimeException("HdmiControlService is not available"); @@ -1354,7 +1356,7 @@ public final class HdmiControlManager { throw new RuntimeException("HdmiControlService is not available"); } try { - mService.setCecSettingValue(SETTING_NAME_HDMI_CEC_ENABLED, value); + mService.setCecSettingValue(CEC_SETTING_NAME_HDMI_CEC_ENABLED, value); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1377,7 +1379,7 @@ public final class HdmiControlManager { throw new RuntimeException("HdmiControlService is not available"); } try { - return mService.getCecSettingValue(SETTING_NAME_HDMI_CEC_ENABLED); + return mService.getCecSettingValue(CEC_SETTING_NAME_HDMI_CEC_ENABLED); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1399,7 +1401,7 @@ public final class HdmiControlManager { throw new RuntimeException("HdmiControlService is not available"); } try { - mService.setCecSettingValue(SETTING_NAME_SEND_STANDBY_ON_SLEEP, value); + mService.setCecSettingValue(CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP, value); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1422,7 +1424,7 @@ public final class HdmiControlManager { throw new RuntimeException("HdmiControlService is not available"); } try { - return mService.getCecSettingValue(SETTING_NAME_SEND_STANDBY_ON_SLEEP); + return mService.getCecSettingValue(CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1446,7 +1448,7 @@ public final class HdmiControlManager { } try { mService.setCecSettingValue( - SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, value); + CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, value); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1470,7 +1472,7 @@ public final class HdmiControlManager { } try { return mService.getCecSettingValue( - SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST); + CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1492,7 +1494,7 @@ public final class HdmiControlManager { throw new RuntimeException("HdmiControlService is not available"); } try { - mService.setCecSettingValue(SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING, value); + mService.setCecSettingValue(CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING, value); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1515,7 +1517,7 @@ public final class HdmiControlManager { throw new RuntimeException("HdmiControlService is not available"); } try { - return mService.getCecSettingValue(SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING); + return mService.getCecSettingValue(CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java b/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java index 46a3c4fa4bfa1..22d4640be4931 100644 --- a/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java +++ b/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java @@ -296,8 +296,8 @@ public final class HdmiControlServiceWrapper { } @Override - public List getAvailableCecSettings() { - return HdmiControlServiceWrapper.this.getAvailableCecSettings(); + public List getUserCecSettings() { + return HdmiControlServiceWrapper.this.getUserCecSettings(); } @Override @@ -489,7 +489,7 @@ public final class HdmiControlServiceWrapper { IHdmiCecVolumeControlFeatureListener listener) {} /** @hide */ - public List getAvailableCecSettings() { + public List getUserCecSettings() { return new ArrayList<>(); } diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl index 3478b238f07fa..6df164bb71dc0 100644 --- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl +++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl @@ -87,7 +87,7 @@ interface IHdmiControlService { boolean isHdmiCecVolumeControlEnabled(); void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute); void setSystemAudioModeOnForAudioOnlySource(); - List getAvailableCecSettings(); + List getUserCecSettings(); List getAllowedCecSettingValues(String name); String getCecSettingValue(String name); void setCecSettingValue(String name, String value); diff --git a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java index f9140bc4caa4f..cc68bb6333cb9 100644 --- a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java +++ b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java @@ -376,7 +376,7 @@ public class HdmiAudioSystemClientTest { } @Override - public List getAvailableCecSettings() { + public List getUserCecSettings() { return new ArrayList<>(); } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java index 393a66eb1063d..2b4d51522e419 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java @@ -16,6 +16,8 @@ package com.android.server.hdmi; +import static android.hardware.hdmi.HdmiControlManager.CecSettingName; + import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -179,13 +181,13 @@ public class HdmiCecConfig { @Storage private int getStorage(@NonNull Setting setting) { switch (setting.getName()) { - case HdmiControlManager.SETTING_NAME_HDMI_CEC_ENABLED: + case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED: return STORAGE_GLOBAL_SETTINGS; - case HdmiControlManager.SETTING_NAME_SEND_STANDBY_ON_SLEEP: + case HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP: return STORAGE_GLOBAL_SETTINGS; - case HdmiControlManager.SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST: + case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST: return STORAGE_SYSPROPS; - case HdmiControlManager.SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING: + case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING: return STORAGE_SYSPROPS; default: throw new RuntimeException("Invalid CEC setting '" + setting.getName() @@ -195,13 +197,13 @@ public class HdmiCecConfig { private String getStorageKey(@NonNull Setting setting) { switch (setting.getName()) { - case HdmiControlManager.SETTING_NAME_HDMI_CEC_ENABLED: + case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED: return Global.HDMI_CONTROL_ENABLED; - case HdmiControlManager.SETTING_NAME_SEND_STANDBY_ON_SLEEP: + case HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP: return Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP; - case HdmiControlManager.SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST: + case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST: return SYSPROP_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST; - case HdmiControlManager.SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING: + case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING: return SYSPROP_SYSTEM_AUDIO_MODE_MUTING; default: throw new RuntimeException("Invalid CEC setting '" + setting.getName() @@ -238,33 +240,44 @@ public class HdmiCecConfig { } /** - * Returns a list of currently available settings based on the XML metadata. + * Returns a list of all settings based on the XML metadata. */ - public List getAvailableSettings() { - Set availableSettings = new HashSet(); + public @CecSettingName List getAllSettings() { + List allSettings = new ArrayList(); + for (Setting setting : mProductConfig.getSetting()) { + allSettings.add(setting.getName()); + } + return allSettings; + } + + /** + * Returns a list of user-modifiable settings based on the XML metadata. + */ + public @CecSettingName List getUserSettings() { + Set userSettings = new HashSet(); // First read from the product config. for (Setting setting : mProductConfig.getSetting()) { if (setting.getUserConfigurable()) { - availableSettings.add(setting.getName()); + userSettings.add(setting.getName()); } } if (mVendorOverride != null) { // Next either add or remove based on the vendor override. for (Setting setting : mVendorOverride.getSetting()) { if (setting.getUserConfigurable()) { - availableSettings.add(setting.getName()); + userSettings.add(setting.getName()); } else { - availableSettings.remove(setting.getName()); + userSettings.remove(setting.getName()); } } } - return new ArrayList(availableSettings); + return new ArrayList(userSettings); } /** * For a given setting name returns values that are allowed for that setting. */ - public List getAllowedValues(@NonNull String name) { + public List getAllowedValues(@NonNull @CecSettingName String name) { Setting setting = getSetting(name); if (setting == null) { throw new IllegalArgumentException("Setting '" + name + "' does not exist."); @@ -279,7 +292,7 @@ public class HdmiCecConfig { /** * For a given setting name returns the default value for that setting. */ - public String getDefaultValue(@NonNull String name) { + public String getDefaultValue(@NonNull @CecSettingName String name) { Setting setting = getSetting(name); if (setting == null) { throw new IllegalArgumentException("Setting '" + name + "' does not exist."); @@ -290,7 +303,7 @@ public class HdmiCecConfig { /** * For a given setting name returns the current value of that setting. */ - public String getValue(@NonNull Context context, @NonNull String name) { + public String getValue(@NonNull Context context, @NonNull @CecSettingName String name) { Setting setting = getSetting(name); if (setting == null) { throw new IllegalArgumentException("Setting '" + name + "' does not exist."); @@ -302,7 +315,8 @@ public class HdmiCecConfig { /** * For a given setting name and value sets the current value of that setting. */ - public void setValue(@NonNull Context context, @NonNull String name, @NonNull String value) { + public void setValue(@NonNull Context context, @NonNull @CecSettingName String name, + @NonNull String value) { Setting setting = getSetting(name); if (setting == null) { throw new IllegalArgumentException("Setting '" + name + "' does not exist."); diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 98830cd7e2332..ad5290cfe45db 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -2334,11 +2334,11 @@ public class HdmiControlService extends SystemService { } @Override - public List getAvailableCecSettings() { + public List getUserCecSettings() { enforceAccessPermission(); long token = Binder.clearCallingIdentity(); try { - return HdmiControlService.this.getHdmiCecConfig().getAvailableSettings(); + return HdmiControlService.this.getHdmiCecConfig().getUserSettings(); } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java index af2a4be95d9dd..bbda1684f8a5f 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java @@ -64,16 +64,53 @@ public final class HdmiCecConfigTest { } @Test - public void getAvailableCecSettings_Empty() { + public void getAllCecSettings_Empty() { HdmiCecConfig hdmiCecConfig = createHdmiCecConfig( "" + "" + "", null); - assertThat(hdmiCecConfig.getAvailableSettings()).isEmpty(); + assertThat(hdmiCecConfig.getAllSettings()).isEmpty(); } @Test - public void getAvailableCecSettings_OnlyMasterXml() { + public void getAllCecSettings_BasicSanity() { + HdmiCecConfig hdmiCecConfig = createHdmiCecConfig( + "" + + "" + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + "", null); + assertThat(hdmiCecConfig.getAllSettings()) + .containsExactly(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED, + HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP); + } + + @Test + public void getUserCecSettings_Empty() { + HdmiCecConfig hdmiCecConfig = createHdmiCecConfig( + "" + + "" + + "", null); + assertThat(hdmiCecConfig.getUserSettings()).isEmpty(); + } + + @Test + public void getUserCecSettings_OnlyMasterXml() { HdmiCecConfig hdmiCecConfig = createHdmiCecConfig( "" + "" @@ -95,13 +132,13 @@ public final class HdmiCecConfigTest { + " " + " " + "", null); - assertThat(hdmiCecConfig.getAvailableSettings()) - .containsExactly(HdmiControlManager.SETTING_NAME_HDMI_CEC_ENABLED, - HdmiControlManager.SETTING_NAME_SEND_STANDBY_ON_SLEEP); + assertThat(hdmiCecConfig.getUserSettings()) + .containsExactly(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED, + HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP); } @Test - public void getAvailableCecSettings_WithOverride() { + public void getUserCecSettings_WithOverride() { HdmiCecConfig hdmiCecConfig = createHdmiCecConfig( "" + "" @@ -135,8 +172,8 @@ public final class HdmiCecConfigTest { + " " + " " + ""); - assertThat(hdmiCecConfig.getAvailableSettings()) - .containsExactly(HdmiControlManager.SETTING_NAME_HDMI_CEC_ENABLED); + assertThat(hdmiCecConfig.getUserSettings()) + .containsExactly(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED); } @Test @@ -165,7 +202,7 @@ public final class HdmiCecConfigTest { + " " + "", null); assertThat(hdmiCecConfig.getAllowedValues( - HdmiControlManager.SETTING_NAME_SEND_STANDBY_ON_SLEEP)) + HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP)) .containsExactly(HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV, HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST, HdmiControlManager.SEND_STANDBY_ON_SLEEP_NONE); @@ -197,7 +234,7 @@ public final class HdmiCecConfigTest { + " " + "", null); assertThat(hdmiCecConfig.getDefaultValue( - HdmiControlManager.SETTING_NAME_SEND_STANDBY_ON_SLEEP)) + HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP)) .isEqualTo(HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV); } @@ -231,7 +268,7 @@ public final class HdmiCecConfigTest { + " " + "", null); assertThat(hdmiCecConfig.getValue(mContext, - HdmiControlManager.SETTING_NAME_SEND_STANDBY_ON_SLEEP)) + HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP)) .isEqualTo(HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST); } @@ -256,7 +293,7 @@ public final class HdmiCecConfigTest { + " " + "", null); assertThat(hdmiCecConfig.getValue(mContext, - HdmiControlManager.SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST)) + HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST)) .isEqualTo(HdmiProperties.power_state_change_on_active_source_lost_values .STANDBY_NOW.name().toLowerCase()); } @@ -288,7 +325,7 @@ public final class HdmiCecConfigTest { + "", null); assertThrows(IllegalArgumentException.class, () -> hdmiCecConfig.setValue(mContext, - HdmiControlManager.SETTING_NAME_SEND_STANDBY_ON_SLEEP, + HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP, HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST)); } @@ -309,7 +346,7 @@ public final class HdmiCecConfigTest { + "", null); assertThrows(IllegalArgumentException.class, () -> hdmiCecConfig.setValue(mContext, - HdmiControlManager.SETTING_NAME_SEND_STANDBY_ON_SLEEP, + HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP, "bar")); } @@ -329,7 +366,7 @@ public final class HdmiCecConfigTest { + " " + "", null); hdmiCecConfig.setValue(mContext, - HdmiControlManager.SETTING_NAME_SEND_STANDBY_ON_SLEEP, + HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP, HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST); verify(mStorageAdapter).storeGlobalSetting(mContext, Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP, @@ -351,9 +388,9 @@ public final class HdmiCecConfigTest { + " " + "", null); hdmiCecConfig.setValue(mContext, - HdmiControlManager.SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, - HdmiProperties.power_state_change_on_active_source_lost_values - .STANDBY_NOW.name().toLowerCase()); + HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, + HdmiProperties.power_state_change_on_active_source_lost_values + .STANDBY_NOW.name().toLowerCase()); verify(mStorageAdapter).storeSystemProperty( HdmiCecConfig.SYSPROP_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, HdmiProperties.power_state_change_on_active_source_lost_values