Merge "Fix MediaPlayer device-aware session id configuration." into main
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 1ee5aa3..8e9c079 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -931,8 +931,7 @@
      * @return a MediaPlayer object, or null if creation failed
      */
     public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder) {
-        int s = AudioSystem.newAudioSessionId();
-        return create(context, uri, holder, null, s > 0 ? s : 0);
+        return create(context, uri, holder, null, AudioSystem.AUDIO_SESSION_ALLOCATE);
     }
 
     /**
@@ -994,8 +993,7 @@
      * @return a MediaPlayer object, or null if creation failed
      */
     public static MediaPlayer create(Context context, int resid) {
-        int s = AudioSystem.newAudioSessionId();
-        return create(context, resid, null, s > 0 ? s : 0);
+        return create(context, resid, null, AudioSystem.AUDIO_SESSION_ALLOCATE);
     }
 
     /**
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaPlayerUnitTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaPlayerUnitTest.java
index f812d5f..f27a568 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaPlayerUnitTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaPlayerUnitTest.java
@@ -30,6 +30,7 @@
 
 import android.companion.virtual.VirtualDeviceManager;
 import android.content.Context;
+import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.media.MediaPlayer;
 import android.test.mock.MockContext;
@@ -37,6 +38,8 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.mediaframeworktest.R;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -45,6 +48,8 @@
 public class MediaPlayerUnitTest {
 
     private static final int TEST_VIRTUAL_DEVICE_ID = 42;
+    private static final AudioAttributes AUDIO_ATTRIBUTES_MEDIA =
+            new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build();
 
     @Test
     public void testConstructionWithContext_virtualDeviceDefaultAudioPolicy() {
@@ -89,6 +94,49 @@
         assertEquals(anotherSessionId, mediaPlayer.getAudioSessionId());
     }
 
+    @Test
+    public void testCreateFromResource_virtualDeviceDefaultAudioPolicy() {
+        int vdmPlaybackSessionId = getContext().getSystemService(
+                AudioManager.class).generateAudioSessionId();
+        VirtualDeviceManager mockVdm = getMockVirtualDeviceManager(TEST_VIRTUAL_DEVICE_ID,
+                vdmPlaybackSessionId, DEVICE_POLICY_DEFAULT);
+        Context virtualDeviceContext = getVirtualDeviceMockContext(TEST_VIRTUAL_DEVICE_ID, mockVdm);
+
+        MediaPlayer mediaPlayer = MediaPlayer.create(virtualDeviceContext, R.raw.testmp3);
+
+        assertNotEquals(vdmPlaybackSessionId, mediaPlayer.getAudioSessionId());
+        assertTrue(mediaPlayer.getAudioSessionId() > 0);
+    }
+
+    @Test
+    public void testCreateFromResource_virtualDeviceCustomAudioPolicy() {
+        int vdmPlaybackSessionId = getContext().getSystemService(
+                AudioManager.class).generateAudioSessionId();
+        VirtualDeviceManager mockVdm = getMockVirtualDeviceManager(TEST_VIRTUAL_DEVICE_ID,
+                vdmPlaybackSessionId, DEVICE_POLICY_CUSTOM);
+        Context virtualDeviceContext = getVirtualDeviceMockContext(TEST_VIRTUAL_DEVICE_ID, mockVdm);
+
+        MediaPlayer mediaPlayer = MediaPlayer.create(virtualDeviceContext, R.raw.testmp3);
+
+        assertEquals(vdmPlaybackSessionId, mediaPlayer.getAudioSessionId());
+    }
+
+    @Test
+    public void testCreateFromResource_explicitSessionIdOverridesContext() {
+        int vdmPlaybackSessionId = getContext().getSystemService(
+                AudioManager.class).generateAudioSessionId();
+        int anotherSessionId = getContext().getSystemService(
+                AudioManager.class).generateAudioSessionId();
+        VirtualDeviceManager mockVdm = getMockVirtualDeviceManager(TEST_VIRTUAL_DEVICE_ID,
+                vdmPlaybackSessionId, DEVICE_POLICY_CUSTOM);
+        Context virtualDeviceContext = getVirtualDeviceMockContext(TEST_VIRTUAL_DEVICE_ID, mockVdm);
+
+        MediaPlayer mediaPlayer = MediaPlayer.create(virtualDeviceContext, R.raw.testmp3,
+                AUDIO_ATTRIBUTES_MEDIA, anotherSessionId);
+
+        assertEquals(anotherSessionId, mediaPlayer.getAudioSessionId());
+    }
+
     private Context getContext() {
         return InstrumentationRegistry.getInstrumentation().getContext();
     }
@@ -98,6 +146,7 @@
         when(mockContext.getDeviceId()).thenReturn(deviceId);
         when(mockContext.getSystemService(VirtualDeviceManager.class)).thenReturn(vdm);
         when(mockContext.getAttributionSource()).thenReturn(getContext().getAttributionSource());
+        when(mockContext.getResources()).thenReturn(getContext().getResources());
         return mockContext;
     }