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

Commit 4e7ff1a3 authored by Amy's avatar Amy Committed by Amy Zhang
Browse files

Add partial request arc init/terminate handlers and tests

Test: atest com.android.server.hdmi
Change-Id: I92ee4598ccb2e6c88863ab0ba3dc3ba682ccd0e2
(cherry picked from commit 5dc9609a08c43ca4134b1eccaea2f23a1681bd61)
parent 8b06946b
Loading
Loading
Loading
Loading
+32 −0
Original line number Original line Diff line number Diff line
@@ -119,6 +119,38 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
        return true;
        return true;
    }
    }


    @Override
    @ServiceThreadOnly
    protected boolean handleRequestArcInitiate(HdmiCecMessage message) {
        assertRunOnServiceThread();
        // TODO(b/80296911): Check if ARC supported.

        // TODO(b/80296911): Check if port is ready to accept.

        // TODO(b/80296911): if both true, activate ARC functinality and
        mService.sendCecCommand(HdmiCecMessageBuilder
            .buildInitiateArc(mAddress, message.getSource()));
        // TODO(b/80296911): else, send <Feature Abort>["Unrecongnized opcode"]

        return true;
    }

    @Override
    @ServiceThreadOnly
    protected boolean handleRequestArcTermination(HdmiCecMessage message) {
        assertRunOnServiceThread();
        // TODO(b/80297105): Check if ARC supported.

        // TODO(b/80297105): Check is currently in arc.

        // TODO(b/80297105): If both true, deactivate ARC functionality and
        mService.sendCecCommand(HdmiCecMessageBuilder
            .buildTerminateArc(mAddress, message.getSource()));
        // TODO(b/80297105): else, send <Feature Abort>["Unrecongnized opcode"]

        return true;
    }

    private void reportAudioStatus(HdmiCecMessage message) {
    private void reportAudioStatus(HdmiCecMessage message) {
        assertRunOnServiceThread();
        assertRunOnServiceThread();


+12 −4
Original line number Original line Diff line number Diff line
@@ -407,8 +407,9 @@ public class HdmiControlService extends SystemService {
            Slog.i(TAG, "Device does not support HDMI-CEC.");
            Slog.i(TAG, "Device does not support HDMI-CEC.");
            return;
            return;
        }
        }

        if (mMhlController == null) {
            mMhlController = HdmiMhlControllerStub.create(this);
            mMhlController = HdmiMhlControllerStub.create(this);
        }
        if (!mMhlController.isReady()) {
        if (!mMhlController.isReady()) {
            Slog.i(TAG, "Device does not support MHL-control.");
            Slog.i(TAG, "Device does not support MHL-control.");
        }
        }
@@ -440,6 +441,11 @@ public class HdmiControlService extends SystemService {
        mCecController = cecController;
        mCecController = cecController;
    }
    }


    @VisibleForTesting
    void setHdmiMhlController(HdmiMhlControllerStub hdmiMhlController) {
        mMhlController = hdmiMhlController;
    }

    @Override
    @Override
    public void onBootPhase(int phase) {
    public void onBootPhase(int phase) {
        if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
        if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
@@ -598,7 +604,8 @@ public class HdmiControlService extends SystemService {
    }
    }


    @ServiceThreadOnly
    @ServiceThreadOnly
    private void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> allocatingDevices,
    @VisibleForTesting
    protected void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> allocatingDevices,
            final int initiatedBy) {
            final int initiatedBy) {
        assertRunOnServiceThread();
        assertRunOnServiceThread();
        mCecController.clearLogicalAddress();
        mCecController.clearLogicalAddress();
@@ -665,7 +672,8 @@ public class HdmiControlService extends SystemService {
    // Initialize HDMI port information. Combine the information from CEC and MHL HAL and
    // Initialize HDMI port information. Combine the information from CEC and MHL HAL and
    // keep them in one place.
    // keep them in one place.
    @ServiceThreadOnly
    @ServiceThreadOnly
    private void initPortInfo() {
    @VisibleForTesting
    protected void initPortInfo() {
        assertRunOnServiceThread();
        assertRunOnServiceThread();
        HdmiPortInfo[] cecPortInfo = null;
        HdmiPortInfo[] cecPortInfo = null;


+118 −4
Original line number Original line Diff line number Diff line
@@ -17,14 +17,19 @@ package com.android.server.hdmi;


import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertEquals;


import android.hardware.hdmi.HdmiPortInfo;
import android.media.AudioManager;
import android.media.AudioManager;
import android.os.Looper;
import android.os.MessageQueue;
import android.os.test.TestLooper;
import android.support.test.filters.SmallTest;
import android.support.test.filters.SmallTest;
import junit.framework.Assert;
import com.android.server.hdmi.HdmiCecController.NativeWrapper;
import java.util.Arrays;
import java.util.Arrays;
import java.util.ArrayList;
import org.junit.Before;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
@@ -37,10 +42,79 @@ import org.junit.runners.JUnit4;
 */
 */
public class HdmiCecLocalDeviceAudioSystemTest {
public class HdmiCecLocalDeviceAudioSystemTest {


    private static final class NativeWrapperImpl implements NativeWrapper {

        @Override
        public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
            return 1L;
        }

        @Override
        public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress,
            byte[] body) {
            return 1;
        }

        @Override
        public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) {
            return 0;
        }

        @Override
        public void nativeClearLogicalAddress(long controllerPtr) {

        }

        @Override
        public int nativeGetPhysicalAddress(long controllerPtr) {
            return 0;
        }

        @Override
        public int nativeGetVersion(long controllerPtr) {
            return 0;
        }

        @Override
        public int nativeGetVendorId(long controllerPtr) {
            return 0;
        }

        @Override
        public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
            HdmiPortInfo[] hdmiPortInfo = new HdmiPortInfo[1];
            hdmiPortInfo[0] = new HdmiPortInfo(1, 1, 0x1000,true, true, true);
            return hdmiPortInfo;
        }

        @Override
        public void nativeSetOption(long controllerPtr, int flag, boolean enabled) {

        }

        @Override
        public void nativeSetLanguage(long controllerPtr, String language) {

        }

        @Override
        public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) {

        }

        @Override
        public boolean nativeIsConnected(long controllerPtr, int port) {
            return false;
        }
    }


    private HdmiControlService mHdmiControlService;
    private HdmiControlService mHdmiControlService;
    private HdmiCecController mHdmiCecController;
    private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem;
    private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem;
    private HdmiCecMessage mResultMessage;
    private HdmiCecMessage mResultMessage;
    private Looper mMyLooper;
    private TestLooper mTestLooper = new TestLooper();
    private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
    private int mMusicVolume;
    private int mMusicVolume;
    private int mMusicMaxVolume;
    private int mMusicMaxVolume;
    private boolean mMusicMute;
    private boolean mMusicMute;
@@ -88,7 +162,21 @@ public class HdmiCecLocalDeviceAudioSystemTest {
                mResultMessage = command;
                mResultMessage = command;
            }
            }
        };
        };
        mMyLooper = mTestLooper.getLooper();
        mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService);
        mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService);
        mHdmiCecLocalDeviceAudioSystem.init();
        mHdmiControlService.setIoLooper(mMyLooper);

        mHdmiCecController = HdmiCecController.createWithNativeWrapper(
            mHdmiControlService, new NativeWrapperImpl());
        mHdmiControlService.setCecController(mHdmiCecController);
        mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));

        mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem);
        mHdmiControlService.initPortInfo();
        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);

        mTestLooper.dispatchAll();
    }
    }


    @Test
    @Test
@@ -98,7 +186,7 @@ public class HdmiCecLocalDeviceAudioSystemTest {
        mMusicMaxVolume = 20;
        mMusicMaxVolume = 20;
        int scaledVolume = VolumeControlAction.scaleToCecVolume(10, mMusicMaxVolume);
        int scaledVolume = VolumeControlAction.scaleToCecVolume(10, mMusicMaxVolume);
        HdmiCecMessage expectMessage = HdmiCecMessageBuilder.buildReportAudioStatus(
        HdmiCecMessage expectMessage = HdmiCecMessageBuilder.buildReportAudioStatus(
            ADDR_UNREGISTERED, ADDR_TV, scaledVolume, true);
            ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true);


        HdmiCecMessage message = HdmiCecMessageBuilder.buildGiveAudioStatus(
        HdmiCecMessage message = HdmiCecMessageBuilder.buildGiveAudioStatus(
            ADDR_TV, ADDR_AUDIO_SYSTEM);
            ADDR_TV, ADDR_AUDIO_SYSTEM);
@@ -110,7 +198,7 @@ public class HdmiCecLocalDeviceAudioSystemTest {
    @Test
    @Test
    public void handleGiveSystemAudioModeStatus_off() {
    public void handleGiveSystemAudioModeStatus_off() {
        HdmiCecMessage expectMessage = HdmiCecMessageBuilder
        HdmiCecMessage expectMessage = HdmiCecMessageBuilder
            .buildReportSystemAudioMode(ADDR_UNREGISTERED, ADDR_TV, false);
            .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);


        HdmiCecMessage message = HdmiCecMessageBuilder
        HdmiCecMessage message = HdmiCecMessageBuilder
            .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
            .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
@@ -118,4 +206,30 @@ public class HdmiCecLocalDeviceAudioSystemTest {


        assertTrue(mResultMessage.equals(expectMessage));
        assertTrue(mResultMessage.equals(expectMessage));
    }
    }

    @Test
    public void handleRequestArcInitiate() {
        // TODO(b/80296911): Add tests when finishing handler impl.
        HdmiCecMessage expectMessage = HdmiCecMessageBuilder
            .buildInitiateArc(ADDR_AUDIO_SYSTEM, ADDR_TV);

        HdmiCecMessage message = HdmiCecMessageBuilder
            .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
        assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message));

        assertTrue(mResultMessage.equals(expectMessage));
    }

    @Test
    public void handleRequestArcTermination() {
        // TODO(b/80297105): Add tests when finishing handler impl.
        HdmiCecMessage expectMessage = HdmiCecMessageBuilder
            .buildTerminateArc(ADDR_AUDIO_SYSTEM, ADDR_TV);

        HdmiCecMessage message = HdmiCecMessageBuilder
            .buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
        assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message));

        assertTrue(mResultMessage.equals(expectMessage));
    }
}
}