summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java4
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java61
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiLogger.java2
3 files changed, 51 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 38addba..bc6a299 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -549,6 +549,10 @@ abstract class HdmiCecLocalDevice {
setPreferredAddress(logicalAddress);
}
+ int getType() {
+ return mDeviceType;
+ }
+
@ServiceThreadOnly
HdmiDeviceInfo getDeviceInfo() {
assertRunOnServiceThread();
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index d13e1de..93c0f07 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -98,6 +98,7 @@ public final class HdmiControlService extends SystemService {
static final int INITIATED_BY_BOOT_UP = 1;
static final int INITIATED_BY_SCREEN_ON = 2;
static final int INITIATED_BY_WAKE_UP_MESSAGE = 3;
+ static final int INITIATED_BY_HOTPLUG = 4;
/**
* Interface to report send result.
@@ -408,20 +409,31 @@ public final class HdmiControlService extends SystemService {
private void initializeCec(int initiatedBy) {
mCecController.setOption(OPTION_CEC_SERVICE_CONTROL, ENABLED);
- initializeLocalDevices(mLocalDevices, initiatedBy);
+ initializeLocalDevices(initiatedBy);
}
@ServiceThreadOnly
- private void initializeLocalDevices(final List<Integer> deviceTypes, final int initiatedBy) {
+ private void initializeLocalDevices(final int initiatedBy) {
assertRunOnServiceThread();
- // A container for [Logical Address, Local device info].
- final SparseArray<HdmiCecLocalDevice> devices = new SparseArray<>();
- final int[] finished = new int[1];
+ // A container for [Device type, Local device info].
+ ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>();
clearLocalDevices();
- for (int type : deviceTypes) {
+ for (int type : mLocalDevices) {
final HdmiCecLocalDevice localDevice = HdmiCecLocalDevice.create(this, type);
localDevice.init();
- mCecController.allocateLogicalAddress(type,
+ localDevices.add(localDevice);
+ }
+ allocateLogicalAddress(localDevices, initiatedBy);
+ }
+
+ @ServiceThreadOnly
+ private void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> allocatingDevices,
+ final int initiatedBy) {
+ assertRunOnServiceThread();
+ final ArrayList<HdmiCecLocalDevice> allocatedDevices = new ArrayList<>();
+ final int[] finished = new int[1];
+ for (final HdmiCecLocalDevice localDevice : allocatingDevices) {
+ mCecController.allocateLogicalAddress(localDevice.getType(),
localDevice.getPreferredAddress(), new AllocateAddressCallback() {
@Override
public void onAllocated(int deviceType, int logicalAddress) {
@@ -435,13 +447,17 @@ public final class HdmiControlService extends SystemService {
localDevice.setDeviceInfo(deviceInfo);
mCecController.addLocalDevice(deviceType, localDevice);
mCecController.addLogicalAddress(logicalAddress);
- devices.append(logicalAddress, localDevice);
+ allocatedDevices.add(localDevice);
}
// Address allocation completed for all devices. Notify each device.
- if (deviceTypes.size() == ++finished[0]) {
- onInitializeCecComplete();
- notifyAddressAllocated(devices, initiatedBy);
+ if (allocatingDevices.size() == ++finished[0]) {
+ if (initiatedBy != INITIATED_BY_HOTPLUG) {
+ // In case of the hotplug we don't call onInitializeCecComplete()
+ // since we reallocate the logical address only.
+ onInitializeCecComplete();
+ }
+ notifyAddressAllocated(allocatedDevices, initiatedBy);
}
}
});
@@ -449,11 +465,10 @@ public final class HdmiControlService extends SystemService {
}
@ServiceThreadOnly
- private void notifyAddressAllocated(SparseArray<HdmiCecLocalDevice> devices, int initiatedBy) {
+ private void notifyAddressAllocated(ArrayList<HdmiCecLocalDevice> devices, int initiatedBy) {
assertRunOnServiceThread();
- for (int i = 0; i < devices.size(); ++i) {
- int address = devices.keyAt(i);
- HdmiCecLocalDevice device = devices.valueAt(i);
+ for (HdmiCecLocalDevice device : devices) {
+ int address = device.getDeviceInfo().getLogicalAddress();
device.handleAddressAllocated(address, initiatedBy);
}
}
@@ -704,6 +719,22 @@ public final class HdmiControlService extends SystemService {
@ServiceThreadOnly
void onHotplug(int portId, boolean connected) {
assertRunOnServiceThread();
+
+ ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>();
+ for (int type : mLocalDevices) {
+ if (type == HdmiDeviceInfo.DEVICE_TV) {
+ // Skip the reallocation of the logical address on TV.
+ continue;
+ }
+ HdmiCecLocalDevice localDevice = mCecController.getLocalDevice(type);
+ if (localDevice == null) {
+ localDevice = HdmiCecLocalDevice.create(this, type);
+ localDevice.init();
+ }
+ localDevices.add(localDevice);
+ }
+ allocateLogicalAddress(localDevices, INITIATED_BY_HOTPLUG);
+
for (HdmiCecLocalDevice device : mCecController.getLocalDeviceList()) {
device.onHotplug(portId, connected);
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiLogger.java b/services/core/java/com/android/server/hdmi/HdmiLogger.java
index c7add75..cbd574e 100644
--- a/services/core/java/com/android/server/hdmi/HdmiLogger.java
+++ b/services/core/java/com/android/server/hdmi/HdmiLogger.java
@@ -31,7 +31,7 @@ final class HdmiLogger {
// Logging duration for same error message.
private static final long ERROR_LOG_DURATTION_MILLIS = 20 * 1000; // 20s
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = true;
// Key (String): log message.
// Value (Pair(Long, Integer)): a pair of last log time millis and the number of logMessage.