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