MediaMetrics: improve API coverage

Fix: 183239947
Fix: 184396557
Fix: 183240314
Fix: 183240275
Fix: 183240276
Fix: 183240126
Test: atest android.media.metrics.cts.MediaMetricsAtomTests
Change-Id: I849beed2483f746e9486d3cea0f7797b2c030f1c
diff --git a/hostsidetests/media/app/MediaMetricsTest/src/android/media/metrics/cts/MediaMetricsAtomHostSideTests.java b/hostsidetests/media/app/MediaMetricsTest/src/android/media/metrics/cts/MediaMetricsAtomHostSideTests.java
index 442386d..cc2f21c 100644
--- a/hostsidetests/media/app/MediaMetricsTest/src/android/media/metrics/cts/MediaMetricsAtomHostSideTests.java
+++ b/hostsidetests/media/app/MediaMetricsTest/src/android/media/metrics/cts/MediaMetricsAtomHostSideTests.java
@@ -91,6 +91,52 @@
     }
 
     @Test
+    public void testTrackChangeEvent_audio() throws Exception {
+        Context context = InstrumentationRegistry.getContext();
+        MediaMetricsManager manager = context.getSystemService(MediaMetricsManager.class);
+        PlaybackSession s = manager.createPlaybackSession();
+        TrackChangeEvent e =
+                new TrackChangeEvent.Builder(TrackChangeEvent.TRACK_TYPE_AUDIO)
+                        .setTimeSinceCreatedMillis(37278L)
+                        .setTrackState(TrackChangeEvent.TRACK_STATE_OFF)
+                        .setTrackChangeReason(TrackChangeEvent.TRACK_CHANGE_REASON_INITIAL)
+                        .setContainerMimeType("audio/foo")
+                        .setSampleMimeType("audio/avc")
+                        .setCodecName("codec_2")
+                        .setBitrate(1025)
+                        .setLanguage("EN")
+                        .setLanguageRegion("US")
+                        .setAudioSampleRate(89)
+                        .setChannelCount(3)
+                        .build();
+        s.reportTrackChangeEvent(e);
+    }
+
+    @Test
+    public void testTrackChangeEvent_video() throws Exception {
+        Context context = InstrumentationRegistry.getContext();
+        MediaMetricsManager manager = context.getSystemService(MediaMetricsManager.class);
+        PlaybackSession s = manager.createPlaybackSession();
+        TrackChangeEvent e =
+                new TrackChangeEvent.Builder(TrackChangeEvent.TRACK_TYPE_VIDEO)
+                        .setTimeSinceCreatedMillis(37278L)
+                        .setTrackState(TrackChangeEvent.TRACK_STATE_OFF)
+                        .setTrackChangeReason(TrackChangeEvent.TRACK_CHANGE_REASON_INITIAL)
+                        .setContainerMimeType("video/foo")
+                        .setSampleMimeType("video/mpeg")
+                        .setCodecName("codec_3")
+                        .setBitrate(1025)
+                        .setLanguage("EN")
+                        .setLanguageRegion("US")
+                        .setHeight(1080)
+                        .setWidth(1440)
+                        .setVideoFrameRate(60)
+                        .setMetricsBundle(new Bundle())
+                        .build();
+        s.reportTrackChangeEvent(e);
+    }
+
+    @Test
     public void testNetworkEvent() throws Exception {
         Context context = InstrumentationRegistry.getContext();
         MediaMetricsManager manager = context.getSystemService(MediaMetricsManager.class);
@@ -127,6 +173,7 @@
                         .setNetworkTransferDurationMillis(6000)
                         .setDrmSessionId(new byte[] {2, 3, 3, 10})
                         .setMetricsBundle(new Bundle())
+                        .addExperimentId(123)
                         .build();
         s.reportPlaybackMetrics(e);
     }
@@ -135,23 +182,25 @@
     public void testSessionId() throws Exception {
         Context context = InstrumentationRegistry.getContext();
         MediaMetricsManager manager = context.getSystemService(MediaMetricsManager.class);
-        PlaybackSession s = manager.createPlaybackSession();
 
-        LogSessionId idObj = s.getSessionId();
-        assertThat(idObj).isNotEqualTo(null);
-        assertThat(idObj.getStringId().length()).isGreaterThan(0);
+        try(PlaybackSession s = manager.createPlaybackSession()) {
+            LogSessionId idObj = s.getSessionId();
+            assertThat(idObj).isNotEqualTo(null);
+            assertThat(idObj.getStringId().length()).isGreaterThan(0);
+        }
     }
 
     @Test
     public void testRecordingSession() throws Exception {
         Context context = InstrumentationRegistry.getContext();
         MediaMetricsManager manager = context.getSystemService(MediaMetricsManager.class);
-        RecordingSession s = manager.createRecordingSession();
 
-        assertThat(s).isNotEqualTo(null);
-        LogSessionId idObj = s.getSessionId();
-        assertThat(idObj).isNotEqualTo(null);
-        assertThat(idObj.getStringId().length()).isGreaterThan(0);
+        try(RecordingSession s = manager.createRecordingSession()) {
+            assertThat(s).isNotEqualTo(null);
+            LogSessionId idObj = s.getSessionId();
+            assertThat(idObj).isNotEqualTo(null);
+            assertThat(idObj.getStringId().length()).isGreaterThan(0);
+        }
     }
 
     /**
diff --git a/hostsidetests/media/src/android/media/metrics/cts/MediaMetricsAtomTests.java b/hostsidetests/media/src/android/media/metrics/cts/MediaMetricsAtomTests.java
index defde84..9e12ed6 100644
--- a/hostsidetests/media/src/android/media/metrics/cts/MediaMetricsAtomTests.java
+++ b/hostsidetests/media/src/android/media/metrics/cts/MediaMetricsAtomTests.java
@@ -141,6 +141,69 @@
         assertThat(result.getLanguageRegion()).isEqualTo("US");
     }
 
+    public void testTrackChangeEvent_audio() throws Exception {
+        ConfigUtils.uploadConfigForPushedAtom(getDevice(), TEST_PKG,
+                AtomsProto.Atom.MEDIA_PLAYBACK_TRACK_CHANGED_FIELD_NUMBER);
+        DeviceUtils.runDeviceTests(
+                getDevice(),
+                TEST_PKG,
+                "android.media.metrics.cts.MediaMetricsAtomHostSideTests",
+                "testTrackChangeEvent_audio");
+        Thread.sleep(AtomTestUtils.WAIT_TIME_LONG);
+
+        List<StatsLog.EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
+
+        assertThat(data.size()).isEqualTo(1);
+        assertThat(data.get(0).getAtom().hasMediaPlaybackTrackChanged()).isTrue();
+        AtomsProto.MediaPlaybackTrackChanged result =
+                data.get(0).getAtom().getMediaPlaybackTrackChanged();
+
+        assertThat(result.getTimeSincePlaybackCreatedMillis()).isEqualTo(37278L);
+        assertThat(result.getState().toString()).isEqualTo("OFF");
+        assertThat(result.getReason().toString()).isEqualTo("REASON_INITIAL");
+        assertThat(result.getContainerMimeType()).isEqualTo("audio/foo");
+        assertThat(result.getSampleMimeType()).isEqualTo("audio/avc");
+        assertThat(result.getCodecName()).isEqualTo("codec_2");
+        assertThat(result.getBitrate()).isEqualTo(1025);
+        assertThat(result.getType().toString()).isEqualTo("AUDIO");
+        assertThat(result.getLanguage()).isEqualTo("EN");
+        assertThat(result.getLanguageRegion()).isEqualTo("US");
+        assertThat(result.getSampleRate()).isEqualTo(89);
+        assertThat(result.getChannelCount()).isEqualTo(3);
+    }
+
+    public void testTrackChangeEvent_video() throws Exception {
+        ConfigUtils.uploadConfigForPushedAtom(getDevice(), TEST_PKG,
+                AtomsProto.Atom.MEDIA_PLAYBACK_TRACK_CHANGED_FIELD_NUMBER);
+        DeviceUtils.runDeviceTests(
+                getDevice(),
+                TEST_PKG,
+                "android.media.metrics.cts.MediaMetricsAtomHostSideTests",
+                "testTrackChangeEvent_video");
+        Thread.sleep(AtomTestUtils.WAIT_TIME_LONG);
+
+        List<StatsLog.EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
+
+        assertThat(data.size()).isEqualTo(1);
+        assertThat(data.get(0).getAtom().hasMediaPlaybackTrackChanged()).isTrue();
+        AtomsProto.MediaPlaybackTrackChanged result =
+                data.get(0).getAtom().getMediaPlaybackTrackChanged();
+
+        assertThat(result.getTimeSincePlaybackCreatedMillis()).isEqualTo(37278L);
+        assertThat(result.getState().toString()).isEqualTo("OFF");
+        assertThat(result.getReason().toString()).isEqualTo("REASON_INITIAL");
+        assertThat(result.getContainerMimeType()).isEqualTo("video/foo");
+        assertThat(result.getSampleMimeType()).isEqualTo("video/mpeg");
+        assertThat(result.getCodecName()).isEqualTo("codec_3");
+        assertThat(result.getBitrate()).isEqualTo(1025);
+        assertThat(result.getType().toString()).isEqualTo("VIDEO");
+        assertThat(result.getLanguage()).isEqualTo("EN");
+        assertThat(result.getLanguageRegion()).isEqualTo("US");
+        assertThat(result.getHeight()).isEqualTo(1080);
+        assertThat(result.getWidth()).isEqualTo(1440);
+        assertThat(result.getVideoFrameRate()).isEqualTo(60);
+    }
+
     public void testNetworkEvent() throws Exception {
         ConfigUtils.uploadConfigForPushedAtom(getDevice(), TEST_PKG,
                 AtomsProto.Atom.MEDIA_NETWORK_INFO_CHANGED_FIELD_NUMBER);
@@ -195,6 +258,8 @@
         assertThat(result.getNetworkBytesRead()).isEqualTo(102400);
         assertThat(result.getLocalBytesRead()).isEqualTo(2000);
         assertThat(result.getNetworkTransferDurationMillis()).isEqualTo(6000);
+        // TODO: fix missing experiment ID impl
+        assertThat(result.getExperimentIds()).isNotEqualTo(null);
         // TODO: needs Base64 decoders to verify the data
         assertThat(result.getDrmSessionId()).isNotEqualTo(null);
     }