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

Commit b32f11ca authored by Aravind Angadi's avatar Aravind Angadi Committed by Yan Han
Browse files

CEC: Remove duplicate storage of logical address.

Remove HdmiCecLocalDevice#mAddress variable and replace
it with HdmiDeviceInfo#getLogicalAddress().

Bug: 159806029
Test: atest CtsHdmiCecHostTestCases
Test: atest FrameworksServicesTests:com.android.server.hdmi
Change-Id: I32a72b138e585dbc39f20e15915d3f4e8f8f5e7a
parent 0c9b9a1e
Loading
Loading
Loading
Loading
+31 −26
Original line number Diff line number Diff line
@@ -68,7 +68,6 @@ abstract class HdmiCecLocalDevice {

    protected final HdmiControlService mService;
    protected final int mDeviceType;
    protected int mAddress;
    protected int mPreferredAddress;
    @GuardedBy("mLock")
    protected HdmiDeviceInfo mDeviceInfo;
@@ -187,7 +186,6 @@ abstract class HdmiCecLocalDevice {
    protected HdmiCecLocalDevice(HdmiControlService service, int deviceType) {
        mService = service;
        mDeviceType = deviceType;
        mAddress = Constants.ADDR_UNREGISTERED;
        mLock = service.getServiceLock();
    }

@@ -254,7 +252,7 @@ abstract class HdmiCecLocalDevice {
    protected int dispatchMessage(HdmiCecMessage message) {
        assertRunOnServiceThread();
        int dest = message.getDestination();
        if (dest != mAddress && dest != Constants.ADDR_BROADCAST) {
        if (dest != mDeviceInfo.getLogicalAddress() && dest != Constants.ADDR_BROADCAST) {
            return Constants.NOT_HANDLED;
        }
        // Cache incoming message if it is included in the list of cacheable opcodes.
@@ -388,7 +386,7 @@ abstract class HdmiCecLocalDevice {
        } else {
            HdmiCecMessage cecMessage =
                    HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
                            mAddress, physicalAddress, mDeviceType);
                            mDeviceInfo.getLogicalAddress(), physicalAddress, mDeviceType);
            mService.sendCecCommand(cecMessage);
        }
        return Constants.HANDLED;
@@ -403,7 +401,8 @@ abstract class HdmiCecLocalDevice {
            mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNABLE_TO_DETERMINE);
        } else {
            HdmiCecMessage cecMessage =
                    HdmiCecMessageBuilder.buildDeviceVendorIdCommand(mAddress, vendorId);
                    HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
                            mDeviceInfo.getLogicalAddress(), vendorId);
            mService.sendCecCommand(cecMessage);
        }
        return Constants.HANDLED;
@@ -477,7 +476,7 @@ abstract class HdmiCecLocalDevice {
    protected void buildAndSendSetOsdName(int dest) {
        HdmiCecMessage cecMessage =
                HdmiCecMessageBuilder.buildSetOsdNameCommand(
                mAddress, dest, mDeviceInfo.getDisplayName());
                        mDeviceInfo.getLogicalAddress(), dest, mDeviceInfo.getDisplayName());
        if (cecMessage != null) {
            mService.sendCecCommand(cecMessage, new SendMessageCallback() {
                @Override
@@ -525,7 +524,8 @@ abstract class HdmiCecLocalDevice {
        if (cecDeviceInfo != null && cecDeviceInfo.getDisplayName().equals(
                HdmiUtils.getDefaultDeviceName(address))) {
            mService.sendCecCommand(
                    HdmiCecMessageBuilder.buildGiveOsdNameCommand(mAddress, address));
                    HdmiCecMessageBuilder.buildGiveOsdNameCommand(
                            mDeviceInfo.getLogicalAddress(), address));
        }

        return Constants.HANDLED;
@@ -630,8 +630,13 @@ abstract class HdmiCecLocalDevice {
        List<Integer> deviceFeatures = getDeviceFeatures();

        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildReportFeatures(mAddress, mService.getCecVersion(),
                        localDeviceTypes, rcProfile, rcFeatures, deviceFeatures));
                HdmiCecMessageBuilder.buildReportFeatures(
                        mDeviceInfo.getLogicalAddress(),
                        mService.getCecVersion(),
                        localDeviceTypes,
                        rcProfile,
                        rcFeatures,
                        deviceFeatures));
    }

    @ServiceThreadOnly
@@ -793,7 +798,9 @@ abstract class HdmiCecLocalDevice {
    protected int handleGiveDevicePowerStatus(HdmiCecMessage message) {
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildReportPowerStatus(
                        mAddress, message.getSource(), mService.getPowerStatus()));
                        mDeviceInfo.getLogicalAddress(),
                        message.getSource(),
                        mService.getPowerStatus()));
        return Constants.HANDLED;
    }

@@ -802,7 +809,9 @@ abstract class HdmiCecLocalDevice {
        // Always report menu active to receive Remote Control.
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildReportMenuStatus(
                        mAddress, message.getSource(), Constants.MENU_STATE_ACTIVATED));
                        mDeviceInfo.getLogicalAddress(),
                        message.getSource(),
                        Constants.MENU_STATE_ACTIVATED));
        return Constants.HANDLED;
    }

@@ -884,7 +893,7 @@ abstract class HdmiCecLocalDevice {
    @ServiceThreadOnly
    final void handleAddressAllocated(int logicalAddress, int reason) {
        assertRunOnServiceThread();
        mAddress = mPreferredAddress = logicalAddress;
        mPreferredAddress = logicalAddress;
        if (mService.getCecVersion() >= HdmiControlManager.HDMI_CEC_VERSION_2_0) {
            reportFeatures();
        }
@@ -914,14 +923,7 @@ abstract class HdmiCecLocalDevice {
    @ServiceThreadOnly
    boolean isAddressOf(int addr) {
        assertRunOnServiceThread();
        return addr == mAddress;
    }

    // Resets the logical address to unregistered(15), meaning the logical device is invalid.
    @ServiceThreadOnly
    void clearAddress() {
        assertRunOnServiceThread();
        mAddress = Constants.ADDR_UNREGISTERED;
        return addr == mDeviceInfo.getLogicalAddress();
    }

    @ServiceThreadOnly
@@ -1184,7 +1186,8 @@ abstract class HdmiCecLocalDevice {
        }
        List<SendKeyAction> action = getActions(SendKeyAction.class);
        int logicalAddress = findKeyReceiverAddress();
        if (logicalAddress == Constants.ADDR_INVALID || logicalAddress == mAddress) {
        if (logicalAddress == Constants.ADDR_INVALID
                || logicalAddress == mDeviceInfo.getLogicalAddress()) {
            // Don't send key event to invalid device or itself.
            Slog.w(
                    TAG,
@@ -1222,7 +1225,8 @@ abstract class HdmiCecLocalDevice {
        }
        List<SendKeyAction> action = getActions(SendKeyAction.class);
        int logicalAddress = findAudioReceiverAddress();
        if (logicalAddress == Constants.ADDR_INVALID || logicalAddress == mAddress) {
        if (logicalAddress == Constants.ADDR_INVALID
                || logicalAddress == mDeviceInfo.getLogicalAddress()) {
            // Don't send key event to invalid device or itself.
            Slog.w(
                TAG,
@@ -1276,9 +1280,11 @@ abstract class HdmiCecLocalDevice {

    void sendUserControlPressedAndReleased(int targetAddress, int cecKeycode) {
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildUserControlPressed(mAddress, targetAddress, cecKeycode));
                HdmiCecMessageBuilder.buildUserControlPressed(
                        mDeviceInfo.getLogicalAddress(), targetAddress, cecKeycode));
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildUserControlReleased(mAddress, targetAddress));
                HdmiCecMessageBuilder.buildUserControlReleased(
                        mDeviceInfo.getLogicalAddress(), targetAddress));
    }

    void addActiveSourceHistoryItem(ActiveSource activeSource, boolean isActiveSource,
@@ -1298,7 +1304,6 @@ abstract class HdmiCecLocalDevice {
    /** Dump internal status of HdmiCecLocalDevice object. */
    protected void dump(final IndentingPrintWriter pw) {
        pw.println("mDeviceType: " + mDeviceType);
        pw.println("mAddress: " + mAddress);
        pw.println("mPreferredAddress: " + mPreferredAddress);
        pw.println("mDeviceInfo: " + mDeviceInfo);
        pw.println("mActiveSource: " + getActiveSource());
+23 −12
Original line number Diff line number Diff line
@@ -254,9 +254,12 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
        }
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
                        mAddress, mService.getPhysicalAddress(), mDeviceType));
                        getDeviceInfo().getLogicalAddress(),
                        mService.getPhysicalAddress(),
                        mDeviceType));
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildDeviceVendorIdCommand(mAddress, mService.getVendorId()));
                HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
                        getDeviceInfo().getLogicalAddress(), mService.getVendorId()));
        mService.registerTvInputCallback(mTvInputCallback);
        // Some TVs, for example Mi TV, need ARC on before turning System Audio Mode on
        // to request Short Audio Descriptor. Since ARC and SAM are independent,
@@ -406,7 +409,9 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
        }
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildReportSystemAudioMode(
                        mAddress, message.getSource(), isSystemAudioModeOnOrTurningOn));
                        getDeviceInfo().getLogicalAddress(),
                        message.getSource(),
                        isSystemAudioModeOnOrTurningOn));
        return Constants.HANDLED;
    }

@@ -488,7 +493,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
        } else {
            mService.sendCecCommand(
                    HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                            mAddress, message.getSource(), sadBytes));
                            getDeviceInfo().getLogicalAddress(), message.getSource(), sadBytes));
            return Constants.HANDLED;
        }
    }
@@ -656,7 +661,9 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {

        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildSetSystemAudioMode(
                        mAddress, Constants.ADDR_BROADCAST, systemAudioStatusOn));
                        getDeviceInfo().getLogicalAddress(),
                        Constants.ADDR_BROADCAST,
                        systemAudioStatusOn));

        if (systemAudioStatusOn) {
            // If TV sends out SAM Request with a path of a non-CEC device, which should not show
@@ -754,7 +761,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {

        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildReportAudioStatus(
                        mAddress, source, scaledVolume, mute));
                        getDeviceInfo().getLogicalAddress(), source, scaledVolume, mute));
    }

    /**
@@ -908,7 +915,8 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
        setRoutingPort(portId);
        setLocalActivePort(portId);
        HdmiCecMessage routingChange =
                HdmiCecMessageBuilder.buildRoutingChange(mAddress, oldPath, newPath);
                HdmiCecMessageBuilder.buildRoutingChange(
                        getDeviceInfo().getLogicalAddress(), oldPath, newPath);
        mService.sendCecCommand(routingChange);
    }

@@ -933,7 +941,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
            // send <Set System Audio Mode> [“Off”]
            mService.sendCecCommand(
                    HdmiCecMessageBuilder.buildSetSystemAudioMode(
                            mAddress, Constants.ADDR_BROADCAST, false));
                            getDeviceInfo().getLogicalAddress(), Constants.ADDR_BROADCAST, false));
        }
    }

@@ -981,7 +989,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
            setSystemAudioMode(true);
            mService.sendCecCommand(
                HdmiCecMessageBuilder.buildSetSystemAudioMode(
                    mAddress, Constants.ADDR_BROADCAST, true));
                    getDeviceInfo().getLogicalAddress(), Constants.ADDR_BROADCAST, true));
            return Constants.HANDLED;
        }
        // Check if TV supports System Audio Control.
@@ -992,7 +1000,9 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
                    setSystemAudioMode(true);
                    mService.sendCecCommand(
                            HdmiCecMessageBuilder.buildSetSystemAudioMode(
                                    mAddress, Constants.ADDR_BROADCAST, true));
                                    getDeviceInfo().getLogicalAddress(),
                                    Constants.ADDR_BROADCAST,
                                    true));
                } else {
                    mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
                }
@@ -1150,8 +1160,9 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
            return;
        }
        // Otherwise will switch to the current active port and broadcast routing information.
        mService.sendCecCommand(HdmiCecMessageBuilder.buildRoutingInformation(
                mAddress, routingInformationPath));
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildRoutingInformation(
                        getDeviceInfo().getLogicalAddress(), routingInformationPath));
        routeToInputFromPortId(getRoutingPort());
    }

+28 −15
Original line number Diff line number Diff line
@@ -75,10 +75,14 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
                    getDeviceInfo().getDeviceType(), Constants.ADDR_BROADCAST,
                    "HdmiCecLocalDevicePlayback#onAddressAllocated()");
        }
        mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
                mAddress, mService.getPhysicalAddress(), mDeviceType));
        mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
                mAddress, mService.getVendorId()));
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
                        getDeviceInfo().getLogicalAddress(),
                        mService.getPhysicalAddress(),
                        mDeviceType));
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
                        getDeviceInfo().getLogicalAddress(), mService.getVendorId()));
        // Actively send out an OSD name to the TV to update the TV panel in case the TV
        // does not query the OSD name on time. This is not a required behavior by the spec.
        // It is used for some TVs that need the OSD name update but don't query it themselves.
@@ -87,8 +91,10 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
            // If current device is not a functional audio system device,
            // send message to potential audio system device in the system to get the system
            // audio mode status. If no response, set to false.
            mService.sendCecCommand(HdmiCecMessageBuilder.buildGiveSystemAudioModeStatus(
                    mAddress, Constants.ADDR_AUDIO_SYSTEM), new SendMessageCallback() {
            mService.sendCecCommand(
                    HdmiCecMessageBuilder.buildGiveSystemAudioModeStatus(
                            getDeviceInfo().getLogicalAddress(), Constants.ADDR_AUDIO_SYSTEM),
                    new SendMessageCallback() {
                        @Override
                        public void onSendCompleted(int error) {
                            if (error != SendMessageResult.SUCCESS) {
@@ -144,8 +150,9 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
            return;
        }
        if (initiatedByCec) {
            mService.sendCecCommand(HdmiCecMessageBuilder.buildInactiveSource(mAddress,
                            mService.getPhysicalAddress()));
            mService.sendCecCommand(
                    HdmiCecMessageBuilder.buildInactiveSource(
                            getDeviceInfo().getLogicalAddress(), mService.getPhysicalAddress()));
            return;
        }
        switch (standbyAction) {
@@ -157,23 +164,28 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
                switch (powerControlMode) {
                    case HdmiControlManager.POWER_CONTROL_MODE_TV:
                        mService.sendCecCommand(
                                HdmiCecMessageBuilder.buildStandby(mAddress, Constants.ADDR_TV));
                                HdmiCecMessageBuilder.buildStandby(
                                        getDeviceInfo().getLogicalAddress(), Constants.ADDR_TV));
                        break;
                    case HdmiControlManager.POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM:
                        mService.sendCecCommand(
                                HdmiCecMessageBuilder.buildStandby(mAddress, Constants.ADDR_TV));
                                HdmiCecMessageBuilder.buildStandby(
                                        getDeviceInfo().getLogicalAddress(), Constants.ADDR_TV));
                        mService.sendCecCommand(
                                HdmiCecMessageBuilder.buildStandby(mAddress,
                                HdmiCecMessageBuilder.buildStandby(
                                        getDeviceInfo().getLogicalAddress(),
                                        Constants.ADDR_AUDIO_SYSTEM));
                        break;
                    case HdmiControlManager.POWER_CONTROL_MODE_BROADCAST:
                        mService.sendCecCommand(
                                HdmiCecMessageBuilder.buildStandby(mAddress,
                                HdmiCecMessageBuilder.buildStandby(
                                        getDeviceInfo().getLogicalAddress(),
                                        Constants.ADDR_BROADCAST));
                        break;
                    case HdmiControlManager.POWER_CONTROL_MODE_NONE:
                        mService.sendCecCommand(
                                HdmiCecMessageBuilder.buildInactiveSource(mAddress,
                                HdmiCecMessageBuilder.buildInactiveSource(
                                        getDeviceInfo().getLogicalAddress(),
                                        mService.getPhysicalAddress()));
                        break;
                }
@@ -181,7 +193,8 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
            case HdmiControlService.STANDBY_SHUTDOWN:
                // ACTION_SHUTDOWN is taken as a signal to power off all the devices.
                mService.sendCecCommand(
                        HdmiCecMessageBuilder.buildStandby(mAddress, Constants.ADDR_BROADCAST));
                        HdmiCecMessageBuilder.buildStandby(
                                getDeviceInfo().getLogicalAddress(), Constants.ADDR_BROADCAST));
                break;
        }
    }
@@ -330,7 +343,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
    protected int handleSystemAudioModeStatus(HdmiCecMessage message) {
        // Only directly addressed System Audio Mode Status message can change internal
        // system audio mode status.
        if (message.getDestination() == mAddress
        if (message.getDestination() == getDeviceInfo().getLogicalAddress()
                && message.getSource() == Constants.ADDR_AUDIO_SYSTEM) {
            boolean setSystemAudioModeOn = HdmiUtils.parseCommandParamSystemAudioStatus(message);
            if (mService.isSystemAudioActivated() != setSystemAudioModeOn) {
+7 −3
Original line number Diff line number Diff line
@@ -111,13 +111,17 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
                HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE);
        if (powerControlMode.equals(HdmiControlManager.POWER_CONTROL_MODE_BROADCAST)) {
            mService.sendCecCommand(
                    HdmiCecMessageBuilder.buildStandby(mAddress, Constants.ADDR_BROADCAST));
                    HdmiCecMessageBuilder.buildStandby(
                            getDeviceInfo().getLogicalAddress(), Constants.ADDR_BROADCAST));
            return;
        }
        mService.sendCecCommand(HdmiCecMessageBuilder.buildStandby(mAddress, Constants.ADDR_TV));
        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildStandby(
                        getDeviceInfo().getLogicalAddress(), Constants.ADDR_TV));
        if (powerControlMode.equals(HdmiControlManager.POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM)) {
            mService.sendCecCommand(
                    HdmiCecMessageBuilder.buildStandby(mAddress, Constants.ADDR_AUDIO_SYSTEM));
                    HdmiCecMessageBuilder.buildStandby(
                            getDeviceInfo().getLogicalAddress(), Constants.ADDR_AUDIO_SYSTEM));
        }
    }

+49 −27

File changed.

Preview size limit exceeded, changes collapsed.

Loading