From a9f10629f4bc1a82761917645ff4d2b6d42e47b3 Mon Sep 17 00:00:00 2001 From: Jungshik Jang Date: Fri, 11 Jul 2014 15:36:39 +0900 Subject: [PATCH] Start address allocation when hdmi cec is re-enabled. When a user turns hdmi cec on from system settings or other possible way, hdmi control service should start over from logical address allocation. As device discovery action from bootup is slightly different from one from enabling hdmi cec, added additional params to all notification method which is called when logical address allocation is done. Bug: 16222082 Change-Id: Ib73be5f642646918b470d769dc563753c4ff48d3 --- .../server/hdmi/HdmiCecLocalDevice.java | 6 ++-- .../hdmi/HdmiCecLocalDevicePlayback.java | 2 +- .../server/hdmi/HdmiCecLocalDeviceTv.java | 4 +-- .../server/hdmi/HdmiControlService.java | 36 ++++++++++--------- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index 07a564dc0d866..3937ce1010e8e 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -115,7 +115,7 @@ abstract class HdmiCecLocalDevice { /** * Called once a logical address of the local device is allocated. */ - protected abstract void onAddressAllocated(int logicalAddress); + protected abstract void onAddressAllocated(int logicalAddress, boolean fromBootup); /** * Dispatch incoming message. @@ -394,10 +394,10 @@ abstract class HdmiCecLocalDevice { } @ServiceThreadOnly - final void handleAddressAllocated(int logicalAddress) { + final void handleAddressAllocated(int logicalAddress, boolean fromBootup) { assertRunOnServiceThread(); mAddress = mPreferredAddress = logicalAddress; - onAddressAllocated(logicalAddress); + onAddressAllocated(logicalAddress, fromBootup); } @ServiceThreadOnly diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index 9807659f6b1b0..06907cec0427b 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -38,7 +38,7 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice { @Override @ServiceThreadOnly - protected void onAddressAllocated(int logicalAddress) { + protected void onAddressAllocated(int logicalAddress, boolean fromBootup) { assertRunOnServiceThread(); mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand( mAddress, mService.getPhysicalAddress(), mDeviceType)); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 89573f728fece..8adb07ba713ad 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -94,14 +94,14 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @Override @ServiceThreadOnly - protected void onAddressAllocated(int logicalAddress) { + protected void onAddressAllocated(int logicalAddress, boolean fromBootup) { assertRunOnServiceThread(); mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand( mAddress, mService.getPhysicalAddress(), mDeviceType)); mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand( mAddress, mService.getVendorId())); mSystemAudioMode = mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_ENABLED, false); - launchRoutingControl(true); + launchRoutingControl(fromBootup); launchDeviceDiscovery(); registerAudioPortUpdateListener(); // TODO: unregister audio port update listener if local device is released. diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index e7b13611bb8c9..a2a795cb8326e 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -211,16 +211,17 @@ public final class HdmiControlService extends SystemService { mPowerStatus = HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON; mProhibitMode = false; mHdmiControlEnabled = readBooleanSetting(Global.HDMI_CONTROL_ENABLED, true); - mCecController = HdmiCecController.create(this); + mCecController = HdmiCecController.create(this); if (mCecController != null) { // TODO: Remove this as soon as OEM's HAL implementation is corrected. mCecController.setOption(HdmiTvClient.OPTION_CEC_ENABLE, HdmiTvClient.ENABLED); - mCecController.setOption(HdmiTvClient.OPTION_CEC_SERVICE_CONTROL, - HdmiTvClient.ENABLED); - initializeLocalDevices(mLocalDevices); + // TODO: load value for mHdmiControlEnabled from preference. + if (mHdmiControlEnabled) { + initializeCec(true); + } } else { Slog.i(TAG, "Device does not support HDMI-CEC."); } @@ -252,8 +253,14 @@ public final class HdmiControlService extends SystemService { Global.putInt(cr, key, value ? Constants.TRUE : Constants.FALSE); } + private void initializeCec(boolean fromBootup) { + mCecController.setOption(HdmiTvClient.OPTION_CEC_SERVICE_CONTROL, + HdmiTvClient.ENABLED); + initializeLocalDevices(mLocalDevices, fromBootup); + } + @ServiceThreadOnly - private void initializeLocalDevices(final List deviceTypes) { + private void initializeLocalDevices(final List deviceTypes, final boolean fromBootup) { assertRunOnServiceThread(); // A container for [Logical Address, Local device info]. final SparseArray devices = new SparseArray<>(); @@ -282,7 +289,7 @@ public final class HdmiControlService extends SystemService { if (mPowerStatus == HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON) { mPowerStatus = HdmiControlManager.POWER_STATUS_ON; } - notifyAddressAllocated(devices); + notifyAddressAllocated(devices, fromBootup); } } }); @@ -290,12 +297,13 @@ public final class HdmiControlService extends SystemService { } @ServiceThreadOnly - private void notifyAddressAllocated(SparseArray devices) { + private void notifyAddressAllocated(SparseArray devices, + boolean fromBootup) { assertRunOnServiceThread(); for (int i = 0; i < devices.size(); ++i) { int address = devices.keyAt(i); HdmiCecLocalDevice device = devices.valueAt(i); - device.handleAddressAllocated(address); + device.handleAddressAllocated(address, fromBootup); } } @@ -1223,8 +1231,9 @@ public final class HdmiControlService extends SystemService { assertRunOnServiceThread(); mPowerStatus = HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON; if (mCecController != null) { - mCecController.setOption(HdmiTvClient.OPTION_CEC_SERVICE_CONTROL, HdmiTvClient.ENABLED); - initializeLocalDevices(mLocalDevices); + if (mHdmiControlEnabled) { + initializeCec(true); + } } else { Slog.i(TAG, "Device does not support HDMI-CEC."); } @@ -1338,12 +1347,7 @@ public final class HdmiControlService extends SystemService { } if (enabled) { - // TODO: call initalizedLocalDevice with additional param once putting - // it to address allocation result. - HdmiCecLocalDeviceTv tv = tv(); - if (tv != null) { - tv.launchRoutingControl(false); - } + initializeCec(false); } else { disableDevices(new PendingActionClearedCallback() { @Override