From 7e4b480a0bf9f93a428f7c46bfea77ebfdb92d40 Mon Sep 17 00:00:00 2001 From: Jinsuk Kim Date: Mon, 20 Apr 2015 13:17:13 +0900 Subject: [PATCH] CEC: Prevent premature standby process completion Handles the situation where standby is prematurely completed by handleTerminateArc initiated in HdmiCecLocalDeviceTv.disableDevice(). Power status is now checked to stop the flow before removing RequestArcTerminateAction which can call mPendingActionClearedCallback. Also Make sure mPendingActionClearedCallback is set to null at the beginning so that disable callback is not invoked unintentionally in HdmiCecLocalDevice.checkIfPendingActionsCleared() which is supposed to work at standby process only. It is now invoked by handleDisableDeviceTimeout to make sure standby process is completed with PendingActionClearedCallback at HdmiControlService.onStandby(). Bug: 20159835, Bug: 19930352 Change-Id: Iac29dfb6acff76182ff4e9563edc611406c23f3c --- .../com/android/server/hdmi/HdmiCecLocalDevice.java | 10 +++++++--- .../android/server/hdmi/HdmiCecLocalDeviceTv.java | 12 +++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index b24bc65dbb935..8031c058c4ce0 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -176,6 +176,7 @@ abstract class HdmiCecLocalDevice { void init() { assertRunOnServiceThread(); mPreferredAddress = getPreferredAddress(); + mPendingActionClearedCallback = null; } /** @@ -837,16 +838,16 @@ abstract class HdmiCecLocalDevice { * * @param initiatedByCec true if this sequence is initiated * by the reception the CEC messages like <Standby> - * @param origialCallback callback interface to get notified when all pending actions are + * @param originalCallback callback interface to get notified when all pending actions are * cleared */ protected void disableDevice(boolean initiatedByCec, - final PendingActionClearedCallback origialCallback) { + final PendingActionClearedCallback originalCallback) { mPendingActionClearedCallback = new PendingActionClearedCallback() { @Override public void onCleared(HdmiCecLocalDevice device) { mHandler.removeMessages(MSG_DISABLE_DEVICE_TIMEOUT); - origialCallback.onCleared(device); + originalCallback.onCleared(device); } }; mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_DISABLE_DEVICE_TIMEOUT), @@ -865,6 +866,9 @@ abstract class HdmiCecLocalDevice { action.finish(false); iter.remove(); } + if (mPendingActionClearedCallback != null) { + mPendingActionClearedCallback.onCleared(this); + } } /** diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 94f8dee08a5cb..c4f410f3c701c 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -1109,11 +1109,13 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @ServiceThreadOnly protected boolean handleTerminateArc(HdmiCecMessage message) { assertRunOnServiceThread(); - // In cast of termination, do not check ARC configuration in that AVR device - // might be removed already. - - // In case where is started by - // need to clean up RequestArcInitiationAction. + if (mService .isPowerStandbyOrTransient()) { + setArcStatus(false); + return true; + } + // Do not check ARC configuration since the AVR might have been already removed. + // Clean up RequestArcTerminationAction in case was started by + // . removeAction(RequestArcTerminationAction.class); SetArcTransmissionStateAction action = new SetArcTransmissionStateAction(this, message.getSource(), false);