am f1702487: CEC: make it sure to send vendor commands when changing a setting.

* commit 'f17024873b10dabed069e502030dd85d6257c0c4':
  CEC: make it sure to send vendor commands when changing a setting.
This commit is contained in:
Yuncheol Heo
2014-12-01 23:39:17 +00:00
committed by Android Git Automerger
3 changed files with 56 additions and 20 deletions

View File

@@ -22,7 +22,7 @@ package android.hardware.hdmi;
*
* @hide
*/
oneway interface IHdmiVendorCommandListener {
interface IHdmiVendorCommandListener {
void onReceived(int logicalAddress, int destAddress, in byte[] operands, boolean hasVendorId);
void onControlStateChanged(boolean enabled, int reason);
}

View File

@@ -129,7 +129,7 @@ final class HdmiCecController {
}
private void init(long nativePtr) {
mIoHandler = new Handler(mService.getServiceLooper());
mIoHandler = new Handler(mService.getIoLooper());
mControlHandler = new Handler(mService.getServiceLooper());
mNativePtr = nativePtr;
}
@@ -324,6 +324,7 @@ final class HdmiCecController {
@ServiceThreadOnly
void setOption(int flag, int value) {
assertRunOnServiceThread();
HdmiLogger.debug("setOption: [flag:%d, value:%d]", flag, value);
nativeSetOption(mNativePtr, flag, value);
}
@@ -501,6 +502,19 @@ final class HdmiCecController {
mControlHandler.post(runnable);
}
@ServiceThreadOnly
void flush(final Runnable runnable) {
assertRunOnServiceThread();
runOnIoThread(new Runnable() {
@Override
public void run() {
// This ensures the runnable for cleanup is performed after all the pending
// commands are processed by IO thread.
runOnServiceThread(runnable);
}
});
}
private boolean isAcceptableAddress(int address) {
// Can access command targeting devices available in local device or broadcast command.
if (address == Constants.ADDR_BROADCAST) {

View File

@@ -2021,30 +2021,52 @@ public final class HdmiControlService extends SystemService {
void setControlEnabled(boolean enabled) {
assertRunOnServiceThread();
if (!enabled) {
// Call the vendor handler before the service is disabled.
invokeVendorCommandListenersOnControlStateChanged(false,
HdmiControlManager.CONTROL_STATE_CHANGED_REASON_SETTING);
}
int value = toInt(enabled);
mCecController.setOption(OPTION_CEC_ENABLE, value);
mMhlController.setOption(OPTION_MHL_ENABLE, value);
synchronized (mLock) {
mHdmiControlEnabled = enabled;
}
if (enabled) {
initializeCec(INITIATED_BY_ENABLE_CEC);
} else {
disableDevices(new PendingActionClearedCallback() {
@Override
public void onCleared(HdmiCecLocalDevice device) {
assertRunOnServiceThread();
clearLocalDevices();
}
});
enableHdmiControlService();
return;
}
// Call the vendor handler before the service is disabled.
invokeVendorCommandListenersOnControlStateChanged(false,
HdmiControlManager.CONTROL_STATE_CHANGED_REASON_SETTING);
// Post the remained tasks in the service thread again to give the vendor-issued-tasks
// a chance to run.
runOnServiceThread(new Runnable() {
@Override
public void run() {
disableHdmiControlService();
}
});
return;
}
@ServiceThreadOnly
private void enableHdmiControlService() {
mCecController.setOption(OPTION_CEC_ENABLE, ENABLED);
mMhlController.setOption(OPTION_MHL_ENABLE, ENABLED);
initializeCec(INITIATED_BY_ENABLE_CEC);
}
@ServiceThreadOnly
private void disableHdmiControlService() {
disableDevices(new PendingActionClearedCallback() {
@Override
public void onCleared(HdmiCecLocalDevice device) {
assertRunOnServiceThread();
mCecController.flush(new Runnable() {
@Override
public void run() {
mCecController.setOption(OPTION_CEC_ENABLE, DISABLED);
mMhlController.setOption(OPTION_MHL_ENABLE, DISABLED);
clearLocalDevices();
}
});
}
});
}
@ServiceThreadOnly