Merge "MediaCodecBlockTest: update for no CryptoInfo on setLinearBlock" into rvc-dev
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/PresentationTest.java b/tests/framework/base/windowmanager/src/android/server/wm/PresentationTest.java
index 77dc2c0..3619bed 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/PresentationTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/PresentationTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.junit.Assert.assertTrue;
+
 import android.content.Intent;
 import android.hardware.display.DisplayManager;
 import android.platform.test.annotations.Presubmit;
@@ -63,6 +65,28 @@
     }
 
     @Test
+    public void testPresentationDismissAfterResizeDisplay() {
+        final VirtualDisplaySession virtualDisplaySession = createManagedVirtualDisplaySession();
+        WindowManagerState.DisplayContent display = virtualDisplaySession
+                        .setPresentationDisplay(true)
+                        .setPublicDisplay(true)
+                        .createDisplay();
+
+        assertThat(display.getFlags() & Display.FLAG_PRESENTATION)
+                .isEqualTo(Display.FLAG_PRESENTATION);
+
+        launchPresentationActivity(display.mId);
+        assertPresentationOnDisplay(display.mId);
+
+        virtualDisplaySession.resizeDisplay();
+
+        assertTrue("Presentation must dismiss on external public display",
+                mWmState.waitForWithAmState(
+                        state -> !isPresentationOnDisplay(state, display.mId),
+                        "Presentation window dismiss"));
+    }
+
+    @Test
     public void testPresentationBlockedOnNonPresentationDisplay() {
         WindowManagerState.DisplayContent display =
                 createManagedVirtualDisplaySession()
@@ -74,6 +98,15 @@
         assertNoPresentationDisplayed();
     }
 
+    private boolean isPresentationOnDisplay(WindowManagerState windowManagerState, int displayId) {
+        final List<WindowManagerState.WindowState> states =
+                windowManagerState.getMatchingWindowType(TYPE_PRESENTATION);
+        for (WindowManagerState.WindowState ws : states) {
+            if (ws.getDisplayId() == displayId) return true;
+        }
+        return false;
+    }
+
     private void assertNoPresentationDisplayed() {
         final List<WindowManagerState.WindowState> presentationWindows =
                 mWmState.getWindowsByPackageName(
diff --git a/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames_empty_normal_editlist_entries.mp4 b/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames_empty_normal_editlist_entries.mp4
new file mode 100644
index 0000000..5b175ee
--- /dev/null
+++ b/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames_empty_normal_editlist_entries.mp4
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/EnumDevicesTest.java b/tests/tests/media/src/android/media/cts/EnumDevicesTest.java
index 5872bef..13a9cf8 100644
--- a/tests/tests/media/src/android/media/cts/EnumDevicesTest.java
+++ b/tests/tests/media/src/android/media/cts/EnumDevicesTest.java
@@ -158,6 +158,14 @@
             assertNotNull(encodings);
             // Note: an empty array indicates that the device supports arbitrary encodings.
 
+            // Encapsulation Modes
+            int[] encapsulationModes = deviceInfo.getEncapsulationModes();
+            assertNotNull(encapsulationModes);
+
+            // EncapsulationMetadataTypes
+            int[] encapsulationMetadataTypes = deviceInfo.getEncapsulationMetadataTypes();
+            assertNotNull(encapsulationMetadataTypes);
+
             int type = deviceInfo.getType();
             assertTrue(type != AudioDeviceInfo.TYPE_UNKNOWN);
         }
diff --git a/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java b/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
index e5bf714..0a431d8 100644
--- a/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
@@ -641,6 +641,30 @@
         testGetFrameAtTimeEditList(OPTION_CLOSEST, testCases);
     }
 
+    public void testGetFrameAtTimePreviousSyncEmptyNormalEditList() {
+        int[][] testCases = {
+                { 2133000, 60 }, { 2566334, 60 }, { 2666334, 60 }, { 3100000, 60 }, { 3266000, 90}};
+        testGetFrameAtTimeEmptyNormalEditList(OPTION_PREVIOUS_SYNC, testCases);
+    }
+
+    public void testGetFrameAtTimeNextSyncEmptyNormalEditList() {
+        int[][] testCases = {{ 2000000, 60 }, { 2133000, 60 }, { 2566334, 90 }, { 3100000, 90 },
+                { 3200000, 120}};
+        testGetFrameAtTimeEmptyNormalEditList(OPTION_NEXT_SYNC, testCases);
+    }
+
+    public void testGetFrameAtTimeClosestSyncEmptyNormalEditList() {
+        int[][] testCases = {
+                { 2133000, 60 }, { 2566334, 60 }, { 2666000, 90 }, { 3133000, 90 }, { 3200000, 90}};
+        testGetFrameAtTimeEmptyNormalEditList(OPTION_CLOSEST_SYNC, testCases);
+    }
+
+    public void testGetFrameAtTimeClosestEmptyNormalEditList() {
+        int[][] testCases = {
+                { 2133000, 60 }, { 2566000, 73 }, { 2666000, 76 }, { 3066001, 88 }, { 3255000, 94}};
+        testGetFrameAtTimeEmptyNormalEditList(OPTION_CLOSEST, testCases);
+    }
+
     private void testGetFrameAtTime(int option, int[][] testCases) {
         testGetFrameAt(testCases, (r) -> {
             List<Bitmap> bitmaps = new ArrayList<>();
@@ -666,6 +690,21 @@
         });
     }
 
+    private void testGetFrameAtTimeEmptyNormalEditList(int option, int[][] testCases) {
+        MediaMetadataRetriever.BitmapParams params = new MediaMetadataRetriever.BitmapParams();
+        params.setPreferredConfig(Bitmap.Config.ARGB_8888);
+
+        testGetFrameAtEmptyNormalEditList(testCases, (r) -> {
+            List<Bitmap> bitmaps = new ArrayList<>();
+            for (int i = 0; i < testCases.length; i++) {
+                Bitmap bitmap = r.getFrameAtTime(testCases[i][0], option, params);
+                assertEquals(Bitmap.Config.ARGB_8888, params.getActualConfig());
+                bitmaps.add(bitmap);
+            }
+            return bitmaps;
+        });
+    }
+
     public void testGetFrameAtIndex() {
         int[][] testCases = { { 60, 60 }, { 73, 73 }, { 76, 76 }, { 88, 88 }, { 94, 94} };
 
@@ -724,6 +763,11 @@
                 testCases, bitmapRetriever);
     }
 
+    private void testGetFrameAtEmptyNormalEditList(int[][] testCases,
+            Function<MediaMetadataRetriever, List<Bitmap> > bitmapRetriever) {
+        testGetFrameAt(R.raw.binary_counter_320x240_30fps_600frames_empty_normal_editlist_entries,
+                testCases, bitmapRetriever);
+    }
     private void testGetFrameAt(int resId, int[][] testCases,
             Function<MediaMetadataRetriever, List<Bitmap> > bitmapRetriever) {
         if (!MediaUtils.hasCodecForResourceAndDomain(getContext(), resId, "video/")
diff --git a/tests/tests/mediaparser/src/android/media/mediaparser/cts/MediaParserTest.java b/tests/tests/mediaparser/src/android/media/mediaparser/cts/MediaParserTest.java
index 5013f1c..7915d37 100644
--- a/tests/tests/mediaparser/src/android/media/mediaparser/cts/MediaParserTest.java
+++ b/tests/tests/mediaparser/src/android/media/mediaparser/cts/MediaParserTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.media.MediaFormat;
 import android.media.MediaParser;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -38,6 +39,60 @@
 public class MediaParserTest {
 
     @Test
+    public void testGetAllParserNames() {
+        MediaFormat format = new MediaFormat();
+        // By not providing a mime type, MediaParser should return all parser names.
+        format.setString(MediaFormat.KEY_MIME, null);
+        assertThat(MediaParser.getParserNames(format))
+                .containsExactly(
+                        MediaParser.PARSER_NAME_MATROSKA,
+                        MediaParser.PARSER_NAME_FMP4,
+                        MediaParser.PARSER_NAME_MP4,
+                        MediaParser.PARSER_NAME_MP3,
+                        MediaParser.PARSER_NAME_ADTS,
+                        MediaParser.PARSER_NAME_AC3,
+                        MediaParser.PARSER_NAME_TS,
+                        MediaParser.PARSER_NAME_FLV,
+                        MediaParser.PARSER_NAME_OGG,
+                        MediaParser.PARSER_NAME_PS,
+                        MediaParser.PARSER_NAME_WAV,
+                        MediaParser.PARSER_NAME_AMR,
+                        MediaParser.PARSER_NAME_AC4,
+                        MediaParser.PARSER_NAME_FLAC);
+    }
+
+    @Test
+    public void testGetParserNamesByMimeType() {
+        // MimeTypes obtained from the W3C.
+        assertParsers(MediaParser.PARSER_NAME_MATROSKA)
+                .supportMimeTypes(
+                        "video/x-matroska", "audio/x-matroska", "video/x-webm", "audio/x-webm");
+        assertParsers(MediaParser.PARSER_NAME_MP4, MediaParser.PARSER_NAME_FMP4)
+                .supportMimeTypes("video/mp4", "audio/mp4", "application/mp4");
+        assertParsers(MediaParser.PARSER_NAME_MP3).supportMimeTypes("audio/mpeg");
+        assertParsers(MediaParser.PARSER_NAME_ADTS).supportMimeTypes("audio/aac");
+        assertParsers(MediaParser.PARSER_NAME_AC3).supportMimeTypes("audio/ac3");
+        assertParsers(MediaParser.PARSER_NAME_TS).supportMimeTypes("video/mp2t", "audio/mp2t");
+        assertParsers(MediaParser.PARSER_NAME_FLV).supportMimeTypes("video/x-flv");
+        assertParsers(MediaParser.PARSER_NAME_OGG)
+                .supportMimeTypes("video/ogg", "audio/ogg", "application/ogg");
+        assertParsers(MediaParser.PARSER_NAME_PS).supportMimeTypes("video/mp2p", "video/mp1s");
+        assertParsers(MediaParser.PARSER_NAME_WAV)
+                .supportMimeTypes("audio/vnd.wave", "audio/wav", "audio/wave", "audio/x-wav");
+        assertParsers(MediaParser.PARSER_NAME_AMR).supportMimeTypes("audio/amr");
+        assertParsers(MediaParser.PARSER_NAME_AC4).supportMimeTypes("audio/ac4");
+        assertParsers(MediaParser.PARSER_NAME_FLAC).supportMimeTypes("audio/flac", "audio/x-flac");
+    }
+
+    @Test
+    public void testGetParserNamesForUnsupportedMimeType() {
+        MediaFormat format = new MediaFormat();
+        // None of the parser supports WebVTT.
+        format.setString(MediaFormat.KEY_MIME, "text/vtt");
+        assertThat(MediaParser.getParserNames(format)).isEmpty();
+    }
+
+    @Test
     public void testCreationByName() {
         testCreationByName(MediaParser.PARSER_NAME_MATROSKA);
         testCreationByName(MediaParser.PARSER_NAME_FMP4);
@@ -430,4 +485,26 @@
             }
         }
     }
+
+    private static FluentMediaParserSubject assertParsers(String... names) {
+        return new FluentMediaParserSubject(names);
+    }
+
+    private static final class FluentMediaParserSubject {
+
+        private final String[] mediaParserNames;
+
+        private FluentMediaParserSubject(String[] mediaParserNames) {
+            this.mediaParserNames = mediaParserNames;
+        }
+
+        public void supportMimeTypes(String... mimeTypes) {
+            for (String mimeType : mimeTypes) {
+                MediaFormat format = new MediaFormat();
+                format.setString(MediaFormat.KEY_MIME, mimeType);
+                assertThat(MediaParser.getParserNames(format))
+                        .containsExactlyElementsIn(mediaParserNames);
+            }
+        }
+    }
 }
diff --git a/tests/tests/permission3/src/android/permission3/cts/PermissionTest23.kt b/tests/tests/permission3/src/android/permission3/cts/PermissionTest23.kt
index 8a61da7..54dfee7 100644
--- a/tests/tests/permission3/src/android/permission3/cts/PermissionTest23.kt
+++ b/tests/tests/permission3/src/android/permission3/cts/PermissionTest23.kt
@@ -16,7 +16,6 @@
 
 package android.permission3.cts
 
-import androidx.test.filters.FlakyTest
 import org.junit.Before
 import org.junit.Test
 
@@ -229,7 +228,6 @@
         assertAppHasPermission(android.Manifest.permission.READ_CONTACTS, false)
     }
 
-    @FlakyTest
     @Test
     fun testNoResidualPermissionsOnUninstall() {
         // Grant all permissions
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index eadd4d7..507cbbe 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -1979,6 +1979,43 @@
         assertEquals(subPopupLocation[1] - deltaY, newSubPopupLocation[1]);
     }
 
+    @Test
+    public void testFocusAfterOrientation() throws Throwable {
+        int[] orientationValues = {ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE,
+                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT};
+        int currentOrientation = mActivity.getResources().getConfiguration().orientation;
+        if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
+            orientationValues[0] = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
+            orientationValues[1] = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+        }
+
+        View content = createPopupContent(CONTENT_SIZE_DP, CONTENT_SIZE_DP);
+        content.setFocusable(true);
+        mPopupWindow = createPopupWindow(content);
+        mPopupWindow.setFocusable(true);
+        mPopupWindow.setWidth(WindowManager.LayoutParams.MATCH_PARENT);
+        mPopupWindow.setHeight(WindowManager.LayoutParams.MATCH_PARENT);
+        showPopup(R.id.anchor_upper_left);
+        mInstrumentation.waitForIdleSync();
+        assertTrue(content.isFocused());
+
+        if (!hasDeviceFeature(PackageManager.FEATURE_SCREEN_PORTRAIT)) {
+            return;
+        }
+
+
+        for (int i = 0; i < 2; i++) {
+            final int orientation = orientationValues[i];
+            mActivity.runOnUiThread(() ->
+                    mActivity.setRequestedOrientation(orientation));
+            mActivity.waitForConfigurationChanged();
+            // Wait for main thread to be idle to make sure layout and draw have been performed
+            // before continuing.
+            mInstrumentation.waitForIdleSync();
+            assertTrue(content.isFocused());
+        }
+    }
+
     private void verifySubPopupPosition(PopupWindow subPopup, int mainAnchorId, int subAnchorId,
             int contentEdgeX, int operatorX, int anchorEdgeX,
             int contentEdgeY, int operatorY, int anchorEdgeY) throws Throwable {