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
This commit is contained in:
Michal Olech
2021-02-23 17:28:11 +00:00
committed by Android (Google) Code Review
5 changed files with 42 additions and 37 deletions

View File

@@ -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)

View File

@@ -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,

View File

@@ -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,12 +430,20 @@ 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) {
listener.onChange(setting.getName());
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);

View File

@@ -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() {

View File

@@ -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(