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

Commit 873c5414 authored by Michal Olech's avatar Michal Olech Committed by Android (Google) Code Review
Browse files

Merge changes from topic "HdmiCecVersionSharedPrefs" into sc-dev

* changes:
  [CEC Configuration] Move 'hdmi_cec_version' to SharedPreferences
  [CEC Configuration] Run HdmiControlService change notifications in the service thread
parents fff84a26 27a87466
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -10696,14 +10696,6 @@ public final class Settings {
        public static final String HDMI_CEC_SWITCH_ENABLED =
                "hdmi_cec_switch_enabled";
        /**
         * HDMI CEC version to use. Defaults to v1.4b.
         * @hide
         */
        @Readable
        public static final String HDMI_CEC_VERSION =
                "hdmi_cec_version";
        /**
         * Whether TV will automatically turn on upon reception of the CEC command
         * <Text View On> or <Image View On>. (0 = false, 1 = true)
+0 −1
Original line number Diff line number Diff line
@@ -299,7 +299,6 @@ public class SettingsBackupTest {
                    Settings.Global.GNSS_SATELLITE_BLOCKLIST,
                    Settings.Global.GPRS_REGISTER_CHECK_PERIOD_MS,
                    Settings.Global.HDMI_CEC_SWITCH_ENABLED,
                    Settings.Global.HDMI_CEC_VERSION,
                    Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
                    Settings.Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
                    Settings.Global.HDMI_CONTROL_ENABLED,
+31 −14
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.util.Slog;

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;
@@ -55,7 +56,9 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.Executor;

import javax.xml.datatype.DatatypeConfigurationException;

@@ -99,7 +102,7 @@ public class HdmiCecConfig {
    private final Object mLock = new Object();

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

    private SettingsObserver mSettingsObserver;
@@ -292,7 +295,7 @@ public class HdmiCecConfig {
            case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED:
                return STORAGE_GLOBAL_SETTINGS;
            case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION:
                return STORAGE_GLOBAL_SETTINGS;
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE:
                return STORAGE_GLOBAL_SETTINGS;
            case HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE:
@@ -329,7 +332,7 @@ public class HdmiCecConfig {
            case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED:
                return Global.HDMI_CONTROL_ENABLED;
            case HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION:
                return Global.HDMI_CEC_VERSION;
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE:
                return Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP;
            case HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE:
@@ -402,9 +405,6 @@ public class HdmiCecConfig {
            case Global.HDMI_CONTROL_ENABLED:
                notifySettingChanged(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED);
                break;
            case Global.HDMI_CEC_VERSION:
                notifySettingChanged(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION);
                break;
            case Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP:
                notifySettingChanged(HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE);
                break;
@@ -430,13 +430,21 @@ public class HdmiCecConfig {

    private void notifySettingChanged(@NonNull Setting setting) {
        synchronized (mLock) {
            Set<SettingChangeListener> listeners = mSettingChangeListeners.get(setting);
            ArrayMap<SettingChangeListener, Executor> listeners =
                    mSettingChangeListeners.get(setting);
            if (listeners == null) {
                return;  // No listeners registered, do nothing.
            }
            for (SettingChangeListener listener: listeners) {
            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());
                    }
                });
            }
        }
    }

@@ -450,7 +458,6 @@ public class HdmiCecConfig {
        ContentResolver resolver = mContext.getContentResolver();
        String[] settings = new String[] {
                Global.HDMI_CONTROL_ENABLED,
                Global.HDMI_CEC_VERSION,
                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
                Global.HDMI_CONTROL_VOLUME_CONTROL_ENABLED,
                Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
@@ -471,10 +478,19 @@ public class HdmiCecConfig {
    }

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

    /**
     * Register change listener for a given setting name and executor.
     */
    public void registerChangeListener(@NonNull @CecSettingName String name,
                                       SettingChangeListener listener,
                                       Executor executor) {
        Setting setting = getSetting(name);
        if (setting == null) {
            throw new IllegalArgumentException("Setting '" + name + "' does not exist.");
@@ -486,9 +502,9 @@ public class HdmiCecConfig {
        }
        synchronized (mLock) {
            if (!mSettingChangeListeners.containsKey(setting)) {
                mSettingChangeListeners.put(setting, new HashSet<>());
                mSettingChangeListeners.put(setting, new ArrayMap<>());
            }
            mSettingChangeListeners.get(setting).add(listener);
            mSettingChangeListeners.get(setting).put(listener, executor);
        }
    }

@@ -503,7 +519,8 @@ public class HdmiCecConfig {
        }
        synchronized (mLock) {
            if (mSettingChangeListeners.containsKey(setting)) {
                Set<SettingChangeListener> listeners = mSettingChangeListeners.get(setting);
                ArrayMap<SettingChangeListener, Executor> listeners =
                        mSettingChangeListeners.get(setting);
                listeners.remove(listener);
                if (listeners.isEmpty()) {
                    mSettingChangeListeners.remove(setting);
+11 −3
Original line number Diff line number Diff line
@@ -108,6 +108,7 @@ import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;

/**
@@ -199,6 +200,13 @@ public class HdmiControlService extends SystemService {
    public @interface WakeReason {
    }

    private final Executor mServiceThreadExecutor = new Executor() {
        @Override
        public void execute(Runnable r) {
            runOnServiceThread(r);
        }
    };

    // Logical address of the active source.
    @GuardedBy("mLock")
    protected final ActiveSource mActiveSource = new ActiveSource();
@@ -520,14 +528,14 @@ public class HdmiControlService extends SystemService {
                                HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED);
                        setControlEnabled(enabled);
                    }
                });
                }, mServiceThreadExecutor);
        mHdmiCecConfig.registerChangeListener(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
                new HdmiCecConfig.SettingChangeListener() {
                    @Override
                    public void onChange(String setting) {
                        initializeCec(INITIATED_BY_ENABLE_CEC);
                    }
                });
                }, mServiceThreadExecutor);
        mHdmiCecConfig.registerChangeListener(
                HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY,
                new HdmiCecConfig.SettingChangeListener() {
@@ -537,7 +545,7 @@ public class HdmiControlService extends SystemService {
                            setCecOption(OptionKey.WAKEUP, tv().getAutoWakeup());
                        }
                    }
                });
                }, mServiceThreadExecutor);
    }

    private void bootCompleted() {
+0 −11
Original line number Diff line number Diff line
@@ -484,17 +484,6 @@ public class HdmiControlServiceTest {
                HdmiControlManager.VOLUME_CONTROL_ENABLED);
    }

    @Test
    public void getCecVersion_default() {
        // Set the Settings value to "null" to emulate it being empty and force the default value.
        Settings.Global.putString(mContextSpy.getContentResolver(),
                Settings.Global.HDMI_CEC_VERSION,
                null);
        mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
        assertThat(mHdmiControlService.getCecVersion()).isEqualTo(
                HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
    }

    @Test
    public void getCecVersion_1_4() {
        mHdmiControlService.getHdmiCecConfig().setIntValue(