From 650eda307b30528064dd1b309eed197a73dc853d Mon Sep 17 00:00:00 2001 From: Tim Peng Date: Wed, 18 Mar 2020 10:50:43 +0800 Subject: [PATCH] Close panel when media stop -Add forceClose callback to finish panel -Add test cases Bug: 151396986 Test: make -j50 RunSettingsRoboTests Change-Id: Ic0ac2880a4ff412382816ccb41b4fbb60dbdf519 --- .../settings/panel/MediaOutputPanel.java | 13 ++++++++++--- .../settings/panel/PanelContentCallback.java | 5 +++++ .../android/settings/panel/PanelFragment.java | 11 +++++++++++ .../settings/panel/MediaOutputPanelTest.java | 19 +++++++++++++++++++ .../settings/panel/PanelFragmentTest.java | 14 ++++++++++++++ 5 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/panel/MediaOutputPanel.java b/src/com/android/settings/panel/MediaOutputPanel.java index 2a9669af93f..998cfc842d1 100644 --- a/src/com/android/settings/panel/MediaOutputPanel.java +++ b/src/com/android/settings/panel/MediaOutputPanel.java @@ -33,6 +33,7 @@ import android.graphics.drawable.Drawable; import android.media.MediaMetadata; 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; @@ -66,12 +67,11 @@ public class MediaOutputPanel implements PanelContent, LocalMediaManager.DeviceC private final Context mContext; private final String mPackageName; - private PanelContentCallback mCallback; - private boolean mIsCustomizedButtonUsed = true; - @VisibleForTesting LocalMediaManager mLocalMediaManager; + private PanelContentCallback mCallback; + private boolean mIsCustomizedButtonUsed = true; private MediaSessionManager mMediaSessionManager; private MediaController mMediaController; @@ -255,5 +255,12 @@ public class MediaOutputPanel implements PanelContent, LocalMediaManager.DeviceC mCallback.onHeaderChanged(); } } + + @Override + public void onPlaybackStateChanged(PlaybackState state) { + if (mCallback != null && state.getState() != PlaybackState.STATE_PLAYING) { + mCallback.forceClose(); + } + } }; } diff --git a/src/com/android/settings/panel/PanelContentCallback.java b/src/com/android/settings/panel/PanelContentCallback.java index 989082f9c56..63c2c558ce1 100644 --- a/src/com/android/settings/panel/PanelContentCallback.java +++ b/src/com/android/settings/panel/PanelContentCallback.java @@ -32,4 +32,9 @@ public interface PanelContentCallback { * a group */ void onHeaderChanged(); + + /** + * It will be called when panel requests to close itself. + */ + void forceClose(); } diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java index ed5c7551171..28515fd24d3 100644 --- a/src/com/android/settings/panel/PanelFragment.java +++ b/src/com/android/settings/panel/PanelFragment.java @@ -433,5 +433,16 @@ public class PanelFragment extends Fragment { mHeaderSubtitle.setText(mPanel.getSubTitle()); }); } + + @Override + public void forceClose() { + mPanelClosedKey = PanelClosedKeys.KEY_OTHERS; + getFragmentActivity().finish(); + } + + @VisibleForTesting + FragmentActivity getFragmentActivity() { + return getActivity(); + } } } diff --git a/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java b/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java index 07f01fce1b1..43cecfe9f7b 100644 --- a/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java +++ b/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java @@ -22,6 +22,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -30,6 +31,7 @@ import android.content.Context; 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; @@ -67,6 +69,8 @@ public class MediaOutputPanelTest { private LocalMediaManager mLocalMediaManager; @Mock private PanelContentCallback mCallback; + @Mock + private PlaybackState mPlaybackState; private MediaOutputPanel mPanel; private Context mContext; @@ -259,4 +263,19 @@ public class MediaOutputPanelTest { verify(mCallback).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(); + } } diff --git a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java index 07ca48b93ca..9df5af17cb5 100644 --- a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java +++ b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java @@ -23,6 +23,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.app.settings.SettingsEnums; import android.content.Context; @@ -236,4 +237,17 @@ public class PanelFragmentTest { assertThat(headerTitle.getText()).isEqualTo(TITLE2); assertThat(headerSubtitle.getText()).isEqualTo(SUBTITLE2); } + + @Test + public void forceClose_verifyFinish() { + initFakeActivity(); + verify(mFakePanelContent).registerCallback(mPanelContentCbs.capture()); + final PanelContentCallback panelContentCallbacks = spy(mPanelContentCbs.getValue()); + when(((PanelFragment.LocalPanelCallback) panelContentCallbacks).getFragmentActivity()) + .thenReturn(mActivity); + + panelContentCallbacks.forceClose(); + + verify(mActivity).finish(); + } } \ No newline at end of file