diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl index 6acd7b92f8f84..07983111a8c95 100644 --- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl +++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl @@ -51,6 +51,7 @@ interface IHdmiControlService { void setControlEnabled(boolean enabled); void setArcMode(boolean enabled); void setOption(int option, int value); + void setProhibitMode(boolean enabled); oneway void setSystemAudioVolume(int oldIndex, int newIndex, int maxIndex); oneway void setSystemAudioMute(boolean mute); } diff --git a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java index 905214f248102..92fab2dee436c 100644 --- a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java +++ b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java @@ -72,7 +72,7 @@ final class ActiveSourceHandler { int currentActive = tv.getActiveSource(); int currentPath = tv.getActivePath(); - if (!tv.isInPresetInstallationMode()) { + if (!tv.isProhibitMode()) { tv.updateActiveSource(activeAddress, activePath); if (currentActive != activeAddress && currentPath != activePath) { tv.updateActivePortId(mService.pathToPortId(activePath)); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index ee02883f0df76..093cc17b1446d 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -53,12 +53,6 @@ abstract class HdmiCecLocalDevice { @GuardedBy("mLock") private int mActiveRoutingPath; - // Set to true while the service is in normal mode. While set to false, no input change is - // allowed. Used for situations where input change can confuse users such as channel auto-scan, - // system upgrade, etc., a.k.a. "prohibit mode". - @GuardedBy("mLock") - private boolean mInputChangeEnabled; - protected final HdmiCecMessageCache mCecMessageCache = new HdmiCecMessageCache(); protected final Object mLock; @@ -71,9 +65,6 @@ abstract class HdmiCecLocalDevice { mDeviceType = deviceType; mAddress = HdmiCec.ADDR_UNREGISTERED; mLock = service.getServiceLock(); - - // TODO: Get control flag from persistent storage - mInputChangeEnabled = true; } // Factory method that returns HdmiCecLocalDevice of corresponding type. @@ -291,7 +282,7 @@ abstract class HdmiCecLocalDevice { protected boolean handleStandby(HdmiCecMessage message) { assertRunOnServiceThread(); // Seq #12 - if (mService.isControlEnabled() && !isInPresetInstallationMode() + if (mService.isControlEnabled() && !mService.isProhibitMode() && mService.isPowerOnOrTransient()) { mService.standby(); return true; @@ -548,19 +539,6 @@ abstract class HdmiCecLocalDevice { } } - void setInputChangeEnabled(boolean enabled) { - synchronized (mLock) { - mInputChangeEnabled = enabled; - } - } - - boolean isInPresetInstallationMode() { - // TODO: Change this to check the right flag. - synchronized (mLock) { - return !mInputChangeEnabled; - } - } - @ServiceThreadOnly HdmiCecMessageCache getCecMessageCache() { assertRunOnServiceThread(); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 868571ed8ecdf..dafcc46ecf6d4 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -270,7 +270,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { if (getActiveSource() != message.getSource()) { return true; } - if (isInPresetInstallationMode()) { + if (isProhibitMode()) { return true; } int portId = getPrevPortId(); @@ -1043,4 +1043,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } return false; } + + boolean isProhibitMode() { + return mService.isProhibitMode(); + } } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 95d833390450a..02435106b7c56 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -144,6 +144,12 @@ public final class HdmiControlService extends SystemService { @GuardedBy("mLock") private boolean mHdmiControlEnabled; + // Set to true while the service is in normal mode. While set to false, no input change is + // allowed. Used for situations where input change can confuse users such as channel auto-scan, + // system upgrade, etc., a.k.a. "prohibit mode". + @GuardedBy("mLock") + private boolean mProhibitMode; + // List of listeners registered by callers that want to get notified of // system audio mode changes. private final ArrayList @@ -210,6 +216,8 @@ public final class HdmiControlService extends SystemService { // TODO: Read the preference for SystemAudioMode and initialize mSystemAudioMode and // start to monitor the preference value and invoke SystemAudioActionFromTv if needed. mHdmiControlEnabled = true; + // TODO: Get control flag from persistent storage + mProhibitMode = false; } @ServiceThreadOnly @@ -850,6 +858,7 @@ public final class HdmiControlService extends SystemService { @Override public void setOption(final int key, final int value) { + enforceAccessPermission(); if (!isTvDevice()) { return; } @@ -873,6 +882,15 @@ public final class HdmiControlService extends SystemService { private boolean isTvDevice() { return tv() != null; } + + @Override + public void setProhibitMode(final boolean enabled) { + enforceAccessPermission(); + if (!isTvDevice()) { + return; + } + HdmiControlService.this.setProhibitMode(enabled); + } } @ServiceThreadOnly @@ -1116,4 +1134,16 @@ public final class HdmiControlService extends SystemService { mStandbyMessageReceived = false; mCecController.setOption(HdmiCec.OPTION_CEC_SERVICE_CONTROL, HdmiCec.DISABLED); } + + boolean isProhibitMode() { + synchronized (mLock) { + return mProhibitMode; + } + } + + void setProhibitMode(boolean enabled) { + synchronized (mLock) { + mProhibitMode = enabled; + } + } } diff --git a/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java b/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java index f44c014898604..ef7e837a0cc27 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java @@ -51,7 +51,7 @@ final class SystemAudioActionFromAvr extends SystemAudioAction { finishWithCallback(HdmiCec.RESULT_SUCCESS); return; } - if (tv().isInPresetInstallationMode()) { + if (tv().isProhibitMode()) { sendCommand(HdmiCecMessageBuilder.buildFeatureAbortCommand( getSourceAddress(), mAvrLogicalAddress, HdmiCec.MESSAGE_SET_SYSTEM_AUDIO_MODE, HdmiConstants.ABORT_REFUSED));