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

Commit 913a71d6 authored by Nathalie Le Clair's avatar Nathalie Le Clair
Browse files

Revert "CEC: Remove HdmiControlManager#mLocalPhysicalAddress variable"

This reverts commit 9f5ec0c7.

Reason for revert: this CL removed getPhysicalAddress from the main service thread, which caused errors.

Change-Id: I42c478831c4daa5d17e55f7f8edd253449b863b8
parent 9f5ec0c7
Loading
Loading
Loading
Loading
+62 −7
Original line number Diff line number Diff line
@@ -36,10 +36,12 @@ import android.sysprop.HdmiProperties;
import android.util.ArrayMap;
import android.util.Log;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ConcurrentUtils;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -68,6 +70,32 @@ public final class HdmiControlManager {

    private static final int INVALID_PHYSICAL_ADDRESS = 0xFFFF;

    /**
     * A cache of the current device's physical address. When device's HDMI out port
     * is not connected to any device, it is set to {@link #INVALID_PHYSICAL_ADDRESS}.
     *
     * <p>Otherwise it is updated by the {@link ClientHotplugEventListener} registered
     * with {@link com.android.server.hdmi.HdmiControlService} by the
     * {@link #addHotplugEventListener(HotplugEventListener)} and the address is from
     * {@link com.android.server.hdmi.HdmiControlService#getPortInfo()}
     */
    @GuardedBy("mLock")
    private int mLocalPhysicalAddress = INVALID_PHYSICAL_ADDRESS;

    private void setLocalPhysicalAddress(int physicalAddress) {
        synchronized (mLock) {
            mLocalPhysicalAddress = physicalAddress;
        }
    }

    private int getLocalPhysicalAddress() {
        synchronized (mLock) {
            return mLocalPhysicalAddress;
        }
    }

    private final Object mLock = new Object();

    /**
     * Broadcast Action: Display OSD message.
     * <p>Send when the service has a message to display on screen for events
@@ -944,6 +972,37 @@ public final class HdmiControlManager {
        mHasAudioSystemDevice = hasDeviceType(types, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
        mHasSwitchDevice = hasDeviceType(types, HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH);
        mIsSwitchDevice = HdmiProperties.is_switch().orElse(false);
        addHotplugEventListener(new ClientHotplugEventListener());
    }

    private final class ClientHotplugEventListener implements HotplugEventListener {

        @Override
        public void onReceived(HdmiHotplugEvent event) {
            List<HdmiPortInfo> ports = new ArrayList<>();
            try {
                ports = mService.getPortInfo();
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
            if (ports.isEmpty()) {
                Log.e(TAG, "Can't find port info, not updating connected status. "
                        + "Hotplug event:" + event);
                return;
            }
            // If the HDMI OUT port is plugged or unplugged, update the mLocalPhysicalAddress
            for (HdmiPortInfo port : ports) {
                if (port.getId() == event.getPort()) {
                    if (port.getType() == HdmiPortInfo.PORT_OUTPUT) {
                        setLocalPhysicalAddress(
                                event.isConnected()
                                        ? port.getAddress()
                                        : INVALID_PHYSICAL_ADDRESS);
                    }
                    break;
                }
            }
        }
    }

    private static boolean hasDeviceType(int[] types, int type) {
@@ -1345,11 +1404,7 @@ public final class HdmiControlManager {
     */
    @SystemApi
    public int getPhysicalAddress() {
        try {
            return mService.getPhysicalAddress();
        } catch (RemoteException e) {
            return INVALID_PHYSICAL_ADDRESS;
        }
        return getLocalPhysicalAddress();
    }

    /**
@@ -1366,7 +1421,7 @@ public final class HdmiControlManager {
    @SystemApi
    public boolean isDeviceConnected(@NonNull HdmiDeviceInfo targetDevice) {
        Objects.requireNonNull(targetDevice);
        int physicalAddress = getPhysicalAddress();
        int physicalAddress = getLocalPhysicalAddress();
        if (physicalAddress == INVALID_PHYSICAL_ADDRESS) {
            return false;
        }
@@ -1387,7 +1442,7 @@ public final class HdmiControlManager {
    @SystemApi
    public boolean isRemoteDeviceConnected(@NonNull HdmiDeviceInfo targetDevice) {
        Objects.requireNonNull(targetDevice);
        int physicalAddress = getPhysicalAddress();
        int physicalAddress = getLocalPhysicalAddress();
        if (physicalAddress == INVALID_PHYSICAL_ADDRESS) {
            return false;
        }