Search in sources :

Example 26 with HdmiDeviceInfo

use of android.hardware.hdmi.HdmiDeviceInfo in project android_frameworks_base by ResurrectionRemix.

the class HdmiControlService method changeInputForMhl.

/**
     * Performs input change, routing control for MHL device.
     *
     * @param portId MHL port, or the last port to go back to if {@code contentOn} is false
     * @param contentOn {@code true} if RAP data is content on; otherwise false
     */
@ServiceThreadOnly
void changeInputForMhl(int portId, boolean contentOn) {
    assertRunOnServiceThread();
    if (tv() == null)
        return;
    final int lastInput = contentOn ? tv().getActivePortId() : Constants.INVALID_PORT_ID;
    if (portId != Constants.INVALID_PORT_ID) {
        tv().doManualPortSwitching(portId, new IHdmiControlCallback.Stub() {

            @Override
            public void onComplete(int result) throws RemoteException {
                // Keep the last input to switch back later when RAP[ContentOff] is received.
                // This effectively sets the port to invalid one if the switching is for
                // RAP[ContentOff].
                setLastInputForMhl(lastInput);
            }
        });
    }
    // MHL device is always directly connected to the port. Update the active port ID to avoid
    // unnecessary post-routing control task.
    tv().setActivePortId(portId);
    // The port is either the MHL-enabled port where the mobile device is connected, or
    // the last port to go back to when turnoff command is received. Note that the last port
    // may not be the MHL-enabled one. In this case the device info to be passed to
    // input change listener should be the one describing the corresponding HDMI port.
    HdmiMhlLocalDeviceStub device = mMhlController.getLocalDevice(portId);
    HdmiDeviceInfo info = (device != null) ? device.getInfo() : mPortDeviceMap.get(portId, HdmiDeviceInfo.INACTIVE_DEVICE);
    invokeInputChangeListener(info);
}
Also used : HdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo) IHdmiControlCallback(android.hardware.hdmi.IHdmiControlCallback) RemoteException(android.os.RemoteException) ServiceThreadOnly(com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly)

Example 27 with HdmiDeviceInfo

use of android.hardware.hdmi.HdmiDeviceInfo in project android_frameworks_base by ResurrectionRemix.

the class HdmiControlService method initPortInfo.

// Initialize HDMI port information. Combine the information from CEC and MHL HAL and
// keep them in one place.
@ServiceThreadOnly
private void initPortInfo() {
    assertRunOnServiceThread();
    HdmiPortInfo[] cecPortInfo = null;
    // each port. Return empty array if CEC HAL didn't provide the info.
    if (mCecController != null) {
        cecPortInfo = mCecController.getPortInfos();
    }
    if (cecPortInfo == null) {
        return;
    }
    SparseArray<HdmiPortInfo> portInfoMap = new SparseArray<>();
    SparseIntArray portIdMap = new SparseIntArray();
    SparseArray<HdmiDeviceInfo> portDeviceMap = new SparseArray<>();
    for (HdmiPortInfo info : cecPortInfo) {
        portIdMap.put(info.getAddress(), info.getId());
        portInfoMap.put(info.getId(), info);
        portDeviceMap.put(info.getId(), new HdmiDeviceInfo(info.getAddress(), info.getId()));
    }
    mPortIdMap = new UnmodifiableSparseIntArray(portIdMap);
    mPortInfoMap = new UnmodifiableSparseArray<>(portInfoMap);
    mPortDeviceMap = new UnmodifiableSparseArray<>(portDeviceMap);
    HdmiPortInfo[] mhlPortInfo = mMhlController.getPortInfos();
    ArraySet<Integer> mhlSupportedPorts = new ArraySet<Integer>(mhlPortInfo.length);
    for (HdmiPortInfo info : mhlPortInfo) {
        if (info.isMhlSupported()) {
            mhlSupportedPorts.add(info.getId());
        }
    }
    // cec port info if we do not have have port that supports MHL.
    if (mhlSupportedPorts.isEmpty()) {
        mPortInfo = Collections.unmodifiableList(Arrays.asList(cecPortInfo));
        return;
    }
    ArrayList<HdmiPortInfo> result = new ArrayList<>(cecPortInfo.length);
    for (HdmiPortInfo info : cecPortInfo) {
        if (mhlSupportedPorts.contains(info.getId())) {
            result.add(new HdmiPortInfo(info.getId(), info.getType(), info.getAddress(), info.isCecSupported(), true, info.isArcSupported()));
        } else {
            result.add(info);
        }
    }
    mPortInfo = Collections.unmodifiableList(result);
}
Also used : HdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo) ArraySet(android.util.ArraySet) HdmiPortInfo(android.hardware.hdmi.HdmiPortInfo) ArrayList(java.util.ArrayList) SparseArray(android.util.SparseArray) SparseIntArray(android.util.SparseIntArray) ServiceThreadOnly(com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly)

Example 28 with HdmiDeviceInfo

use of android.hardware.hdmi.HdmiDeviceInfo in project android_frameworks_base by ResurrectionRemix.

the class HdmiCecLocalDeviceTv method deviceSelect.

/**
     * Performs the action 'device select', or 'one touch play' initiated by TV.
     *
     * @param id id of HDMI device to select
     * @param callback callback object to report the result with
     */
@ServiceThreadOnly
void deviceSelect(int id, IHdmiControlCallback callback) {
    assertRunOnServiceThread();
    HdmiDeviceInfo targetDevice = mDeviceInfos.get(id);
    if (targetDevice == null) {
        invokeCallback(callback, HdmiControlManager.RESULT_TARGET_NOT_AVAILABLE);
        return;
    }
    int targetAddress = targetDevice.getLogicalAddress();
    ActiveSource active = getActiveSource();
    if (targetDevice.getDevicePowerStatus() == HdmiControlManager.POWER_STATUS_ON && active.isValid() && targetAddress == active.logicalAddress) {
        invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS);
        return;
    }
    if (targetAddress == Constants.ADDR_INTERNAL) {
        handleSelectInternalSource();
        // Switching to internal source is always successful even when CEC control is disabled.
        setActiveSource(targetAddress, mService.getPhysicalAddress());
        setActivePath(mService.getPhysicalAddress());
        invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS);
        return;
    }
    if (!mService.isControlEnabled()) {
        setActiveSource(targetDevice);
        invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
        return;
    }
    removeAction(DeviceSelectAction.class);
    addAndStartAction(new DeviceSelectAction(this, targetDevice, callback));
}
Also used : HdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo) ServiceThreadOnly(com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly)

Example 29 with HdmiDeviceInfo

use of android.hardware.hdmi.HdmiDeviceInfo in project android_frameworks_base by ResurrectionRemix.

the class HdmiCecLocalDeviceTv method launchDeviceDiscovery.

@ServiceThreadOnly
private void launchDeviceDiscovery() {
    assertRunOnServiceThread();
    clearDeviceInfoList();
    DeviceDiscoveryAction action = new DeviceDiscoveryAction(this, new DeviceDiscoveryCallback() {

        @Override
        public void onDeviceDiscoveryDone(List<HdmiDeviceInfo> deviceInfos) {
            for (HdmiDeviceInfo info : deviceInfos) {
                addCecDevice(info);
            }
            // we should put device info of local device manually here
            for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) {
                addCecDevice(device.getDeviceInfo());
            }
            mSelectRequestBuffer.process();
            resetSelectRequestBuffer();
            addAndStartAction(new HotplugDetectionAction(HdmiCecLocalDeviceTv.this));
            addAndStartAction(new PowerStatusMonitorAction(HdmiCecLocalDeviceTv.this));
            // If there is AVR, initiate System Audio Auto initiation action,
            // which turns on and off system audio according to last system
            // audio setting.
            HdmiDeviceInfo avr = getAvrDeviceInfo();
            if (avr != null) {
                onNewAvrAdded(avr);
            } else {
                setSystemAudioMode(false, true);
            }
        }
    });
    addAndStartAction(action);
}
Also used : HdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo) DeviceDiscoveryCallback(com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback) ServiceThreadOnly(com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly)

Example 30 with HdmiDeviceInfo

use of android.hardware.hdmi.HdmiDeviceInfo in project android_frameworks_base by ResurrectionRemix.

the class HdmiCecLocalDeviceTv method changeSystemAudioMode.

@ServiceThreadOnly
// Seq #32
void changeSystemAudioMode(boolean enabled, IHdmiControlCallback callback) {
    assertRunOnServiceThread();
    if (!mService.isControlEnabled() || hasAction(DeviceDiscoveryAction.class)) {
        setSystemAudioMode(false, true);
        invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
        return;
    }
    HdmiDeviceInfo avr = getAvrDeviceInfo();
    if (avr == null) {
        setSystemAudioMode(false, true);
        invokeCallback(callback, HdmiControlManager.RESULT_TARGET_NOT_AVAILABLE);
        return;
    }
    addAndStartAction(new SystemAudioActionFromTv(this, avr.getLogicalAddress(), enabled, callback));
}
Also used : HdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo) ServiceThreadOnly(com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly)

Aggregations

HdmiDeviceInfo (android.hardware.hdmi.HdmiDeviceInfo)172 ServiceThreadOnly (com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly)110 ArrayList (java.util.ArrayList)15 TvInputHardwareInfo (android.media.tv.TvInputHardwareInfo)12 HdmiPortInfo (android.hardware.hdmi.HdmiPortInfo)10 SendMessageCallback (com.android.server.hdmi.HdmiControlService.SendMessageCallback)10 IHdmiControlCallback (android.hardware.hdmi.IHdmiControlCallback)5 RemoteException (android.os.RemoteException)5 ArraySet (android.util.ArraySet)5 SparseArray (android.util.SparseArray)5 SparseIntArray (android.util.SparseIntArray)5 InputChannel (android.view.InputChannel)5 SomeArgs (com.android.internal.os.SomeArgs)5 DeviceDiscoveryCallback (com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback)5 AllocateAddressCallback (com.android.server.hdmi.HdmiCecController.AllocateAddressCallback)5 ActiveSource (com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource)5 UnsupportedEncodingException (java.io.UnsupportedEncodingException)5 BitSet (java.util.BitSet)5 TvInputInfo (android.media.tv.TvInputInfo)4 Message (android.os.Message)4