CEC: make it sure to send vendor commands when changing a setting.
- Remove 'oneway' from IHdmiVendorCommandListener. - Add flush() method to HdmiCecController. - Use IoThread for HdmiCecController. Bug: 18495592 Change-Id: I497f7b49e94dd4402058ecc89cb5b7a3d58bf1e1
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user