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