From 4d43d93743222311c6377d4904c19ccb93699d3b Mon Sep 17 00:00:00 2001 From: Jinsuk Kim Date: Thu, 3 Jul 2014 16:43:58 +0900 Subject: [PATCH] Add API setProhibitMode in HdmiControlService setProhibitMode sets a flag inside the service that indicates if input switch request will be processed or not. Sets to true when TV is doing something for which TV display should be fixed, like channel scan, software update - collectively called 'prohibit mode'. Change-Id: I8ac623023210b58b684b9af3ac475a5fe0d09435 --- .../hardware/hdmi/IHdmiControlService.aidl | 1 + .../server/hdmi/ActiveSourceHandler.java | 2 +- .../server/hdmi/HdmiCecLocalDevice.java | 24 +-------------- .../server/hdmi/HdmiCecLocalDeviceTv.java | 6 +++- .../server/hdmi/HdmiControlService.java | 30 +++++++++++++++++++ .../server/hdmi/SystemAudioActionFromAvr.java | 2 +- 6 files changed, 39 insertions(+), 26 deletions(-) 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));