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

Commit 30c74d9b authored by Jinsuk Kim's avatar Jinsuk Kim
Browse files

CEC: Make port info unmodifiable

Puts HDMI port information behind unmodifiable type. This helps API make use
of port-related information without having to switch to service thread.
See getActiveSource().

Added the unmodifiable version of SparseArray/SparseIntArray.

Change-Id: Idcf05d1d6e19b47c91a7e89a920abccc607a3eb5
parent 58500f43
Loading
Loading
Loading
Loading
+8 −14
Original line number Diff line number Diff line
@@ -207,10 +207,10 @@ public final class HdmiControlService extends SystemService {
    private List<HdmiPortInfo> mPortInfo;

    // Map from path(physical address) to port ID.
    private final SparseIntArray mPortIdMap = new SparseIntArray();
    private UnmodifiableSparseIntArray mPortIdMap;

    // Map from port ID to HdmiPortInfo.
    private final SparseArray<HdmiPortInfo> mPortInfoMap = new SparseArray<>();
    private UnmodifiableSparseArray<HdmiPortInfo> mPortInfoMap;

    private HdmiCecMessageValidator mMessageValidator;

@@ -360,10 +360,14 @@ public final class HdmiControlService extends SystemService {
            return;
        }

        SparseArray<HdmiPortInfo> portInfoMap = new SparseArray<>();
        SparseIntArray portIdMap = new SparseIntArray();
        for (HdmiPortInfo info : cecPortInfo) {
            mPortIdMap.put(info.getAddress(), info.getId());
            mPortInfoMap.put(info.getId(), info);
            portIdMap.put(info.getAddress(), info.getId());
            portInfoMap.put(info.getId(), info);
        }
        mPortIdMap = new UnmodifiableSparseIntArray(portIdMap);
        mPortInfoMap = new UnmodifiableSparseArray<>(portInfoMap);

        if (mMhlController == null) {
            mPortInfo = Collections.unmodifiableList(Arrays.asList(cecPortInfo));
@@ -397,9 +401,7 @@ public final class HdmiControlService extends SystemService {
     * @param portId HDMI port id
     * @return {@link HdmiPortInfo} for the given port
     */
    @ServiceThreadOnly
    HdmiPortInfo getPortInfo(int portId) {
        assertRunOnServiceThread();
        return mPortInfoMap.get(portId, null);
    }

@@ -407,9 +409,7 @@ public final class HdmiControlService extends SystemService {
     * Returns the routing path (physical address) of the HDMI port for the given
     * port id.
     */
    @ServiceThreadOnly
    int portIdToPath(int portId) {
        assertRunOnServiceThread();
        HdmiPortInfo portInfo = getPortInfo(portId);
        if (portInfo == null) {
            Slog.e(TAG, "Cannot find the port info: " + portId);
@@ -424,16 +424,12 @@ public final class HdmiControlService extends SystemService {
     * the port id to be returned is the ID associated with the port address
     * 0x1000 (1.0.0.0) which is the topmost path of the given routing path.
     */
    @ServiceThreadOnly
    int pathToPortId(int path) {
        assertRunOnServiceThread();
        int portAddress = path & Constants.ROUTING_PATH_TOP_MASK;
        return mPortIdMap.get(portAddress, Constants.INVALID_PORT_ID);
    }

    @ServiceThreadOnly
    boolean isValidPortId(int portId) {
        assertRunOnServiceThread();
        return getPortInfo(portId) != null;
    }

@@ -490,9 +486,7 @@ public final class HdmiControlService extends SystemService {
    /**
     * Whether a device of the specified physical address is connected to ARC enabled port.
     */
    @ServiceThreadOnly
    boolean isConnectedToArcPort(int physicalAddress) {
        assertRunOnServiceThread();
        int portId = mPortIdMap.get(physicalAddress);
        if (portId != Constants.INVALID_PORT_ID) {
            return mPortInfoMap.get(portId).isArcSupported();
+62 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.hdmi;

import android.util.SparseArray;

/**
 * Unmodifiable version of {@link SparseArray}.
 */
final class UnmodifiableSparseArray<E> {
    private static final String TAG = "ImmutableSparseArray";

    private final SparseArray<E> mArray;

    public UnmodifiableSparseArray(SparseArray<E> array) {
       mArray = array;
    }

    public int size() {
        return mArray.size();
    }

    public E get(int key) {
        return mArray.get(key);
    }

    public E get(int key, E valueIfKeyNotFound) {
        return mArray.get(key, valueIfKeyNotFound);
    }

    public int keyAt(int index) {
        return mArray.keyAt(index);
    }

    public E valueAt(int index) {
        return mArray.valueAt(index);
    }

    public int indexOfValue(E value) {
        return mArray.indexOfValue(value);
    }

    @Override
    public String toString() {
        return mArray.toString();
    }
}
+61 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.hdmi;

import android.util.SparseIntArray;

/**
 * Unmodifiable version of {@link SparseIntArray}.
 */
final class UnmodifiableSparseIntArray {
    private static final String TAG = "ImmutableSparseIntArray";

    private final SparseIntArray mArray;

    public UnmodifiableSparseIntArray(SparseIntArray array) {
        mArray = array;
    }

    public int size() {
        return mArray.size();
    }

    public int get(int key) {
        return mArray.get(key);
    }

    public int get(int key, int valueIfKeyNotFound) {
        return mArray.get(key, valueIfKeyNotFound);
    }

    public int keyAt(int index) {
        return mArray.keyAt(index);
    }

    public int valueAt(int index) {
        return mArray.valueAt(index);
    }

    public int indexOfValue(int value) {
        return mArray.indexOfValue(value);
    }

    @Override
    public String toString() {
        return mArray.toString();
    }
}