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:
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user