Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b0b0391 authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Android (Google) Code Review
Browse files

Merge "Initialize internal CEC logical devices"

parents fc9c89f9 a8a5e50c
Loading
Loading
Loading
Loading
+45 −5
Original line number Diff line number Diff line
@@ -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.
    }

    /**
@@ -108,6 +110,44 @@ final class HdmiCecController {
        return handler;
    }

    /**
     * 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.
     */
@@ -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) {
+4 −1
Original line number Diff line number Diff line
@@ -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.");
        }