Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 972597d9 authored by Michal Olech's avatar Michal Olech
Browse files

[CEC Configuration] Port 'power_state_change_on_active_source_lost'

1. Make use of the API in framework code
2. Store the setting in SharedPreferences under the hood

Bug: 171870484
Bug: 171958586
Test: atest HdmiCecLocalDevicePlaybackTest HdmiCecConfigTest
Change-Id: I9d469719bb1356c28eb0184e2e794a7fae8395d7
parent d3a38b91
Loading
Loading
Loading
Loading
+51 −17
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ 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;
@@ -59,15 +60,19 @@ public class 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";

    @IntDef({
        STORAGE_SYSPROPS,
        STORAGE_GLOBAL_SETTINGS,
        STORAGE_SHARED_PREFS,
    })
    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";
@@ -78,12 +83,6 @@ public class HdmiCecConfig {
    })
    private @interface ValueType {}

    /**
     * System property key for Power State Change on Active Source Lost.
     */
    public static final String SYSPROP_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST =
            "ro.hdmi.cec.source.power_state_change_on_active_source_lost";

    /**
     * System property key for Audio Mode Muting.
     */
@@ -99,6 +98,20 @@ public class HdmiCecConfig {
     * 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.
@@ -120,20 +133,35 @@ public class HdmiCecConfig {
         * Read the value from a global setting.
         * Returns the given default value if the system property is not set.
         */
        public String retrieveGlobalSetting(@NonNull Context context,
                                            @NonNull String storageKey,
        public String retrieveGlobalSetting(@NonNull String storageKey,
                                            @NonNull String defaultValue) {
            String value = Global.getString(context.getContentResolver(), storageKey);
            String value = Global.getString(mContext.getContentResolver(), storageKey);
            return value != null ? value : defaultValue;
        }

        /**
         * Write the value to a global setting.
         */
        public void storeGlobalSetting(@NonNull Context context,
                                       @NonNull String storageKey,
        public void storeGlobalSetting(@NonNull String storageKey,
                                       @NonNull String value) {
            Global.putString(context.getContentResolver(), storageKey, 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();
        }
    }

@@ -155,7 +183,7 @@ public class HdmiCecConfig {
    }

    HdmiCecConfig(@NonNull Context context) {
        this(context, new StorageAdapter(),
        this(context, new StorageAdapter(context),
             readSettingsFromFile(Environment.buildPath(Environment.getRootDirectory(),
                                                        ETC_DIR, CONFIG_FILE)),
             readSettingsFromFile(Environment.buildPath(Environment.getVendorDirectory(),
@@ -234,7 +262,7 @@ public class HdmiCecConfig {
            case HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP:
                return STORAGE_GLOBAL_SETTINGS;
            case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST:
                return STORAGE_SYSPROPS;
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING:
                return STORAGE_SYSPROPS;
            default:
@@ -252,7 +280,7 @@ public class HdmiCecConfig {
            case HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP:
                return Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP;
            case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST:
                return SYSPROP_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST;
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING:
                return SYSPROP_SYSTEM_AUDIO_MODE_MUTING;
            default:
@@ -269,7 +297,10 @@ public class HdmiCecConfig {
            return mStorageAdapter.retrieveSystemProperty(storageKey, defaultValue);
        } else if (storage == STORAGE_GLOBAL_SETTINGS) {
            Slog.d(TAG, "Reading '" + storageKey + "' global setting.");
            return mStorageAdapter.retrieveGlobalSetting(mContext, storageKey, defaultValue);
            return mStorageAdapter.retrieveGlobalSetting(storageKey, defaultValue);
        } else if (storage == STORAGE_SHARED_PREFS) {
            Slog.d(TAG, "Reading '" + storageKey + "' shared preference.");
            return mStorageAdapter.retrieveSharedPref(storageKey, defaultValue);
        }
        return null;
    }
@@ -282,7 +313,10 @@ public class HdmiCecConfig {
            mStorageAdapter.storeSystemProperty(storageKey, value);
        } else if (storage == STORAGE_GLOBAL_SETTINGS) {
            Slog.d(TAG, "Setting '" + storageKey + "' global setting.");
            mStorageAdapter.storeGlobalSetting(mContext, storageKey, value);
            mStorageAdapter.storeGlobalSetting(storageKey, value);
        } else if (storage == STORAGE_SHARED_PREFS) {
            Slog.d(TAG, "Setting '" + storageKey + "' shared pref.");
            mStorageAdapter.storeSharedPref(storageKey, value);
        }
    }

+4 −10
Original line number Diff line number Diff line
@@ -66,13 +66,6 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
                    .playback_device_action_on_routing_control()
                    .orElse(HdmiProperties.playback_device_action_on_routing_control_values.NONE);

    // Behaviour of the device when <Active Source> is lost in favor of another device.
    @VisibleForTesting
    protected HdmiProperties.power_state_change_on_active_source_lost_values
            mPowerStateChangeOnActiveSourceLost = HdmiProperties
                    .power_state_change_on_active_source_lost()
                    .orElse(HdmiProperties.power_state_change_on_active_source_lost_values.NONE);

    HdmiCecLocalDevicePlayback(HdmiControlService service) {
        super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);

@@ -279,11 +272,12 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
    @ServiceThreadOnly
    protected void onActiveSourceLost() {
        assertRunOnServiceThread();
        switch (mPowerStateChangeOnActiveSourceLost) {
            case STANDBY_NOW:
        switch (mService.getHdmiCecConfig().getStringValue(
                    HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST)) {
            case HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW:
                mService.standby();
                return;
            case NONE:
            case HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE:
                return;
        }
    }
+10 −1
Original line number Diff line number Diff line
@@ -50,6 +50,15 @@ final class FakeHdmiCecConfig extends HdmiCecConfig {
                    + "    </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_version\""
                    + "           value-type=\"int\""
                    + "           user-configurable=\"true\">"
@@ -62,7 +71,7 @@ final class FakeHdmiCecConfig extends HdmiCecConfig {
                    + "</cec-settings>";

    FakeHdmiCecConfig(@NonNull Context context) {
        super(context, new StorageAdapter(), parseFromString(SYSTEM_CONFIG_XML), null);
        super(context, new StorageAdapter(context), parseFromString(SYSTEM_CONFIG_XML), null);
    }

    private static CecSettings parseFromString(@NonNull String configXml) {
+19 −24
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import android.content.Context;
import android.hardware.hdmi.HdmiControlManager;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings.Global;
import android.sysprop.HdmiProperties;

import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -609,7 +608,7 @@ public final class HdmiCecConfigTest {

    @Test
    public void getStringValue_GlobalSetting_BasicSanity() {
        when(mStorageAdapter.retrieveGlobalSetting(mContext,
        when(mStorageAdapter.retrieveGlobalSetting(
                  Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
                  HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV))
            .thenReturn(HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
@@ -634,20 +633,19 @@ public final class HdmiCecConfigTest {
    }

    @Test
    public void getStringValue_SystemProperty_BasicSanity() {
        when(mStorageAdapter.retrieveSystemProperty(
                  HdmiCecConfig.SYSPROP_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
                  HdmiProperties.power_state_change_on_active_source_lost_values
                      .NONE.name().toLowerCase()))
                .thenReturn(HdmiProperties.power_state_change_on_active_source_lost_values
                       .STANDBY_NOW.name().toLowerCase());
    public void getStringValue_SharedPref_BasicSanity() {
        when(mStorageAdapter.retrieveSharedPref(
                  HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
                  HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE))
                .thenReturn(
                        HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
        HdmiCecConfig hdmiCecConfig = HdmiCecConfig.createFromStrings(
                mContext, mStorageAdapter,
                "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
                + "<cec-settings>"
                + "  <setting name=\"power_state_change_on_active_source_lost\""
                + "           value-type=\"string\""
                + "           user-configurable=\"false\">"
                + "           user-configurable=\"true\">"
                + "    <allowed-values>"
                + "      <value string-value=\"none\" />"
                + "      <value string-value=\"standby_now\" />"
@@ -657,8 +655,7 @@ public final class HdmiCecConfigTest {
                + "</cec-settings>", null);
        assertThat(hdmiCecConfig.getStringValue(
                    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());
                .isEqualTo(HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
    }

    @Test
@@ -704,7 +701,7 @@ public final class HdmiCecConfigTest {

    @Test
    public void getIntValue_GlobalSetting_BasicSanity() {
        when(mStorageAdapter.retrieveGlobalSetting(mContext,
        when(mStorageAdapter.retrieveGlobalSetting(
                  Global.HDMI_CONTROL_ENABLED,
                  Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED)))
            .thenReturn(Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED));
@@ -729,7 +726,7 @@ public final class HdmiCecConfigTest {

    @Test
    public void getIntValue_GlobalSetting_HexValue() {
        when(mStorageAdapter.retrieveGlobalSetting(mContext,
        when(mStorageAdapter.retrieveGlobalSetting(
                  Global.HDMI_CONTROL_ENABLED,
                  Integer.toHexString(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED)))
            .thenReturn(Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED));
@@ -861,13 +858,13 @@ public final class HdmiCecConfigTest {
                + "</cec-settings>", null);
        hdmiCecConfig.setStringValue(HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                               HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
        verify(mStorageAdapter).storeGlobalSetting(mContext,
        verify(mStorageAdapter).storeGlobalSetting(
                  Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
                  HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
    }

    @Test
    public void setStringValue_SystemProperty_BasicSanity() {
    public void setStringValue_SharedPref_BasicSanity() {
        HdmiCecConfig hdmiCecConfig = HdmiCecConfig.createFromStrings(
                mContext, mStorageAdapter,
                "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
@@ -884,12 +881,10 @@ public final class HdmiCecConfigTest {
                + "</cec-settings>", null);
        hdmiCecConfig.setStringValue(
                  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
                      .STANDBY_NOW.name().toLowerCase());
                  HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
        verify(mStorageAdapter).storeSharedPref(
                  HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
                  HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
    }

    @Test
@@ -973,7 +968,7 @@ public final class HdmiCecConfigTest {
                + "</cec-settings>", null);
        hdmiCecConfig.setIntValue(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
                                  HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
        verify(mStorageAdapter).storeGlobalSetting(mContext,
        verify(mStorageAdapter).storeGlobalSetting(
                  Global.HDMI_CONTROL_ENABLED,
                  Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED));
    }
@@ -996,7 +991,7 @@ public final class HdmiCecConfigTest {
                + "</cec-settings>", null);
        hdmiCecConfig.setIntValue(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
                                  HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
        verify(mStorageAdapter).storeGlobalSetting(mContext,
        verify(mStorageAdapter).storeGlobalSetting(
                  Global.HDMI_CONTROL_ENABLED,
                  Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED));
    }
+57 −38

File changed.

Preview size limit exceeded, changes collapsed.