From de7a4248d8631099544e4cf43c02b10131cf6672 Mon Sep 17 00:00:00 2001 From: Jinsuk Kim Date: Fri, 5 Dec 2014 12:05:27 +0900 Subject: [PATCH] CEC: Avoid setting op in disabled mode In disabled HDMI control mode, TV local device is gone, for which setting operation is not possible. Does the check against the tv instance when TV setting update is notified. The settings is picked up when the control is enabled back, so notification is not lost. Bug: 18580387 Change-Id: Id8891bfa54d851ec1aff280fc99be8e428f4e0cf --- .../server/hdmi/HdmiControlService.java | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 5f8b3899486ef..16d4a424fb9ff 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -379,7 +379,7 @@ public final class HdmiControlService extends SystemService { } mWakeUpMessageReceived = false; - if (isTvDevice()) { + if (isTvDeviceEnabled()) { mCecController.setOption(OPTION_CEC_AUTO_WAKEUP, toInt(tv().getAutoWakeup())); } int reason = -1; @@ -430,11 +430,15 @@ public final class HdmiControlService extends SystemService { setControlEnabled(enabled); break; case Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED: - tv().setAutoWakeup(enabled); + if (isTvDeviceEnabled()) { + tv().setAutoWakeup(enabled); + } setCecOption(OPTION_CEC_AUTO_WAKEUP, toInt(enabled)); break; case Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED: - tv().setAutoDeviceOff(enabled); + if (isTvDeviceEnabled()) { + tv().setAutoDeviceOff(enabled); + } // No need to propagate to HAL. break; case Global.MHL_INPUT_SWITCHING_ENABLED: @@ -665,11 +669,7 @@ public final class HdmiControlService extends SystemService { @ServiceThreadOnly HdmiDeviceInfo getDeviceInfo(int logicalAddress) { assertRunOnServiceThread(); - HdmiCecLocalDeviceTv tv = tv(); - if (tv == null) { - return null; - } - return tv.getCecDeviceInfo(logicalAddress); + return tv() == null ? null : tv().getCecDeviceInfo(logicalAddress); } /** @@ -1418,8 +1418,8 @@ public final class HdmiControlService extends SystemService { runOnServiceThread(new Runnable() { @Override public void run() { - if (!isTvDevice()) { - Slog.w(TAG, "No TV is available."); + if (!isTvDeviceEnabled()) { + Slog.w(TAG, "TV device is not enabled."); return; } tv().startOneTouchRecord(recorderAddress, recordSource); @@ -1433,8 +1433,8 @@ public final class HdmiControlService extends SystemService { runOnServiceThread(new Runnable() { @Override public void run() { - if (!isTvDevice()) { - Slog.w(TAG, "No TV is available."); + if (!isTvDeviceEnabled()) { + Slog.w(TAG, "TV device is not enabled."); return; } tv().stopOneTouchRecord(recorderAddress); @@ -1449,8 +1449,8 @@ public final class HdmiControlService extends SystemService { runOnServiceThread(new Runnable() { @Override public void run() { - if (!isTvDevice()) { - Slog.w(TAG, "No TV is available."); + if (!isTvDeviceEnabled()) { + Slog.w(TAG, "TV device is not enabled."); return; } tv().startTimerRecording(recorderAddress, sourceType, recordSource); @@ -1465,8 +1465,8 @@ public final class HdmiControlService extends SystemService { runOnServiceThread(new Runnable() { @Override public void run() { - if (!isTvDevice()) { - Slog.w(TAG, "No TV is available."); + if (!isTvDeviceEnabled()) { + Slog.w(TAG, "TV device is not enabled."); return; } tv().clearTimerRecording(recorderAddress, sourceType, recordSource); @@ -1769,6 +1769,10 @@ public final class HdmiControlService extends SystemService { return mLocalDevices.contains(HdmiDeviceInfo.DEVICE_TV); } + boolean isTvDeviceEnabled() { + return isTvDevice() && tv() != null; + } + private HdmiCecLocalDevicePlayback playback() { return (HdmiCecLocalDevicePlayback) mCecController.getLocalDevice(HdmiDeviceInfo.DEVICE_PLAYBACK); @@ -1876,7 +1880,7 @@ public final class HdmiControlService extends SystemService { assertRunOnServiceThread(); mLanguage = language; - if (isTvDevice()) { + if (isTvDeviceEnabled()) { tv().broadcastMenuLanguage(language); } } @@ -2100,6 +2104,7 @@ public final class HdmiControlService extends SystemService { @ServiceThreadOnly void changeInputForMhl(int portId, boolean contentOn) { assertRunOnServiceThread(); + if (tv() == null) return; final int lastInput = contentOn ? tv().getActivePortId() : Constants.INVALID_PORT_ID; tv().doManualPortSwitching(portId, new IHdmiControlCallback.Stub() { @Override