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

Commit 60cffce4 authored by Jungshik Jang's avatar Jungshik Jang
Browse files

Refine new device action.

There are many ways to initiate new device action
1. When receives <Report Physcial Address>
2. When receives <Active Source> from unregistered device.

If new device is audio system, it should start
ARC and system audio initiation action.

Along with this consolidate device remove actions.

Change-Id: I189afd8bec7270d6a1734a28632593b71932d9e8
parent 401e3de7
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -67,7 +67,10 @@ final class ActiveSourceHandler {
        }
        HdmiCecDeviceInfo device = mService.getDeviceInfo(deviceLogicalAddress);
        if (device == null) {
            // TODO: Start new device action (Device Discovery) sequence 5.
            // "New device action" initiated by <Active Source> does not require
            // "Routing change action".
            mService.addAndStartAction(new NewDeviceAction(mService, mSourceAddress,
                    deviceLogicalAddress, routingPath, false));
        }

        if (!mService.isInPresetInstallationMode()) {
+1 −4
Original line number Diff line number Diff line
@@ -55,9 +55,6 @@ final class DeviceDiscoveryAction extends FeatureAction {

    private static final int DEVICE_POLLING_RETRY = 1;

    // TODO: Move this to common place
    private static final int INVALID_PHYSICAL_ADDRESS = 0xFFFF;

    /**
     * Interface used to report result of device discovery.
     */
@@ -75,7 +72,7 @@ final class DeviceDiscoveryAction extends FeatureAction {
    private static final class DeviceInfo {
        private final int mLogicalAddress;

        private int mPhysicalAddress = INVALID_PHYSICAL_ADDRESS;
        private int mPhysicalAddress = HdmiConstants.INVALID_PHYSICAL_ADDRESS;
        private int mVendorId = HdmiCec.UNKNOWN_VENDOR_ID;
        private String mDisplayName = "";
        private int mDeviceType = HdmiCec.DEVICE_INACTIVE;
+4 −0
Original line number Diff line number Diff line
@@ -220,4 +220,8 @@ final class DeviceSelectAction extends FeatureAction {
            Slog.e(TAG, "Callback failed:" + e);
        }
    }

    int getTargetAddress() {
        return mTarget.getLogicalAddress();
    }
}
+7 −1
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ abstract class HdmiCecLocalDevice {
        return onMessage(message);
    }

    protected boolean onMessage(HdmiCecMessage message) {
    protected final boolean onMessage(HdmiCecMessage message) {
        switch (message.getOpcode()) {
            case HdmiCec.MESSAGE_GET_MENU_LANGUAGE:
                return handleGetMenuLanguage(message);
@@ -88,6 +88,8 @@ abstract class HdmiCecLocalDevice {
                return handleGiveDeviceVendorId();
            case HdmiCec.MESSAGE_GET_CEC_VERSION:
                return handleGetCecVersion(message);
            case HdmiCec.MESSAGE_REPORT_PHYSICAL_ADDRESS:
                return handleReportPhysicalAddress(message);
            default:
                return false;
        }
@@ -143,6 +145,10 @@ abstract class HdmiCecLocalDevice {
        return false;
    }

    protected boolean handleReportPhysicalAddress(HdmiCecMessage message) {
        return false;
    }

    final void handleAddressAllocated(int logicalAddress) {
        mAddress = mPreferredAddress = logicalAddress;
        onAddressAllocated(logicalAddress);
+39 −15
Original line number Diff line number Diff line
@@ -16,13 +16,15 @@

package com.android.server.hdmi;

import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.hdmi.HdmiCec;
import android.hardware.hdmi.HdmiCecDeviceInfo;
import android.hardware.hdmi.HdmiCecMessage;
import android.hardware.hdmi.IHdmiControlCallback;
import android.os.RemoteException;
import android.util.Slog;

import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback;

import java.util.Collections;
import java.util.List;
import java.util.Locale;
@@ -46,20 +48,10 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
        mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
                mAddress, mService.getVendorId()));

        mService.launchDeviceDiscovery(mAddress);
        launchDeviceDiscovery();
        // TODO: Start routing control action, device discovery action.
    }

    @Override
    protected boolean onMessage(HdmiCecMessage message) {
        switch (message.getOpcode()) {
            case HdmiCec.MESSAGE_REPORT_PHYSICAL_ADDRESS:
                return handleReportPhysicalAddress(message);
            default:
                return super.onMessage(message);
        }
    }

    /**
     * Performs the action 'device select', or 'one touch play' initiated by TV.
     *
@@ -98,7 +90,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
        return true;
    }

    private boolean handleReportPhysicalAddress(HdmiCecMessage message) {
    @Override
    protected boolean handleReportPhysicalAddress(HdmiCecMessage message) {
        // Ignore if [Device Discovery Action] is going on.
        if (mService.hasAction(DeviceDiscoveryAction.class)) {
            Slog.i(TAG, "Ignore unrecognizable <Report Physical Address> "
@@ -107,9 +100,15 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
        }

        int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
        mService.addAndStartAction(new NewDeviceAction(mService,
                mAddress, message.getSource(), physicalAddress));
        int logicalAddress = message.getSource();

        // If it is a new device and connected to the tail of active path,
        // it's required to change routing path.
        boolean requireRoutingChange = !mService.isInDeviceList(physicalAddress, logicalAddress)
                && mService.isTailOfActivePath(physicalAddress);
        mService.addAndStartAction(new NewDeviceAction(mService,
                mAddress, message.getSource(), physicalAddress,
                requireRoutingChange));
        return true;
    }

@@ -137,4 +136,29 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
                HdmiConstants.ABORT_REFUSED));
        return true;
    }

    private void launchDeviceDiscovery() {
        mService.clearAllDeviceInfo();
        // TODO: Move the following callback to HdmiLocalDeviceTv.
        DeviceDiscoveryAction action = new DeviceDiscoveryAction(mService, mAddress,
                new DeviceDiscoveryCallback() {
                    @Override
                    public void onDeviceDiscoveryDone(List<HdmiCecDeviceInfo> deviceInfos) {
                        for (HdmiCecDeviceInfo info : deviceInfos) {
                            mService.addCecDevice(info);
                        }

                        // Since we removed all devices when it's start and
                        // device discovery action does not poll local devices,
                        // we should put device info of local device manually here
                        for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) {
                            mService.addCecDevice(device.getDeviceInfo());
                        }

                        mService.addAndStartAction(new HotplugDetectionAction(mService,
                                mAddress));
                    }
                });
        mService.addAndStartAction(action);
    }
}
Loading