diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 4ec3f926ed86f..b90c72832d369 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -503,6 +503,29 @@ public final class HdmiControlManager { @Retention(RetentionPolicy.SOURCE) public @interface TvWakeOnOneTouchPlay {} + // -- Whether TV should send <Standby> on sleep. + /** + * Sending <Standby> on sleep. + * + * @hide + */ + public static final int TV_SEND_STANDBY_ON_SLEEP_ENABLED = 1; + /** + * Not sending <Standby> on sleep. + * + * @hide + */ + public static final int TV_SEND_STANDBY_ON_SLEEP_DISABLED = 0; + /** + * @hide + */ + @IntDef(prefix = { "TV_SEND_STANDBY_ON_SLEEP_" }, value = { + TV_SEND_STANDBY_ON_SLEEP_ENABLED, + TV_SEND_STANDBY_ON_SLEEP_DISABLED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface TvSendStandbyOnSleep {} + // -- The RC profile of a TV panel. /** * RC profile none. @@ -746,6 +769,14 @@ public final class HdmiControlManager { */ public static final String CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY = "tv_wake_on_one_touch_play"; + /** + * Name of a setting deciding whether the device will also turn off other CEC devices + * when it goes to standby mode. + * + * @hide + */ + public static final String CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP = + "tv_send_standby_on_sleep"; /** * Name of a setting representing the RC profile of a TV panel. * @@ -805,12 +836,13 @@ public final class HdmiControlManager { CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING, CEC_SETTING_NAME_VOLUME_CONTROL_MODE, CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY, + CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP, CEC_SETTING_NAME_RC_PROFILE_TV, CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU, CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU, CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU, CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU, - CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU + CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU, }) public @interface CecSettingName {} @@ -2158,4 +2190,48 @@ public final class HdmiControlManager { throw e.rethrowFromSystemServer(); } } + + /** + * Set the current status of TV send <Standby> on Sleep. + * + *
Sets whether the device will also turn off other CEC devices + * when it goes to standby mode. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.HDMI_CEC) + public void setTvSendStandbyOnSleep(@NonNull @TvSendStandbyOnSleep int value) { + if (mService == null) { + Log.e(TAG, "HdmiControlService is not available"); + throw new RuntimeException("HdmiControlService is not available"); + } + try { + mService.setCecSettingIntValue(CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP, value); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Get the current status of TV send <Standby> on Sleep. + * + *
Reflects whether the device will also turn off other CEC devices
+ * when it goes to standby mode.
+ *
+ * @hide
+ */
+ @NonNull
+ @TvSendStandbyOnSleep
+ @RequiresPermission(android.Manifest.permission.HDMI_CEC)
+ public int getTvSendStandbyOnSleep() {
+ if (mService == null) {
+ Log.e(TAG, "HdmiControlService is not available");
+ throw new RuntimeException("HdmiControlService is not available");
+ }
+ try {
+ return mService.getCecSettingIntValue(CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
index d66bf63594268..69180643661f9 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
@@ -303,6 +303,8 @@ public class HdmiCecConfig {
return STORAGE_SHARED_PREFS;
case HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY:
return STORAGE_GLOBAL_SETTINGS;
+ case HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP:
+ return STORAGE_GLOBAL_SETTINGS;
case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV:
return STORAGE_SHARED_PREFS;
case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU:
@@ -338,6 +340,8 @@ public class HdmiCecConfig {
return setting.getName();
case HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY:
return Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED;
+ case HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP:
+ return Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED;
case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV:
return setting.getName();
case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU:
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index ccce9dc43e6d6..382f0f9d6329d 100755
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -956,8 +956,6 @@ abstract class HdmiCecLocalDevice {
}
}
- void setAutoDeviceOff(boolean enabled) {}
-
/**
* Called when a hot-plug event issued.
*
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index e6cf18b8db3d6..75b52f95d5bb1 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -24,7 +24,6 @@ import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.os.SystemProperties;
-import android.provider.Settings.Global;
import android.sysprop.HdmiProperties;
import android.util.Slog;
@@ -56,9 +55,6 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
// Lazily initialized - should call getWakeLock() to get the instance.
private ActiveWakeLock mWakeLock;
- // If true, turn off TV upon standby. False by default.
- private boolean mAutoTvOff;
-
// Determines what action should be taken upon receiving Routing Control messages.
@VisibleForTesting
protected HdmiProperties.playback_device_action_on_routing_control_values
@@ -68,12 +64,6 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
HdmiCecLocalDevicePlayback(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
-
- mAutoTvOff = mService.readBooleanSetting(Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED, false);
-
- // The option is false by default. Update settings db as well to have the right
- // initial setting on UI.
- mService.writeBooleanSetting(Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED, mAutoTvOff);
}
@Override
@@ -154,7 +144,10 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
// Invalidate the internal active source record when goes to standby
mService.setActiveSource(Constants.ADDR_INVALID, Constants.INVALID_PHYSICAL_ADDRESS,
"HdmiCecLocalDevicePlayback#onStandby()");
- if (initiatedByCec || !mAutoTvOff || !wasActiveSource) {
+ boolean mTvSendStandbyOnSleep = mService.getHdmiCecConfig().getIntValue(
+ HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP)
+ == HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_ENABLED;
+ if (initiatedByCec || !mTvSendStandbyOnSleep || !wasActiveSource) {
return;
}
switch (standbyAction) {
@@ -200,13 +193,6 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
}
}
- @Override
- @ServiceThreadOnly
- void setAutoDeviceOff(boolean enabled) {
- assertRunOnServiceThread();
- mAutoTvOff = enabled;
- }
-
@Override
@CallSuper
@ServiceThreadOnly
@@ -425,7 +411,6 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
protected void dump(final IndentingPrintWriter pw) {
super.dump(pw);
pw.println("isActiveSource(): " + isActiveSource());
- pw.println("mAutoTvOff:" + mAutoTvOff);
}
// Wrapper interface over PowerManager.WakeLock
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 5ef3738fc5b6e..a3e18d1617519 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -89,9 +89,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
@GuardedBy("mLock")
private boolean mSystemAudioMute = false;
- // If true, TV going to standby mode puts other devices also to standby.
- private boolean mAutoDeviceOff;
-
private final HdmiCecStandbyModeHandler mStandbyHandler;
// If true, do not do routing control/send active source for internal source.
@@ -156,8 +153,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
HdmiCecLocalDeviceTv(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_TV);
mPrevPortId = Constants.INVALID_PORT_ID;
- mAutoDeviceOff = mService.readBooleanSetting(Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
- true);
mSystemAudioControlFeatureEnabled =
mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED, true);
mStandbyHandler = new HdmiCecStandbyModeHandler(service, this);
@@ -1202,13 +1197,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
}
}
- @Override
- @ServiceThreadOnly
- void setAutoDeviceOff(boolean enabled) {
- assertRunOnServiceThread();
- mAutoDeviceOff = enabled;
- }
-
@ServiceThreadOnly
boolean getAutoWakeup() {
assertRunOnServiceThread();
@@ -1286,7 +1274,11 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
if (!mService.isControlEnabled()) {
return;
}
- if (!initiatedByCec && mAutoDeviceOff) {
+ boolean sendStandbyOnSleep =
+ mService.getHdmiCecConfig().getIntValue(
+ HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP)
+ == HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_ENABLED;
+ if (!initiatedByCec && sendStandbyOnSleep) {
mService.sendCecCommand(HdmiCecMessageBuilder.buildStandby(
mAddress, Constants.ADDR_BROADCAST));
}
@@ -1545,7 +1537,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
pw.println("mArcFeatureEnabled: " + mArcFeatureEnabled);
pw.println("mSystemAudioMute: " + mSystemAudioMute);
pw.println("mSystemAudioControlFeatureEnabled: " + mSystemAudioControlFeatureEnabled);
- pw.println("mAutoDeviceOff: " + mAutoDeviceOff);
pw.println("mSkipRoutingControl: " + mSkipRoutingControl);
pw.println("mPrevPortId: " + mPrevPortId);
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 8febd4ff6c27c..0ae1994bd3682 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -661,7 +661,6 @@ public class HdmiControlService extends SystemService {
ContentResolver resolver = getContext().getContentResolver();
String[] settings = new String[] {
Global.HDMI_CONTROL_VOLUME_CONTROL_ENABLED,
- Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
Global.MHL_INPUT_SWITCHING_ENABLED,
Global.MHL_POWER_CHARGE_ENABLED,
@@ -689,15 +688,6 @@ public class HdmiControlService extends SystemService {
setHdmiCecVolumeControlEnabledInternal(getHdmiCecConfig().getIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE));
break;
- case Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED:
- for (int type : mLocalDevices) {
- HdmiCecLocalDevice localDevice = mHdmiCecNetwork.getLocalDevice(type);
- if (localDevice != null) {
- localDevice.setAutoDeviceOff(enabled);
- }
- }
- // No need to propagate to HAL.
- break;
case Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED:
if (isTvDeviceEnabled()) {
tv().setSystemAudioControlFeatureEnabled(enabled);
diff --git a/services/core/java/com/android/server/hdmi/cec_config.xml b/services/core/java/com/android/server/hdmi/cec_config.xml
index a751fd73c5420..191e725181ca1 100644
--- a/services/core/java/com/android/server/hdmi/cec_config.xml
+++ b/services/core/java/com/android/server/hdmi/cec_config.xml
@@ -64,6 +64,15 @@