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
This commit is contained in:
Jinsuk Kim
2014-07-03 16:43:58 +09:00
parent c769c1c80c
commit 4d43d93743
6 changed files with 39 additions and 26 deletions

View File

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

View File

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

View File

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

View File

@@ -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();
}
}

View File

@@ -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<IHdmiSystemAudioModeChangeListener>
@@ -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;
}
}
}

View File

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