diff --git a/src/com/android/settings/notification/RemoteVolumePreferenceController.java b/src/com/android/settings/notification/RemoteVolumePreferenceController.java index b4554651cac..eb1988aeab4 100644 --- a/src/com/android/settings/notification/RemoteVolumePreferenceController.java +++ b/src/com/android/settings/notification/RemoteVolumePreferenceController.java @@ -43,7 +43,6 @@ public class RemoteVolumePreferenceController extends VolumeSeekBarPreferenceCon @VisibleForTesting static final int REMOTE_VOLUME = 100; - private MediaSessionManager mMediaSessionManager; private MediaSessions mMediaSessions; @VisibleForTesting MediaSession.Token mActiveToken; @@ -86,28 +85,39 @@ public class RemoteVolumePreferenceController extends VolumeSeekBarPreferenceCon public RemoteVolumePreferenceController(Context context) { super(context, KEY_REMOTE_VOLUME); - mMediaSessionManager = context.getSystemService(MediaSessionManager.class); mMediaSessions = new MediaSessions(context, Looper.getMainLooper(), mCallbacks); + updateToken(getActiveRemoteToken(mContext)); } @Override public int getAvailabilityStatus() { - final List controllers = mMediaSessionManager.getActiveSessions(null); + // Always return true to make it indexed in database + return AVAILABLE_UNSEARCHABLE; + } + + /** + * Return {@link android.media.session.MediaSession.Token} for active remote token, or + * {@code null} if there is no active remote token. + */ + public static MediaSession.Token getActiveRemoteToken(Context context) { + final MediaSessionManager sessionManager = context.getSystemService( + MediaSessionManager.class); + final List controllers = sessionManager.getActiveSessions(null); for (MediaController mediaController : controllers) { final MediaController.PlaybackInfo pi = mediaController.getPlaybackInfo(); if (isRemote(pi)) { - updateToken(mediaController.getSessionToken()); - return AVAILABLE; + return mediaController.getSessionToken(); } } // No active remote media at this point - return CONDITIONALLY_UNAVAILABLE; + return null; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); + mPreference.setVisible(mActiveToken != null); if (mMediaController != null) { updatePreference(mPreference, mActiveToken, mMediaController.getPlaybackInfo()); } diff --git a/src/com/android/settings/panel/VolumePanel.java b/src/com/android/settings/panel/VolumePanel.java index 4ea7fe7561b..2cbf7295141 100644 --- a/src/com/android/settings/panel/VolumePanel.java +++ b/src/com/android/settings/panel/VolumePanel.java @@ -30,6 +30,7 @@ import android.net.Uri; import android.provider.Settings; import com.android.settings.R; +import com.android.settings.notification.RemoteVolumePreferenceController; import java.util.ArrayList; import java.util.List; @@ -54,7 +55,9 @@ public class VolumePanel implements PanelContent { @Override public List getSlices() { final List uris = new ArrayList<>(); - uris.add(VOLUME_REMOTE_MEDIA_URI); + if (RemoteVolumePreferenceController.getActiveRemoteToken(mContext) != null) { + uris.add(VOLUME_REMOTE_MEDIA_URI); + } uris.add(VOLUME_MEDIA_URI); uris.add(MEDIA_OUTPUT_INDICATOR_SLICE_URI); uris.add(VOLUME_CALL_URI); diff --git a/tests/robotests/src/com/android/settings/notification/RemoteVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/RemoteVolumePreferenceControllerTest.java index 1e68de59684..76a5c20e2b0 100644 --- a/tests/robotests/src/com/android/settings/notification/RemoteVolumePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/RemoteVolumePreferenceControllerTest.java @@ -29,10 +29,12 @@ import android.media.session.MediaSession; import android.media.session.MediaSessionManager; import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; @@ -50,9 +52,9 @@ public class RemoteVolumePreferenceControllerTest { private MediaSessionManager mMediaSessionManager; @Mock private MediaController mMediaController; - @Mock + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private ISessionController mStub; - @Mock + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private ISessionController mStub2; private MediaSession.Token mToken; private MediaSession.Token mToken2; @@ -78,22 +80,30 @@ public class RemoteVolumePreferenceControllerTest { mPlaybackInfo = new MediaController.PlaybackInfo( MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE, 0, MAX_POS, CURRENT_POS, null); when(mMediaController.getPlaybackInfo()).thenReturn(mPlaybackInfo); + when(mMediaController.getSessionToken()).thenReturn(mToken); } @Test - public void isAvailable_containRemoteMedia_returnTrue() { + public void getActiveRemoteToken_containRemoteMedia_returnToken() { when(mMediaController.getPlaybackInfo()).thenReturn( new MediaController.PlaybackInfo(MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE, 0, 0, 0, null)); - assertThat(mController.isAvailable()).isTrue(); + assertThat(mController.getActiveRemoteToken(mContext)).isEqualTo(mToken); } @Test - public void isAvailable_noRemoteMedia_returnFalse() { + public void getActiveRemoteToken_noRemoteMedia_returnNull() { when(mMediaController.getPlaybackInfo()).thenReturn( new MediaController.PlaybackInfo(MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL, 0, 0, 0, null)); - assertThat(mController.isAvailable()).isFalse(); + assertThat(mController.getActiveRemoteToken(mContext)).isNull(); + } + + @Test + public void isAvailable_returnAvailableUnsearchable() { + assertThat(mController.isAvailable()).isTrue(); + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE_UNSEARCHABLE); } @Test