MediaSession2: Send session info when a controller is connected

Bug: 72547163
Test: Run all tests once
Change-Id: I55730536cce6a938f8117abb433b492ac8e36bfc
diff --git a/packages/MediaComponents/test/AndroidManifest.xml b/packages/MediaComponents/test/AndroidManifest.xml
index 30bac87..48e4292 100644
--- a/packages/MediaComponents/test/AndroidManifest.xml
+++ b/packages/MediaComponents/test/AndroidManifest.xml
@@ -20,14 +20,7 @@
     <application android:label="Media API Test">
         <uses-library android:name="android.test.runner" />
 
-        <activity android:name="android.widget2.VideoView2TestActivity"
-                  android:configChanges="keyboardHidden|orientation|screenSize"
-                  android:label="VideoView2TestActivity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>
-          </activity>
+        <activity android:name="android.media.MockActivity" />
 
         <!-- Keep the test services synced together with the TestUtils.java -->
         <service android:name="android.media.MockMediaSessionService2">
diff --git a/packages/MediaComponents/test/src/android/media/MediaController2Test.java b/packages/MediaComponents/test/src/android/media/MediaController2Test.java
index f1fdf2e..139cc65 100644
--- a/packages/MediaComponents/test/src/android/media/MediaController2Test.java
+++ b/packages/MediaComponents/test/src/android/media/MediaController2Test.java
@@ -16,7 +16,9 @@
 
 package android.media;
 
+import android.app.PendingIntent;
 import android.content.Context;
+import android.content.Intent;
 import android.media.MediaPlayerInterface.PlaybackListener;
 import android.media.MediaSession2.Command;
 import android.media.MediaSession2.ControllerInfo;
@@ -56,7 +58,9 @@
 @FlakyTest
 public class MediaController2Test extends MediaSession2TestBase {
     private static final String TAG = "MediaController2Test";
+    private static final int DEFAULT_RATING_TYPE = Rating2.RATING_5_STARS;
 
+    PendingIntent mIntent;
     MediaSession2 mSession;
     MediaController2 mController;
     MockPlayer mPlayer;
@@ -65,10 +69,15 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
+        final Intent sessionActivity = new Intent(mContext, MockActivity.class);
         // Create this test specific MediaSession2 to use our own Handler.
+        mIntent = PendingIntent.getActivity(mContext, 0, sessionActivity, 0);
+
         mPlayer = new MockPlayer(1);
         mSession = new MediaSession2.Builder(mContext, mPlayer)
                 .setSessionCallback(sHandlerExecutor, new SessionCallback(mContext))
+                .setRatingType(DEFAULT_RATING_TYPE)
+                .setSessionActivity(mIntent)
                 .setId(TAG).build();
         mController = createController(mSession.getToken());
         TestServiceRegistry.getInstance().setHandler(sHandler);
@@ -199,6 +208,18 @@
     }
 
     @Test
+    public void testGetRatingType() throws InterruptedException {
+        assertEquals(DEFAULT_RATING_TYPE, mController.getRatingType());
+    }
+
+    @Test
+    public void testGetSessionActivity() throws InterruptedException {
+        PendingIntent sessionActivity = mController.getSessionActivity();
+        assertEquals(mContext.getPackageName(), sessionActivity.getCreatorPackage());
+        assertEquals(Process.myUid(), sessionActivity.getCreatorUid());
+    }
+
+    @Test
     public void testGetSetPlaylistParams() throws Exception {
         final PlaylistParams params = new PlaylistParams(mContext,
                 PlaylistParams.REPEAT_MODE_ALL,
diff --git a/packages/MediaComponents/test/src/android/media/MediaSession2Test.java b/packages/MediaComponents/test/src/android/media/MediaSession2Test.java
index 43a6c2c..b00633b 100644
--- a/packages/MediaComponents/test/src/android/media/MediaSession2Test.java
+++ b/packages/MediaComponents/test/src/android/media/MediaSession2Test.java
@@ -27,6 +27,9 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.MediaController2.PlaybackInfo;
 import android.media.MediaPlayerInterface.PlaybackListener;
 import android.media.MediaSession2.Builder;
 import android.media.MediaSession2.Command;
@@ -99,17 +102,15 @@
 
     @Test
     public void testSetPlayer() throws Exception {
-        sHandler.postAndSync(() -> {
-            MockPlayer player = new MockPlayer(0);
-            // Test if setPlayer doesn't crash with various situations.
-            mSession.setPlayer(mPlayer);
-            mSession.setPlayer(player);
-            mSession.close();
-        });
+        MockPlayer player = new MockPlayer(0);
+        // Test if setPlayer doesn't crash with various situations.
+        mSession.setPlayer(mPlayer);
+        mSession.setPlayer(player);
+        mSession.close();
     }
 
     @Test
-    public void testSetPlayerWithVolumeProvider() throws Exception {
+    public void testSetPlayer_playbackInfo() throws Exception {
         MockPlayer player = new MockPlayer(0);
         AudioAttributes attrs = new AudioAttributes.Builder()
                 .setContentType(CONTENT_TYPE_MUSIC)
@@ -125,7 +126,7 @@
         final CountDownLatch latch = new CountDownLatch(1);
         final TestControllerCallbackInterface callback = new TestControllerCallbackInterface() {
             @Override
-            public void onPlaybackInfoChanged(MediaController2.PlaybackInfo info) {
+            public void onPlaybackInfoChanged(PlaybackInfo info) {
                 assertEquals(MediaController2.PlaybackInfo.PLAYBACK_TYPE_REMOTE,
                         info.getPlaybackType());
                 assertEquals(attrs, info.getAudioAttributes());
@@ -136,18 +137,30 @@
             }
         };
 
+        mSession.setPlayer(player);
+
         final MediaController2 controller = createController(mSession.getToken(), true, callback);
-        assertNull(controller.getPlaybackInfo());
+        PlaybackInfo info = controller.getPlaybackInfo();
+        assertNotNull(info);
+        assertEquals(PlaybackInfo.PLAYBACK_TYPE_LOCAL, info.getPlaybackType());
+        assertEquals(attrs, info.getAudioAttributes());
+        AudioManager manager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        int localVolumeControlType = manager.isVolumeFixed()
+                ? VolumeProvider2.VOLUME_CONTROL_FIXED : VolumeProvider2.VOLUME_CONTROL_ABSOLUTE;
+        assertEquals(localVolumeControlType, info.getControlType());
+        assertEquals(manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), info.getMaxVolume());
+        assertEquals(manager.getStreamVolume(AudioManager.STREAM_MUSIC), info.getCurrentVolume());
 
         mSession.setPlayer(player, volumeProvider);
         assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
 
-        MediaController2.PlaybackInfo infoOut = controller.getPlaybackInfo();
-        assertEquals(MediaController2.PlaybackInfo.PLAYBACK_TYPE_REMOTE, infoOut.getPlaybackType());
-        assertEquals(attrs, infoOut.getAudioAttributes());
-        assertEquals(volumeControlType, infoOut.getPlaybackType());
-        assertEquals(maxVolume, infoOut.getMaxVolume());
-        assertEquals(currentVolume, infoOut.getCurrentVolume());
+        info = controller.getPlaybackInfo();
+        assertNotNull(info);
+        assertEquals(PlaybackInfo.PLAYBACK_TYPE_REMOTE, info.getPlaybackType());
+        assertEquals(attrs, info.getAudioAttributes());
+        assertEquals(volumeControlType, info.getControlType());
+        assertEquals(maxVolume, info.getMaxVolume());
+        assertEquals(currentVolume, info.getCurrentVolume());
     }
 
     @Test
diff --git a/packages/MediaComponents/test/src/android/media/MockActivity.java b/packages/MediaComponents/test/src/android/media/MockActivity.java
new file mode 100644
index 0000000..4627530
--- /dev/null
+++ b/packages/MediaComponents/test/src/android/media/MockActivity.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.app.Activity;
+
+public class MockActivity extends Activity {
+}