summaryrefslogtreecommitdiffstats
path: root/services/core/java/com/android
diff options
context:
space:
mode:
authorJinsuk Kim <jinsukkim@google.com>2014-05-15 16:51:49 +0900
committerJinsuk Kim <jinsukkim@google.com>2014-05-15 17:19:36 +0900
commita8a5e50c6f9ba3ae0ff59eda76354e93515d6f8f (patch)
tree7aefcd162a9882af9dd39ce73859bc473b5b48fd /services/core/java/com/android
parentfc2cf830b040fe2e1ab54d7ca2921b3e7bd32220 (diff)
downloadframeworks_base-a8a5e50c6f9ba3ae0ff59eda76354e93515d6f8f.zip
frameworks_base-a8a5e50c6f9ba3ae0ff59eda76354e93515d6f8f.tar.gz
frameworks_base-a8a5e50c6f9ba3ae0ff59eda76354e93515d6f8f.tar.bz2
Initialize internal CEC logical devices
Allocates logical address of internal HDMI-CEC logical device(s) using the resource config_hdmiCecLogicalDeviceType. Change-Id: I1a0d2f7bce36fc643887241f03161dc053d6c25c
Diffstat (limited to 'services/core/java/com/android')
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecController.java50
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java5
2 files changed, 49 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java
index 5327ef4..986cb9b 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecController.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java
@@ -24,6 +24,7 @@ import android.os.Looper;
import android.os.Message;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.SparseIntArray;
import libcore.util.EmptyArray;
@@ -79,11 +80,12 @@ final class HdmiCecController {
new SparseArray<HdmiCecDeviceInfo>();
// Set-like container for all local devices' logical address.
// Key and value are same.
- private final SparseArray<Integer> mLocalLogicalAddresses =
- new SparseArray<Integer>();
+ private final SparseIntArray mLocalAddresses = new SparseIntArray();
// Private constructor. Use HdmiCecController.create().
private HdmiCecController() {
+ // TODO: Consider restoring the local device addresses from persistent storage
+ // to allocate the same addresses again if possible.
}
/**
@@ -109,6 +111,44 @@ final class HdmiCecController {
}
/**
+ * Initialize {@link #mLocalAddresses} by allocating logical addresses for each hosted type.
+ *
+ * @param deviceTypes local device types
+ */
+ void initializeLocalDevices(int[] deviceTypes) {
+ for (int deviceType : deviceTypes) {
+ int preferred = getPreferredAddress(deviceType);
+ allocateLogicalAddress(deviceType, preferred, new AllocateLogicalAddressCallback() {
+ @Override
+ public void onAllocated(int deviceType, int logicalAddress) {
+ addLogicalAddress(logicalAddress);
+ }
+ });
+ }
+ }
+
+ /**
+ * Get the preferred address for a given type.
+ *
+ * @param deviceType logical device type to get the address for
+ * @return preferred address; {@link HdmiCec#ADDR_UNREGISTERED} if not available.
+ */
+ private int getPreferredAddress(int deviceType) {
+ // Uses the data restored from persistent memory at boot up if they are available.
+ // Otherwise we return UNREGISTERED indicating there is no preferred address.
+ // Note that for address SPECIFIC_USE(14), HdmiCec.getTypeFromAddress() returns DEVICE_TV,
+ // meaning that we do not support device type video processor yet.
+ for (int i = 0; i < mLocalAddresses.size(); ++i) {
+ int address = mLocalAddresses.keyAt(i);
+ int type = HdmiCec.getTypeFromAddress(address);
+ if (type == deviceType) {
+ return address;
+ }
+ }
+ return HdmiCec.ADDR_UNREGISTERED;
+ }
+
+ /**
* Interface to report allocated logical address.
*/
interface AllocateLogicalAddressCallback {
@@ -322,7 +362,7 @@ final class HdmiCecController {
*/
int addLogicalAddress(int newLogicalAddress) {
if (HdmiCec.isValidAddress(newLogicalAddress)) {
- mLocalLogicalAddresses.append(newLogicalAddress, newLogicalAddress);
+ mLocalAddresses.put(newLogicalAddress, newLogicalAddress);
return nativeAddLogicalAddress(mNativePtr, newLogicalAddress);
} else {
return -1;
@@ -337,7 +377,7 @@ final class HdmiCecController {
void clearLogicalAddress() {
// TODO: consider to backup logical address so that new logical address
// allocation can use it as preferred address.
- mLocalLogicalAddresses.clear();
+ mLocalAddresses.clear();
nativeClearLogicalAddress(mNativePtr);
}
@@ -382,7 +422,7 @@ final class HdmiCecController {
// Can access command targeting devices available in local device or
// broadcast command.
return address == HdmiCec.ADDR_BROADCAST
- || mLocalLogicalAddresses.get(address) != null;
+ || mLocalAddresses.indexOfKey(address) < 0;
}
private void onReceiveCommand(HdmiCecMessage message) {
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index c122645..25c221b 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -54,7 +54,10 @@ public final class HdmiControlService extends SystemService {
@Override
public void onStart() {
mCecController = HdmiCecController.create(this);
- if (mCecController == null) {
+ if (mCecController != null) {
+ mCecController.initializeLocalDevices(getContext().getResources()
+ .getIntArray(com.android.internal.R.array.config_hdmiCecLogicalDeviceType));
+ } else {
Slog.i(TAG, "Device does not support HDMI-CEC.");
}