Add [is|set]IndependentPlaybackConfig TestApi

Tests need to have access to the playback config.

Bug: 150725872
Test: rvc-dev/out/host/linux-x86/ats/android-ats/tools$ ./ats-tradefed
ats-tf> run ats -m AtsCarTests
    -t com.google.android.car.ats.CarMediaManagerTest

Change-Id: Id62f52c13830c70dc017f7a969e6b34a24bff857
diff --git a/car-lib/src/android/car/media/CarMediaManager.java b/car-lib/src/android/car/media/CarMediaManager.java
index 180c6cd..0a8392f 100644
--- a/car-lib/src/android/car/media/CarMediaManager.java
+++ b/car-lib/src/android/car/media/CarMediaManager.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.car.Car;
 import android.car.CarManagerBase;
 import android.content.ComponentName;
@@ -214,4 +215,35 @@
             mCallbackMap.clear();
         }
     }
+
+    /**
+     * Returns whether the browse and playback sources can be changed independently.
+     * @return true if the browse and playback sources can be changed independently, false if it
+     * isn't or if the value could not be determined.
+     * @hide
+     */
+    @TestApi
+    @RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL)
+    public boolean isIndependentPlaybackConfig() {
+        try {
+            return mService.isIndependentPlaybackConfig();
+        } catch (RemoteException e) {
+            return handleRemoteExceptionFromCarService(e, null);
+        }
+    }
+
+    /**
+     * Sets whether the browse and playback sources can be changed independently.
+     * @param independent whether the browse and playback sources can be changed independently.
+     * @hide
+     */
+    @TestApi
+    @RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL)
+    public void setIndependentPlaybackConfig(boolean independent) {
+        try {
+            mService.setIndependentPlaybackConfig(independent);
+        } catch (RemoteException e) {
+            handleRemoteExceptionFromCarService(e);
+        }
+    }
 }
diff --git a/car-lib/src/android/car/media/ICarMedia.aidl b/car-lib/src/android/car/media/ICarMedia.aidl
index 5600b7d..ab73536 100644
--- a/car-lib/src/android/car/media/ICarMedia.aidl
+++ b/car-lib/src/android/car/media/ICarMedia.aidl
@@ -36,4 +36,8 @@
     void unregisterMediaSourceListener(in ICarMediaSourceListener callback, int mode);
     /** Retrieve a list of media sources, ordered by most recently used */
     List<ComponentName> getLastMediaSources(int mode);
+    /** Returns whether the browse and playback sources can be changed independently. */
+    boolean isIndependentPlaybackConfig();
+    /** Sets whether the browse and playback sources can be changed independently. */
+    void setIndependentPlaybackConfig(boolean independent);
 }
diff --git a/service/src/com/android/car/CarMediaService.java b/service/src/com/android/car/CarMediaService.java
index 254a611..9447096 100644
--- a/service/src/com/android/car/CarMediaService.java
+++ b/service/src/com/android/car/CarMediaService.java
@@ -18,10 +18,12 @@
 import static android.car.media.CarMediaManager.MEDIA_SOURCE_MODE_BROWSE;
 import static android.car.media.CarMediaManager.MEDIA_SOURCE_MODE_PLAYBACK;
 
+import android.annotation.TestApi;
 import android.app.ActivityManager;
 import android.car.Car;
 import android.car.media.CarMediaManager;
 import android.car.media.CarMediaManager.MediaSourceChangedListener;
+import android.car.media.CarMediaManager.MediaSourceMode;
 import android.car.media.ICarMedia;
 import android.car.media.ICarMediaSourceListener;
 import android.content.BroadcastReceiver;
@@ -335,7 +337,7 @@
      */
     @Override
     public void setMediaSource(@NonNull ComponentName componentName,
-            @CarMediaManager.MediaSourceMode int mode) {
+            @MediaSourceMode int mode) {
         ICarImpl.assertPermission(mContext, android.Manifest.permission.MEDIA_CONTENT_CONTROL);
         if (Log.isLoggable(CarLog.TAG_MEDIA, Log.DEBUG)) {
             Log.d(CarLog.TAG_MEDIA, "Changing media source to: " + componentName.getPackageName());
@@ -359,7 +361,7 @@
      */
     @Override
     public void registerMediaSourceListener(ICarMediaSourceListener callback,
-            @CarMediaManager.MediaSourceMode int mode) {
+            @MediaSourceMode int mode) {
         ICarImpl.assertPermission(mContext, android.Manifest.permission.MEDIA_CONTENT_CONTROL);
         synchronized (mLock) {
             mMediaSourceListeners[mode].register(callback);
@@ -371,7 +373,7 @@
      */
     @Override
     public void unregisterMediaSourceListener(ICarMediaSourceListener callback,
-            @CarMediaManager.MediaSourceMode int mode) {
+            @MediaSourceMode int mode) {
         ICarImpl.assertPermission(mContext, android.Manifest.permission.MEDIA_CONTENT_CONTROL);
         synchronized (mLock) {
             mMediaSourceListeners[mode].unregister(callback);
@@ -386,6 +388,26 @@
                 .map(name -> ComponentName.unflattenFromString(name)).collect(Collectors.toList());
     }
 
+    /** See {@link CarMediaManager#isIndependentPlaybackConfig}. */
+    @Override
+    @TestApi
+    public boolean isIndependentPlaybackConfig() {
+        ICarImpl.assertPermission(mContext, android.Manifest.permission.MEDIA_CONTENT_CONTROL);
+        synchronized (mLock) {
+            return mIndependentPlaybackConfig;
+        }
+    }
+
+    /** See {@link CarMediaManager#setIndependentPlaybackConfig}. */
+    @Override
+    @TestApi
+    public void setIndependentPlaybackConfig(boolean independent) {
+        ICarImpl.assertPermission(mContext, android.Manifest.permission.MEDIA_CONTENT_CONTROL);
+        synchronized (mLock) {
+            mIndependentPlaybackConfig = independent;
+        }
+    }
+
     /**
      * Sets user lock / unlocking status on main thread. This is coming from system server through
      * ICar binder call.