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

Commit a4669299 authored by Jungshik Jang's avatar Jungshik Jang
Browse files

Use cached message in NewDeviceAction.

Vendor id and osd name can be cached in be reused
later.
Along with this, fix a bug on HotplugDetectionAction.

Change-Id: I0583a9c266eed4281a99a59b1301f41b3e155505
parent 65c64c31
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -360,15 +360,6 @@ public final class HdmiControlService extends SystemService {
        mCecController.sendCommand(command, null);
    }

    /**
     * Add a new {@link HdmiCecDeviceInfo} to controller.
     *
     * @param deviceInfo new device information object to add
     */
    void addDeviceInfo(HdmiCecDeviceInfo deviceInfo) {
        // TODO: Implement this.
    }

    boolean handleCecCommand(HdmiCecMessage message) {
        // Cache incoming message. Note that it caches only white-listed one.
        mCecMessageCache.cacheMessage(message);
@@ -463,12 +454,12 @@ public final class HdmiControlService extends SystemService {
                    @Override
                    public void onDeviceDiscoveryDone(List<HdmiCecDeviceInfo> deviceInfos) {
                        for (HdmiCecDeviceInfo info : deviceInfos) {
                            mCecController.addDeviceInfo(info);
                            addCecDevice(info);
                        }

                        // Add device info of all local devices.
                        for (HdmiCecLocalDevice device : mCecController.getLocalDeviceList()) {
                            mCecController.addDeviceInfo(device.getDeviceInfo());
                            addCecDevice(device.getDeviceInfo());
                        }

                        addAndStartAction(new HotplugDetectionAction(HdmiControlService.this,
+1 −1
Original line number Diff line number Diff line
@@ -122,7 +122,7 @@ final class HotplugDetectionAction extends FeatureAction {
        mService.pollDevices(new DevicePollingCallback() {
            @Override
            public void onPollingFinished(List<Integer> ackedAddress) {
                checkHotplug(ackedAddress, false);
                checkHotplug(ackedAddress, true);
            }
        }, HdmiControlService.POLL_ITERATION_IN_ORDER
                | HdmiControlService.POLL_STRATEGY_SYSTEM_AUDIO, POLL_RETRY_COUNT);
+25 −11
Original line number Diff line number Diff line
@@ -70,10 +70,13 @@ final class NewDeviceAction extends FeatureAction {

    @Override
    public boolean start() {
        sendCommand(
                HdmiCecMessageBuilder.buildGiveOsdNameCommand(mSourceAddress,
                        mDeviceLogicalAddress));
        mState = STATE_WAITING_FOR_SET_OSD_NAME;
        if (mayProcessCommandIfCached(mDeviceLogicalAddress, HdmiCec.MESSAGE_SET_OSD_NAME)) {
            return true;
        }

        sendCommand(HdmiCecMessageBuilder.buildGiveOsdNameCommand(mSourceAddress,
                mDeviceLogicalAddress));
        addTimer(mState, TIMEOUT_MS);
        return true;
    }
@@ -99,13 +102,11 @@ final class NewDeviceAction extends FeatureAction {
                } catch (UnsupportedEncodingException e) {
                    Slog.e(TAG, "Failed to get OSD name: " + e.getMessage());
                }
                mState = STATE_WAITING_FOR_DEVICE_VENDOR_ID;
                requestVendorId();
                return true;
            } else if (opcode == HdmiCec.MESSAGE_FEATURE_ABORT) {
                int requestOpcode = params[1] & 0xff;
                int requestOpcode = params[1] & 0xFF;
                if (requestOpcode == HdmiCec.MESSAGE_SET_OSD_NAME) {
                    mState = STATE_WAITING_FOR_DEVICE_VENDOR_ID;
                    requestVendorId();
                    return true;
                }
@@ -113,8 +114,8 @@ final class NewDeviceAction extends FeatureAction {
        } else if (mState == STATE_WAITING_FOR_DEVICE_VENDOR_ID) {
            if (opcode == HdmiCec.MESSAGE_DEVICE_VENDOR_ID) {
                if (params.length == 3) {
                    mVendorId = ((params[0] & 0xff) << 16) + ((params[1] & 0xff) << 8)
                        + (params[2] & 0xff);
                    mVendorId = ((params[0] & 0xFF) << 16) + ((params[1] & 0xFF) << 8)
                        + (params[2] & 0xFF);
                } else {
                    Slog.e(TAG, "Failed to get device vendor ID: ");
                }
@@ -122,7 +123,7 @@ final class NewDeviceAction extends FeatureAction {
                finish();
                return true;
            } else if (opcode == HdmiCec.MESSAGE_FEATURE_ABORT) {
                int requestOpcode = params[1] & 0xff;
                int requestOpcode = params[1] & 0xFF;
                if (requestOpcode == HdmiCec.MESSAGE_DEVICE_VENDOR_ID) {
                    addDeviceInfo();
                    finish();
@@ -133,7 +134,21 @@ final class NewDeviceAction extends FeatureAction {
        return false;
    }

    private boolean mayProcessCommandIfCached(int destAddress, int opcode) {
        HdmiCecMessage message = mService.getCecMessageCache().getMessage(destAddress, opcode);
        if (message != null) {
            return processCommand(message);
        }
        return false;
    }

    private void requestVendorId() {
        // At first, transit to waiting status for <Device Vendor Id>.
        mState = STATE_WAITING_FOR_DEVICE_VENDOR_ID;
        // If the message is already in cache, process it.
        if (mayProcessCommandIfCached(mDeviceLogicalAddress, HdmiCec.MESSAGE_DEVICE_VENDOR_ID)) {
            return;
        }
        sendCommand(HdmiCecMessageBuilder.buildGiveDeviceVendorIdCommand(mSourceAddress,
                mDeviceLogicalAddress));
        addTimer(mState, TIMEOUT_MS);
@@ -143,7 +158,7 @@ final class NewDeviceAction extends FeatureAction {
        if (mDisplayName == null) {
            mDisplayName = HdmiCec.getDefaultDeviceName(mDeviceLogicalAddress);
        }
        mService.addDeviceInfo(new HdmiCecDeviceInfo(
        mService.addCecDevice(new HdmiCecDeviceInfo(
                mDeviceLogicalAddress, mDevicePhysicalAddress,
                HdmiCec.getTypeFromAddress(mDeviceLogicalAddress),
                mVendorId, mDisplayName));
@@ -156,7 +171,6 @@ final class NewDeviceAction extends FeatureAction {
        }
        if (state == STATE_WAITING_FOR_SET_OSD_NAME) {
            // Osd name request timed out. Try vendor id
            mState = STATE_WAITING_FOR_DEVICE_VENDOR_ID;
            requestVendorId();
        } else if (state == STATE_WAITING_FOR_DEVICE_VENDOR_ID) {
            // vendor id timed out. Go ahead creating the device info what we've got so far.