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

Commit 30a4d8e0 authored by Tang Lee's avatar Tang Lee Committed by Android (Google) Code Review
Browse files

Merge changes from topic "hdmi-topology-reportpa" into main

* changes:
  HDMI: Upload physical address from Report PA in metrics
  HDMI: Declare flag for uploading physical address metrics
parents 25986bd4 cd991859
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -112,3 +112,11 @@ flag {
    description : "Feature flag to enable APIs for applying picture profiles"
    bug: "337330263"
}

flag {
    name: "hdmi_control_collect_physical_address"
    is_exported: true
    namespace: "media_tv"
    description: "Collect physical address from HDMI-CEC messages in metrics"
    bug: "376001043"
}
+32 −3
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.hdmi;

import static android.media.tv.flags.Flags.hdmiControlCollectPhysicalAddress;

import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_ARC_PENDING;
import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_EARC_CONNECTED;
import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_EARC_PENDING;
@@ -35,6 +37,8 @@ public class HdmiCecAtomWriter {
    @VisibleForTesting
    protected static final int FEATURE_ABORT_OPCODE_UNKNOWN = 0x100;
    private static final int ERROR_CODE_UNKNOWN = -1;
    @VisibleForTesting
    protected static final int PHYSICAL_ADDRESS_INVALID = 0xFFFF;

    /**
     * Writes a HdmiCecMessageReported atom representing an HDMI CEC message.
@@ -95,6 +99,11 @@ public class HdmiCecAtomWriter {
                return createUserControlPressedSpecialArgs(message);
            case Constants.MESSAGE_FEATURE_ABORT:
                return createFeatureAbortSpecialArgs(message);
            case Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS:
                if (hdmiControlCollectPhysicalAddress()) {
                    return createReportPhysicalAddressSpecialArgs(message);
                }
                return new MessageReportedSpecialArgs();
            default:
                return new MessageReportedSpecialArgs();
        }
@@ -139,6 +148,23 @@ public class HdmiCecAtomWriter {
        return specialArgs;
    }

    /**
     * Constructs the special arguments for a <Report Physical Address> message.
     *
     * @param message The HDMI CEC message to log
     */
    private MessageReportedSpecialArgs createReportPhysicalAddressSpecialArgs(
            HdmiCecMessage message) {
        MessageReportedSpecialArgs specialArgs = new MessageReportedSpecialArgs();

        if (message.getParams().length > 1) {
            int physicalAddress = (message.getParams()[0] << 8) | message.getParams()[1];
            specialArgs.mPhysicalAddress = physicalAddress;
        }

        return specialArgs;
    }

    /**
     * Writes a HdmiCecMessageReported atom.
     *
@@ -156,7 +182,8 @@ public class HdmiCecAtomWriter {
                genericArgs.mSendMessageResult,
                specialArgs.mUserControlPressedCommand,
                specialArgs.mFeatureAbortOpcode,
                specialArgs.mFeatureAbortReason);
                specialArgs.mFeatureAbortReason,
                specialArgs.mPhysicalAddress);
    }

    /**
@@ -166,7 +193,7 @@ public class HdmiCecAtomWriter {
    protected void writeHdmiCecMessageReportedAtom(int uid, int direction,
            int initiatorLogicalAddress, int destinationLogicalAddress, int opcode,
            int sendMessageResult, int userControlPressedCommand, int featureAbortOpcode,
            int featureAbortReason) {
            int featureAbortReason, int physicalAddress) {
        FrameworkStatsLog.write(
                FrameworkStatsLog.HDMI_CEC_MESSAGE_REPORTED,
                uid,
@@ -177,7 +204,8 @@ public class HdmiCecAtomWriter {
                sendMessageResult,
                userControlPressedCommand,
                featureAbortOpcode,
                featureAbortReason);
                featureAbortReason,
                physicalAddress);
    }

    /**
@@ -284,5 +312,6 @@ public class HdmiCecAtomWriter {
        int mUserControlPressedCommand = HdmiStatsEnums.USER_CONTROL_PRESSED_COMMAND_UNKNOWN;
        int mFeatureAbortOpcode = FEATURE_ABORT_OPCODE_UNKNOWN;
        int mFeatureAbortReason = HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN;
        int mPhysicalAddress = PHYSICAL_ADDRESS_INVALID;
    }
}
+68 −4
Original line number Diff line number Diff line
@@ -41,11 +41,14 @@ import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.HdmiPortInfo;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.media.tv.flags.Flags;
import android.os.Binder;
import android.os.Looper;
import android.os.RemoteException;
import android.os.test.TestLooper;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.SetFlagsRule;
import android.stats.hdmi.HdmiStatsEnums;

import androidx.test.InstrumentationRegistry;
@@ -54,6 +57,7 @@ import androidx.test.filters.SmallTest;
import com.android.server.SystemService;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -83,6 +87,9 @@ public class HdmiCecAtomLoggingTest {
    private HdmiEarcController mHdmiEarcController;
    private FakeEarcNativeWrapper mEarcNativeWrapper;

    @Rule
    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

    @Before
    public void setUp() throws RemoteException {
        mHdmiCecAtomWriterSpy = spy(new HdmiCecAtomWriter());
@@ -232,7 +239,8 @@ public class HdmiCecAtomLoggingTest {
                        HdmiStatsEnums.SEND_MESSAGE_RESULT_UNKNOWN,
                        HdmiStatsEnums.VOLUME_MUTE,
                        HdmiCecAtomWriter.FEATURE_ABORT_OPCODE_UNKNOWN,
                        HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN);
                        HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN,
                        HdmiCecAtomWriter.PHYSICAL_ADDRESS_INVALID);
    }

    @Test
@@ -258,7 +266,8 @@ public class HdmiCecAtomLoggingTest {
                        HdmiStatsEnums.SEND_MESSAGE_RESULT_UNKNOWN,
                        HdmiStatsEnums.USER_CONTROL_PRESSED_COMMAND_UNKNOWN,
                        HdmiCecAtomWriter.FEATURE_ABORT_OPCODE_UNKNOWN,
                        HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN);
                        HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN,
                        HdmiCecAtomWriter.PHYSICAL_ADDRESS_INVALID);
    }

    @Test
@@ -285,7 +294,8 @@ public class HdmiCecAtomLoggingTest {
                        HdmiStatsEnums.SEND_MESSAGE_RESULT_UNKNOWN,
                        HdmiStatsEnums.USER_CONTROL_PRESSED_COMMAND_UNKNOWN,
                        Constants.MESSAGE_RECORD_ON,
                        HdmiStatsEnums.UNRECOGNIZED_OPCODE);
                        HdmiStatsEnums.UNRECOGNIZED_OPCODE,
                        HdmiCecAtomWriter.PHYSICAL_ADDRESS_INVALID);
    }

    @Test
@@ -311,7 +321,8 @@ public class HdmiCecAtomLoggingTest {
                        HdmiStatsEnums.SEND_MESSAGE_RESULT_UNKNOWN,
                        HdmiStatsEnums.USER_CONTROL_PRESSED_COMMAND_UNKNOWN,
                        HdmiCecAtomWriter.FEATURE_ABORT_OPCODE_UNKNOWN,
                        HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN);
                        HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN,
                        HdmiCecAtomWriter.PHYSICAL_ADDRESS_INVALID);
    }

    @Test
@@ -336,6 +347,59 @@ public class HdmiCecAtomLoggingTest {
                        eq(HdmiStatsEnums.LOG_REASON_DSM_SETTING_TOGGLED));
    }

    @Test
    @EnableFlags({Flags.FLAG_HDMI_CONTROL_COLLECT_PHYSICAL_ADDRESS})
    public void testMessageReported_writesAtom_reportPhysicalAddress() {
        HdmiCecMessage message = HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
                ADDR_PLAYBACK_1, 0x1234, HdmiDeviceInfo.DEVICE_PLAYBACK);

        mHdmiCecAtomWriterSpy.messageReported(
                message,
                HdmiStatsEnums.INCOMING,
                1234);

        verify(mHdmiCecAtomWriterSpy, times(1))
                .writeHdmiCecMessageReportedAtom(
                        1234,
                        HdmiStatsEnums.INCOMING,
                        Constants.ADDR_PLAYBACK_1,
                        Constants.ADDR_BROADCAST,
                        Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS,
                        HdmiStatsEnums.SEND_MESSAGE_RESULT_UNKNOWN,
                        HdmiStatsEnums.USER_CONTROL_PRESSED_COMMAND_UNKNOWN,
                        HdmiCecAtomWriter.FEATURE_ABORT_OPCODE_UNKNOWN,
                        HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN,
                        0x1234);
    }

    @Test
    @EnableFlags({Flags.FLAG_HDMI_CONTROL_COLLECT_PHYSICAL_ADDRESS})
    public void testMessageReported_writesAtom_reportPhysicalAddress_noParams() {
        HdmiCecMessage message = HdmiCecMessage.build(
                Constants.ADDR_PLAYBACK_1,
                Constants.ADDR_BROADCAST,
                Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS,
                new byte[0]);

        mHdmiCecAtomWriterSpy.messageReported(
                message,
                HdmiStatsEnums.INCOMING,
                1234);

        verify(mHdmiCecAtomWriterSpy, times(1))
                .writeHdmiCecMessageReportedAtom(
                        1234,
                        HdmiStatsEnums.INCOMING,
                        Constants.ADDR_PLAYBACK_1,
                        Constants.ADDR_BROADCAST,
                        Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS,
                        HdmiStatsEnums.SEND_MESSAGE_RESULT_UNKNOWN,
                        HdmiStatsEnums.USER_CONTROL_PRESSED_COMMAND_UNKNOWN,
                        HdmiCecAtomWriter.FEATURE_ABORT_OPCODE_UNKNOWN,
                        HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN,
                        HdmiCecAtomWriter.PHYSICAL_ADDRESS_INVALID);
    }

    @Test
    public void testDsmStatusChanged_onWakeUp_ArcSupported_writesAtom_logReasonWake() {
        mHdmiControlServiceSpy.setSoundbarMode(HdmiControlManager.SOUNDBAR_MODE_DISABLED);