Redirect to output switcher panel to the new dialog
-Redirect for Cast button -Send intent when call MediaOutputPanel::create() -Return null to finish the activity Bug: 172178632 Test: make -j50 RunSettingsRoboTests Change-Id: I1038e237113f433c847aff98a45b1dd6089d80a8
This commit is contained in:
@@ -44,6 +44,7 @@ import com.android.settings.Utils;
|
|||||||
import com.android.settingslib.media.InfoMediaDevice;
|
import com.android.settingslib.media.InfoMediaDevice;
|
||||||
import com.android.settingslib.media.LocalMediaManager;
|
import com.android.settingslib.media.LocalMediaManager;
|
||||||
import com.android.settingslib.media.MediaDevice;
|
import com.android.settingslib.media.MediaDevice;
|
||||||
|
import com.android.settingslib.media.MediaOutputSliceConstants;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -72,7 +73,12 @@ public class MediaOutputPanel implements PanelContent, LocalMediaManager.DeviceC
|
|||||||
private MediaController mMediaController;
|
private MediaController mMediaController;
|
||||||
|
|
||||||
public static MediaOutputPanel create(Context context, String packageName) {
|
public static MediaOutputPanel create(Context context, String packageName) {
|
||||||
return new MediaOutputPanel(context, packageName);
|
// Redirect to new media output dialog
|
||||||
|
context.sendBroadcast(new Intent()
|
||||||
|
.setPackage(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME)
|
||||||
|
.setAction(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
|
||||||
|
.putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME, packageName));
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MediaOutputPanel(Context context, String packageName) {
|
private MediaOutputPanel(Context context, String packageName) {
|
||||||
|
@@ -442,12 +442,14 @@ public class PanelFragment extends Fragment {
|
|||||||
if (mLayoutView != null) {
|
if (mLayoutView != null) {
|
||||||
mLayoutView.getViewTreeObserver().removeOnGlobalLayoutListener(mPanelLayoutListener);
|
mLayoutView.getViewTreeObserver().removeOnGlobalLayoutListener(mPanelLayoutListener);
|
||||||
}
|
}
|
||||||
mMetricsProvider.action(
|
if (mPanel != null) {
|
||||||
0 /* attribution */,
|
mMetricsProvider.action(
|
||||||
SettingsEnums.PAGE_HIDE,
|
0 /* attribution */,
|
||||||
mPanel.getMetricsCategory(),
|
SettingsEnums.PAGE_HIDE,
|
||||||
mPanelClosedKey,
|
mPanel.getMetricsCategory(),
|
||||||
0 /* value */);
|
mPanelClosedKey,
|
||||||
|
0 /* value */);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
@@ -1,337 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2019 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.panel;
|
|
||||||
|
|
||||||
import static com.android.settings.media.MediaOutputSlice.MEDIA_PACKAGE_NAME;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
|
||||||
import static org.mockito.Mockito.doReturn;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
import static org.mockito.Mockito.never;
|
|
||||||
import static org.mockito.Mockito.spy;
|
|
||||||
import static org.mockito.Mockito.times;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.media.MediaDescription;
|
|
||||||
import android.media.MediaMetadata;
|
|
||||||
import android.media.session.MediaController;
|
|
||||||
import android.media.session.MediaSessionManager;
|
|
||||||
import android.media.session.PlaybackState;
|
|
||||||
import android.net.Uri;
|
|
||||||
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.slices.CustomSliceRegistry;
|
|
||||||
import com.android.settingslib.media.InfoMediaDevice;
|
|
||||||
import com.android.settingslib.media.LocalMediaManager;
|
|
||||||
import com.android.settingslib.media.PhoneMediaDevice;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.MockitoAnnotations;
|
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
|
||||||
public class MediaOutputPanelTest {
|
|
||||||
|
|
||||||
private static final String TEST_PACKAGENAME = "com.test.packagename";
|
|
||||||
private static final String TEST_PACKAGENAME2 = "com.test.packagename2";
|
|
||||||
private static final String TEST_ARTIST = "test_artist";
|
|
||||||
private static final String TEST_SONG = "test_song";
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private MediaSessionManager mMediaSessionManager;
|
|
||||||
@Mock
|
|
||||||
private MediaController mMediaController;
|
|
||||||
@Mock
|
|
||||||
private MediaMetadata mMediaMetadata;
|
|
||||||
@Mock
|
|
||||||
private LocalMediaManager mLocalMediaManager;
|
|
||||||
@Mock
|
|
||||||
private PanelContentCallback mCallback;
|
|
||||||
@Mock
|
|
||||||
private PlaybackState mPlaybackState;
|
|
||||||
|
|
||||||
private MediaOutputPanel mPanel;
|
|
||||||
private Context mContext;
|
|
||||||
private List<MediaController> mMediaControllers = new ArrayList<>();
|
|
||||||
private ArgumentCaptor<MediaController.Callback> mControllerCbs =
|
|
||||||
ArgumentCaptor.forClass(MediaController.Callback.class);
|
|
||||||
private MediaDescription mMediaDescription;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
MockitoAnnotations.initMocks(this);
|
|
||||||
|
|
||||||
mContext = spy(RuntimeEnvironment.application);
|
|
||||||
|
|
||||||
mMediaControllers.add(mMediaController);
|
|
||||||
when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGENAME);
|
|
||||||
when(mMediaSessionManager.getActiveSessions(any())).thenReturn(mMediaControllers);
|
|
||||||
when(mContext.getApplicationContext()).thenReturn(mContext);
|
|
||||||
doReturn(mMediaSessionManager).when(mContext).getSystemService(MediaSessionManager.class);
|
|
||||||
MediaDescription.Builder builder = new MediaDescription.Builder();
|
|
||||||
builder.setTitle(TEST_SONG);
|
|
||||||
builder.setSubtitle(TEST_ARTIST);
|
|
||||||
mMediaDescription = builder.build();
|
|
||||||
when(mMediaMetadata.getDescription()).thenReturn(mMediaDescription);
|
|
||||||
|
|
||||||
mPanel = MediaOutputPanel.create(mContext, TEST_PACKAGENAME);
|
|
||||||
mPanel.mLocalMediaManager = mLocalMediaManager;
|
|
||||||
mPanel.registerCallback(mCallback);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getSlices_containsNecessarySlices() {
|
|
||||||
final List<Uri> uris = mPanel.getSlices();
|
|
||||||
|
|
||||||
assertThat(uris).containsExactly(CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getSlices_verifyPackageName_isEqual() {
|
|
||||||
final List<Uri> uris = mPanel.getSlices();
|
|
||||||
|
|
||||||
assertThat(uris.get(0).getQueryParameter(MEDIA_PACKAGE_NAME)).isEqualTo(TEST_PACKAGENAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getSeeMoreIntent_isNull() {
|
|
||||||
assertThat(mPanel.getSeeMoreIntent()).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onStart_shouldRegisterCallback() {
|
|
||||||
mPanel.onStart();
|
|
||||||
|
|
||||||
verify(mMediaController).registerCallback(any());
|
|
||||||
verify(mLocalMediaManager).registerCallback(any());
|
|
||||||
verify(mLocalMediaManager).startScan();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onStart_activeSession_verifyOnHeaderChanged() {
|
|
||||||
mPanel.onStart();
|
|
||||||
|
|
||||||
verify(mCallback).onHeaderChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onStart_noMatchedActiveSession_verifyNeverOnHeaderChanged() {
|
|
||||||
when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGENAME2);
|
|
||||||
mPanel.onStart();
|
|
||||||
|
|
||||||
verify(mCallback, never()).onHeaderChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onStop_shouldUnregisterCallback() {
|
|
||||||
mPanel.onStop();
|
|
||||||
|
|
||||||
verify(mLocalMediaManager).unregisterCallback(any());
|
|
||||||
verify(mLocalMediaManager).stopScan();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onSelectedDeviceStateChanged_shouldDispatchCustomButtonStateChanged() {
|
|
||||||
mPanel.onSelectedDeviceStateChanged(null, 0);
|
|
||||||
|
|
||||||
verify(mCallback).onCustomizedButtonStateChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onDeviceListUpdate_shouldDispatchCustomButtonStateChanged() {
|
|
||||||
mPanel.onDeviceListUpdate(null);
|
|
||||||
|
|
||||||
verify(mCallback).onCustomizedButtonStateChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onDeviceAttributesChanged_shouldDispatchCustomButtonStateChanged() {
|
|
||||||
mPanel.onDeviceAttributesChanged();
|
|
||||||
|
|
||||||
verify(mCallback).onCustomizedButtonStateChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void currentConnectDeviceIsInfoDevice_useCustomButtonIsTrue() {
|
|
||||||
final InfoMediaDevice infoMediaDevice = mock(InfoMediaDevice.class);
|
|
||||||
when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(infoMediaDevice);
|
|
||||||
|
|
||||||
mPanel.onDeviceAttributesChanged();
|
|
||||||
|
|
||||||
assertThat(mPanel.isCustomizedButtonUsed()).isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void currentConnectDeviceIsNotInfoDevice_useCustomButtonIsFalse() {
|
|
||||||
final PhoneMediaDevice phoneMediaDevice = mock(PhoneMediaDevice.class);
|
|
||||||
when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(phoneMediaDevice);
|
|
||||||
|
|
||||||
mPanel.onDeviceAttributesChanged();
|
|
||||||
|
|
||||||
assertThat(mPanel.isCustomizedButtonUsed()).isFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getTitle_withMetadata_returnSongName() {
|
|
||||||
mPanel.onStart();
|
|
||||||
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
|
||||||
|
|
||||||
assertThat(mPanel.getTitle()).isEqualTo(TEST_SONG);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getTitle_noMetadata_returnDefaultString() {
|
|
||||||
when(mMediaController.getMetadata()).thenReturn(null);
|
|
||||||
|
|
||||||
assertThat(mPanel.getTitle()).isEqualTo(mContext.getText(R.string.media_volume_title));
|
|
||||||
}
|
|
||||||
@Test
|
|
||||||
public void getTitle_noPackageName_returnDefaultString() {
|
|
||||||
mPanel = MediaOutputPanel.create(mContext, null);
|
|
||||||
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
|
||||||
|
|
||||||
assertThat(mPanel.getTitle()).isEqualTo(mContext.getText(R.string.media_volume_title));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getTitle_noController_defaultString() {
|
|
||||||
mMediaControllers.clear();
|
|
||||||
when(mMediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST)).thenReturn(TEST_ARTIST);
|
|
||||||
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
|
||||||
mPanel = MediaOutputPanel.create(mContext, TEST_PACKAGENAME);
|
|
||||||
|
|
||||||
assertThat(mPanel.getTitle()).isEqualTo(mContext.getText(R.string.media_volume_title));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getSubTitle_withMetadata_returnArtistName() {
|
|
||||||
mPanel.onStart();
|
|
||||||
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
|
||||||
|
|
||||||
assertThat(mPanel.getSubTitle()).isEqualTo(TEST_ARTIST);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getSubTitle_noMetadata_returnDefault() {
|
|
||||||
when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGENAME);
|
|
||||||
when(mMediaController.getMetadata()).thenReturn(null);
|
|
||||||
|
|
||||||
assertThat(mPanel.getSubTitle()).isEqualTo(mContext.getText(
|
|
||||||
R.string.media_output_panel_title));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getSubTitle_noPackageName_returnDefault() {
|
|
||||||
mPanel = MediaOutputPanel.create(mContext, null);
|
|
||||||
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
|
||||||
|
|
||||||
assertThat(mPanel.getSubTitle()).isEqualTo(mContext.getText(
|
|
||||||
R.string.media_output_panel_title));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getSubTitle_noController_returnDefault() {
|
|
||||||
mMediaControllers.clear();
|
|
||||||
mPanel = MediaOutputPanel.create(mContext, TEST_PACKAGENAME);
|
|
||||||
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
|
||||||
|
|
||||||
assertThat(mPanel.getSubTitle()).isEqualTo(mContext.getText(
|
|
||||||
R.string.media_output_panel_title));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onClickCustomizedButton_shouldReleaseSession() {
|
|
||||||
mPanel.onClickCustomizedButton();
|
|
||||||
|
|
||||||
verify(mLocalMediaManager).releaseSession();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onMetadataChanged_verifyCallOnHeaderChanged() {
|
|
||||||
mPanel.onStart();
|
|
||||||
verify(mCallback).onHeaderChanged();
|
|
||||||
verify(mMediaController).registerCallback(mControllerCbs.capture());
|
|
||||||
final MediaController.Callback controllerCallbacks = mControllerCbs.getValue();
|
|
||||||
|
|
||||||
controllerCallbacks.onMetadataChanged(mMediaMetadata);
|
|
||||||
|
|
||||||
verify(mCallback, times(2)).onHeaderChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onPlaybackStateChanged_stateFromPlayingToStopped_verifyCallForceClose() {
|
|
||||||
mPanel.onStart();
|
|
||||||
verify(mMediaController).registerCallback(mControllerCbs.capture());
|
|
||||||
final MediaController.Callback controllerCallbacks = mControllerCbs.getValue();
|
|
||||||
when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_PLAYING);
|
|
||||||
controllerCallbacks.onPlaybackStateChanged(mPlaybackState);
|
|
||||||
verify(mCallback, never()).forceClose();
|
|
||||||
|
|
||||||
when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_STOPPED);
|
|
||||||
controllerCallbacks.onPlaybackStateChanged(mPlaybackState);
|
|
||||||
|
|
||||||
verify(mCallback).forceClose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onPlaybackStateChanged_stateFromPlayingToPaused_verifyCallForceClose() {
|
|
||||||
mPanel.onStart();
|
|
||||||
verify(mMediaController).registerCallback(mControllerCbs.capture());
|
|
||||||
final MediaController.Callback controllerCallbacks = mControllerCbs.getValue();
|
|
||||||
when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_PLAYING);
|
|
||||||
controllerCallbacks.onPlaybackStateChanged(mPlaybackState);
|
|
||||||
verify(mCallback, never()).forceClose();
|
|
||||||
|
|
||||||
when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_PAUSED);
|
|
||||||
controllerCallbacks.onPlaybackStateChanged(mPlaybackState);
|
|
||||||
|
|
||||||
verify(mCallback).forceClose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getViewType_checkType() {
|
|
||||||
assertThat(mPanel.getViewType()).isEqualTo(PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getIcon_mediaControllerIsNull_returnNull() {
|
|
||||||
mMediaControllers.clear();
|
|
||||||
mPanel.onStart();
|
|
||||||
|
|
||||||
assertThat(mPanel.getIcon()).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getIcon_mediaMetadataIsNull_returnNull() {
|
|
||||||
mPanel.onStart();
|
|
||||||
when(mMediaController.getMetadata()).thenReturn(null);
|
|
||||||
|
|
||||||
assertThat(mPanel.getIcon()).isNull();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -19,7 +19,6 @@ package com.android.settings.panel;
|
|||||||
|
|
||||||
import static com.android.settings.panel.SettingsPanelActivity.KEY_MEDIA_PACKAGE_NAME;
|
import static com.android.settings.panel.SettingsPanelActivity.KEY_MEDIA_PACKAGE_NAME;
|
||||||
import static com.android.settings.panel.SettingsPanelActivity.KEY_PANEL_TYPE_ARGUMENT;
|
import static com.android.settings.panel.SettingsPanelActivity.KEY_PANEL_TYPE_ARGUMENT;
|
||||||
import static com.android.settingslib.media.MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@@ -67,13 +66,4 @@ public class PanelFeatureProviderImplTest {
|
|||||||
|
|
||||||
assertThat(panel).isInstanceOf(VolumePanel.class);
|
assertThat(panel).isInstanceOf(VolumePanel.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getPanel_mediaOutputKey_returnsCorrectPanel() {
|
|
||||||
mBundle.putString(KEY_PANEL_TYPE_ARGUMENT, ACTION_MEDIA_OUTPUT);
|
|
||||||
|
|
||||||
final PanelContent panel = mProvider.getPanel(mContext, mBundle);
|
|
||||||
|
|
||||||
assertThat(panel).isInstanceOf(MediaOutputPanel.class);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user