Close panel when media stop
-Add forceClose callback to finish panel
-Add test cases
Bug: 151396986
Test: make -j50 RunSettingsRoboTests
Change-Id: Ic0ac2880a4ff412382816ccb41b4fbb60dbdf519
diff --git a/src/com/android/settings/panel/MediaOutputPanel.java b/src/com/android/settings/panel/MediaOutputPanel.java
index 2a9669a..998cfc8 100644
--- a/src/com/android/settings/panel/MediaOutputPanel.java
+++ b/src/com/android/settings/panel/MediaOutputPanel.java
@@ -33,6 +33,7 @@
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 @@
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 @@
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 989082f..63c2c55 100644
--- a/src/com/android/settings/panel/PanelContentCallback.java
+++ b/src/com/android/settings/panel/PanelContentCallback.java
@@ -32,4 +32,9 @@
* 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 ed5c755..28515fd 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -433,5 +433,16 @@
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 07f01fc..43cecfe 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 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.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 @@
private LocalMediaManager mLocalMediaManager;
@Mock
private PanelContentCallback mCallback;
+ @Mock
+ private PlaybackState mPlaybackState;
private MediaOutputPanel mPanel;
private Context mContext;
@@ -259,4 +263,19 @@
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 07ca48b..9df5af1 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.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 @@
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