Loading src/com/android/settings/media/MediaDeviceUpdateWorker.java +8 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.net.Uri; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; Loading @@ -51,6 +52,9 @@ import java.util.concurrent.CopyOnWriteArrayList; public class MediaDeviceUpdateWorker extends SliceBackgroundWorker implements LocalMediaManager.DeviceCallback { private static final String TAG = "MediaDeviceUpdateWorker"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); protected final Context mContext; protected final Collection<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>(); private final DevicesChangedBroadcastReceiver mReceiver; Loading Loading @@ -213,6 +217,10 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker final List<RoutingSessionInfo> sessionInfos = new ArrayList<>(); for (RoutingSessionInfo info : mLocalMediaManager.getActiveMediaSession()) { if (!info.isSystemSession()) { if (DEBUG) { Log.d(TAG, "getActiveRemoteMediaDevice() info : " + info.toString() + ", package name : " + info.getClientPackageName()); } sessionInfos.add(info); } } Loading src/com/android/settings/media/MediaOutputIndicatorWorker.java +3 −19 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.content.IntentFilter; import android.media.AudioManager; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; import android.net.Uri; import android.text.TextUtils; import android.util.Log; Loading Loading @@ -53,6 +52,7 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements LocalMediaManager.DeviceCallback { private static final String TAG = "MediaOutputIndWorker"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final DevicesChangedBroadcastReceiver mReceiver; private final Context mContext; Loading Loading @@ -127,24 +127,8 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements @Nullable MediaController getActiveLocalMediaController() { final MediaSessionManager mMediaSessionManager = mContext.getSystemService( MediaSessionManager.class); for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) { final MediaController.PlaybackInfo pi = controller.getPlaybackInfo(); if (pi == null) { return null; } final PlaybackState playbackState = controller.getPlaybackState(); if (playbackState == null) { return null; } if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL && playbackState.getState() == PlaybackState.STATE_PLAYING) { return controller; } } return null; return MediaOutputUtils.getActiveLocalMediaController(mContext.getSystemService( MediaSessionManager.class)); } @Override Loading src/com/android/settings/media/MediaOutputUtils.java 0 → 100644 +82 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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 com.android.settings.media; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; import android.text.TextUtils; import android.util.Log; import androidx.annotation.Nullable; import com.android.settings.sound.MediaOutputPreferenceController; /** * Utilities that can be shared between {@link MediaOutputIndicatorWorker} and * {@link MediaOutputPreferenceController}. */ public class MediaOutputUtils { private static final String TAG = "MediaOutputUtils"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); /** * Returns a {@link MediaController} that state is playing and type is local playback, * and also have active sessions. */ @Nullable public static MediaController getActiveLocalMediaController( MediaSessionManager mediaSessionManager) { MediaController localController = null; for (MediaController controller : mediaSessionManager.getActiveSessions(null)) { final MediaController.PlaybackInfo pi = controller.getPlaybackInfo(); if (pi == null) { // do nothing continue; } final PlaybackState playbackState = controller.getPlaybackState(); if (playbackState == null) { // do nothing continue; } if (DEBUG) { Log.d(TAG, "getActiveLocalMediaController() package name : " + controller.getPackageName() + ", play back type : " + pi.getPlaybackType() + ", play back state : " + playbackState.getState()); } if (playbackState.getState() != PlaybackState.STATE_PLAYING) { // do nothing continue; } if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE) { if (localController != null && TextUtils.equals(localController.getPackageName(), controller.getPackageName())) { localController = null; } continue; } if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL) { if (localController == null) { localController = controller; } } } return localController; } } src/com/android/settings/sound/MediaOutputPreferenceController.java +3 −25 Original line number Diff line number Diff line Loading @@ -22,14 +22,13 @@ import android.content.Intent; import android.media.AudioManager; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; import android.text.TextUtils; import androidx.annotation.Nullable; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.media.MediaOutputUtils; import com.android.settingslib.Utils; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.HearingAidProfile; Loading @@ -51,7 +50,8 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro public MediaOutputPreferenceController(Context context, String key) { super(context, key); mMediaController = getActiveLocalMediaController(); mMediaController = MediaOutputUtils.getActiveLocalMediaController(context.getSystemService( MediaSessionManager.class)); } @Override Loading Loading @@ -141,26 +141,4 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro } return false; } @Nullable MediaController getActiveLocalMediaController() { final MediaSessionManager mMediaSessionManager = mContext.getSystemService( MediaSessionManager.class); for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) { final MediaController.PlaybackInfo pi = controller.getPlaybackInfo(); if (pi == null) { return null; } final PlaybackState playbackState = controller.getPlaybackState(); if (playbackState == null) { return null; } if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL && playbackState.getState() == PlaybackState.STATE_PLAYING) { return controller; } } return null; } } tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java +25 −0 Original line number Diff line number Diff line Loading @@ -261,4 +261,29 @@ public class MediaOutputIndicatorWorkerTest { assertThat(mMediaOutputIndicatorWorker.getActiveLocalMediaController()).isNull(); } @Test public void getActiveLocalMediaController_bothHaveRemoteMediaAndLocalMedia_returnNull() { final MediaController.PlaybackInfo playbackInfo = new MediaController.PlaybackInfo( MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE, VolumeProvider.VOLUME_CONTROL_ABSOLUTE, 100, 10, new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build(), null); final PlaybackState playbackState = new PlaybackState.Builder() .setState(PlaybackState.STATE_PLAYING, 0, 1) .build(); final MediaController remoteMediaController = mock(MediaController.class); mMediaControllers.add(remoteMediaController); initPlayback(); when(mMediaController.getPlaybackInfo()).thenReturn(mPlaybackInfo); when(mMediaController.getPlaybackState()).thenReturn(mPlaybackState); when(remoteMediaController.getPlaybackInfo()).thenReturn(playbackInfo); when(remoteMediaController.getPlaybackState()).thenReturn(playbackState); assertThat(mMediaOutputIndicatorWorker.getActiveLocalMediaController()).isNull(); } } Loading
src/com/android/settings/media/MediaDeviceUpdateWorker.java +8 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.net.Uri; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; Loading @@ -51,6 +52,9 @@ import java.util.concurrent.CopyOnWriteArrayList; public class MediaDeviceUpdateWorker extends SliceBackgroundWorker implements LocalMediaManager.DeviceCallback { private static final String TAG = "MediaDeviceUpdateWorker"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); protected final Context mContext; protected final Collection<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>(); private final DevicesChangedBroadcastReceiver mReceiver; Loading Loading @@ -213,6 +217,10 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker final List<RoutingSessionInfo> sessionInfos = new ArrayList<>(); for (RoutingSessionInfo info : mLocalMediaManager.getActiveMediaSession()) { if (!info.isSystemSession()) { if (DEBUG) { Log.d(TAG, "getActiveRemoteMediaDevice() info : " + info.toString() + ", package name : " + info.getClientPackageName()); } sessionInfos.add(info); } } Loading
src/com/android/settings/media/MediaOutputIndicatorWorker.java +3 −19 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.content.IntentFilter; import android.media.AudioManager; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; import android.net.Uri; import android.text.TextUtils; import android.util.Log; Loading Loading @@ -53,6 +52,7 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements LocalMediaManager.DeviceCallback { private static final String TAG = "MediaOutputIndWorker"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final DevicesChangedBroadcastReceiver mReceiver; private final Context mContext; Loading Loading @@ -127,24 +127,8 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements @Nullable MediaController getActiveLocalMediaController() { final MediaSessionManager mMediaSessionManager = mContext.getSystemService( MediaSessionManager.class); for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) { final MediaController.PlaybackInfo pi = controller.getPlaybackInfo(); if (pi == null) { return null; } final PlaybackState playbackState = controller.getPlaybackState(); if (playbackState == null) { return null; } if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL && playbackState.getState() == PlaybackState.STATE_PLAYING) { return controller; } } return null; return MediaOutputUtils.getActiveLocalMediaController(mContext.getSystemService( MediaSessionManager.class)); } @Override Loading
src/com/android/settings/media/MediaOutputUtils.java 0 → 100644 +82 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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 com.android.settings.media; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; import android.text.TextUtils; import android.util.Log; import androidx.annotation.Nullable; import com.android.settings.sound.MediaOutputPreferenceController; /** * Utilities that can be shared between {@link MediaOutputIndicatorWorker} and * {@link MediaOutputPreferenceController}. */ public class MediaOutputUtils { private static final String TAG = "MediaOutputUtils"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); /** * Returns a {@link MediaController} that state is playing and type is local playback, * and also have active sessions. */ @Nullable public static MediaController getActiveLocalMediaController( MediaSessionManager mediaSessionManager) { MediaController localController = null; for (MediaController controller : mediaSessionManager.getActiveSessions(null)) { final MediaController.PlaybackInfo pi = controller.getPlaybackInfo(); if (pi == null) { // do nothing continue; } final PlaybackState playbackState = controller.getPlaybackState(); if (playbackState == null) { // do nothing continue; } if (DEBUG) { Log.d(TAG, "getActiveLocalMediaController() package name : " + controller.getPackageName() + ", play back type : " + pi.getPlaybackType() + ", play back state : " + playbackState.getState()); } if (playbackState.getState() != PlaybackState.STATE_PLAYING) { // do nothing continue; } if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE) { if (localController != null && TextUtils.equals(localController.getPackageName(), controller.getPackageName())) { localController = null; } continue; } if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL) { if (localController == null) { localController = controller; } } } return localController; } }
src/com/android/settings/sound/MediaOutputPreferenceController.java +3 −25 Original line number Diff line number Diff line Loading @@ -22,14 +22,13 @@ import android.content.Intent; import android.media.AudioManager; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; import android.text.TextUtils; import androidx.annotation.Nullable; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.media.MediaOutputUtils; import com.android.settingslib.Utils; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.HearingAidProfile; Loading @@ -51,7 +50,8 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro public MediaOutputPreferenceController(Context context, String key) { super(context, key); mMediaController = getActiveLocalMediaController(); mMediaController = MediaOutputUtils.getActiveLocalMediaController(context.getSystemService( MediaSessionManager.class)); } @Override Loading Loading @@ -141,26 +141,4 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro } return false; } @Nullable MediaController getActiveLocalMediaController() { final MediaSessionManager mMediaSessionManager = mContext.getSystemService( MediaSessionManager.class); for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) { final MediaController.PlaybackInfo pi = controller.getPlaybackInfo(); if (pi == null) { return null; } final PlaybackState playbackState = controller.getPlaybackState(); if (playbackState == null) { return null; } if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL && playbackState.getState() == PlaybackState.STATE_PLAYING) { return controller; } } return null; } }
tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java +25 −0 Original line number Diff line number Diff line Loading @@ -261,4 +261,29 @@ public class MediaOutputIndicatorWorkerTest { assertThat(mMediaOutputIndicatorWorker.getActiveLocalMediaController()).isNull(); } @Test public void getActiveLocalMediaController_bothHaveRemoteMediaAndLocalMedia_returnNull() { final MediaController.PlaybackInfo playbackInfo = new MediaController.PlaybackInfo( MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE, VolumeProvider.VOLUME_CONTROL_ABSOLUTE, 100, 10, new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build(), null); final PlaybackState playbackState = new PlaybackState.Builder() .setState(PlaybackState.STATE_PLAYING, 0, 1) .build(); final MediaController remoteMediaController = mock(MediaController.class); mMediaControllers.add(remoteMediaController); initPlayback(); when(mMediaController.getPlaybackInfo()).thenReturn(mPlaybackInfo); when(mMediaController.getPlaybackState()).thenReturn(mPlaybackState); when(remoteMediaController.getPlaybackInfo()).thenReturn(playbackInfo); when(remoteMediaController.getPlaybackState()).thenReturn(playbackState); assertThat(mMediaOutputIndicatorWorker.getActiveLocalMediaController()).isNull(); } }