Merge "Tapping on Play media can have up to a 1 minute delay" into rvc-dev
diff --git a/src/com/android/settings/media/MediaOutputIndicatorSlice.java b/src/com/android/settings/media/MediaOutputIndicatorSlice.java
index f336f27..63dd2de 100644
--- a/src/com/android/settings/media/MediaOutputIndicatorSlice.java
+++ b/src/com/android/settings/media/MediaOutputIndicatorSlice.java
@@ -25,8 +25,8 @@
 import android.graphics.Bitmap;
 import android.media.session.MediaController;
 import android.net.Uri;
-import android.util.Log;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.slice.Slice;
 import androidx.slice.builders.ListBuilder;
@@ -36,7 +36,6 @@
 import com.android.settings.Utils;
 import com.android.settings.slices.CustomSliceable;
 import com.android.settings.slices.SliceBackgroundWorker;
-import com.android.settings.slices.SliceBroadcastReceiver;
 import com.android.settingslib.media.MediaOutputSliceConstants;
 
 public class MediaOutputIndicatorSlice implements CustomSliceable {
@@ -60,8 +59,10 @@
         final IconCompat icon = IconCompat.createWithResource(mContext,
                 com.android.internal.R.drawable.ic_settings_bluetooth);
         final CharSequence title = mContext.getText(R.string.media_output_title);
+        final PendingIntent primaryActionIntent = PendingIntent.getActivity(mContext,
+                0 /* requestCode */, getMediaOutputSliceIntent(), 0 /* flags */);
         final SliceAction primarySliceAction = SliceAction.createDeeplink(
-                getBroadcastIntent(), icon, ListBuilder.ICON_IMAGE, title);
+                primaryActionIntent, icon, ListBuilder.ICON_IMAGE, title);
         @ColorInt final int color = Utils.getColorAccentDefaultColor(mContext);
         // To set an empty icon to indent the row
         final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
@@ -74,18 +75,27 @@
         return listBuilder.build();
     }
 
+    @VisibleForTesting
+    Intent getMediaOutputSliceIntent() {
+        final MediaController mediaController = getWorker().getActiveLocalMediaController();
+        final Intent intent = new Intent()
+                .setPackage(Utils.SETTINGS_PACKAGE_NAME)
+                .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        if (mediaController != null) {
+            intent.putExtra(MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN,
+                    mediaController.getSessionToken());
+            intent.putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
+                    mediaController.getPackageName());
+        }
+        return intent;
+    }
+
     private IconCompat createEmptyIcon() {
         final Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
         return IconCompat.createWithBitmap(bitmap);
     }
 
-    private PendingIntent getBroadcastIntent() {
-        final Intent intent = new Intent(getUri().toString());
-        intent.setClass(mContext, SliceBroadcastReceiver.class);
-        return PendingIntent.getBroadcast(mContext, 0, intent,
-                PendingIntent.FLAG_UPDATE_CURRENT);
-    }
-
     @Override
     public Uri getUri() {
         return MEDIA_OUTPUT_INDICATOR_SLICE_URI;
@@ -103,26 +113,6 @@
         return MediaOutputIndicatorWorker.class;
     }
 
-    @Override
-    public void onNotifyChange(Intent i) {
-        if (getWorker() == null) {
-            Log.d(TAG, "onNotifyChange: Worker is null");
-            return;
-        }
-        final MediaController mediaController = getWorker().getActiveLocalMediaController();
-        final Intent intent = new Intent()
-                .setPackage(Utils.SETTINGS_PACKAGE_NAME)
-                .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
-                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        if (mediaController != null) {
-            intent.putExtra(MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN,
-                    mediaController.getSessionToken());
-            intent.putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
-                    mediaController.getPackageName());
-        }
-        mContext.startActivity(intent);
-    }
-
     private MediaOutputIndicatorWorker getWorker() {
         if (mWorker == null) {
             mWorker = SliceBackgroundWorker.getInstance(getUri());
diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java
index 55cc4cd..1fc3910 100644
--- a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java
+++ b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java
@@ -21,11 +21,8 @@
 
 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.never;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
@@ -48,14 +45,12 @@
 import com.android.settings.slices.SliceBackgroundWorker;
 import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.media.LocalMediaManager;
 import com.android.settingslib.media.MediaDevice;
 import com.android.settingslib.media.MediaOutputSliceConstants;
 
 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;
@@ -85,8 +80,6 @@
     @Mock
     private MediaController mMediaController;
     @Mock
-    private LocalMediaManager mLocalMediaManager;
-    @Mock
     private MediaDevice mDevice1;
     @Mock
     private MediaDevice mDevice2;
@@ -193,46 +186,32 @@
     }
 
     @Test
-    public void onNotifyChange_noWorker_doNothing() {
-        sMediaOutputIndicatorWorker = null;
-        mMediaOutputIndicatorSlice.onNotifyChange(new Intent());
-
-        verify(mContext, never()).startActivity(any());
-    }
-
-    @Test
-    public void onNotifyChange_withActiveLocalMedia_verifyIntentExtra() {
+    public void getMediaOutputSliceIntent_withActiveLocalMedia_verifyIntentExtra() {
         when(mMediaController.getSessionToken()).thenReturn(mToken);
         when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
         doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
                 .getActiveLocalMediaController();
+        final Intent intent = mMediaOutputIndicatorSlice.getMediaOutputSliceIntent();
 
-        final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-        mMediaOutputIndicatorSlice.onNotifyChange(new Intent());
-        verify(mContext).startActivity(intentCaptor.capture());
-
-        assertThat(TextUtils.equals(TEST_PACKAGE_NAME, intentCaptor.getValue().getStringExtra(
+        assertThat(TextUtils.equals(TEST_PACKAGE_NAME, intent.getStringExtra(
                 MediaOutputSliceConstants.EXTRA_PACKAGE_NAME))).isTrue();
-        assertThat(TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, intentCaptor.getValue()
-                .getPackage())).isTrue();
-        assertThat(mToken == intentCaptor.getValue().getExtras().getParcelable(
+        assertThat(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT).isEqualTo(intent.getAction());
+        assertThat(TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, intent.getPackage())).isTrue();
+        assertThat(mToken == intent.getExtras().getParcelable(
                 MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN)).isTrue();
     }
 
     @Test
-    public void onNotifyChange_withoutActiveLocalMedia_verifyIntentExtra() {
+    public void getMediaOutputSliceIntent_withoutActiveLocalMedia_verifyIntentExtra() {
         doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
                 .getActiveLocalMediaController();
+        final Intent intent = mMediaOutputIndicatorSlice.getMediaOutputSliceIntent();
 
-        final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-        mMediaOutputIndicatorSlice.onNotifyChange(new Intent());
-        verify(mContext).startActivity(intentCaptor.capture());
-
-        assertThat(TextUtils.isEmpty(intentCaptor.getValue().getStringExtra(
+        assertThat(TextUtils.isEmpty(intent.getStringExtra(
                 MediaOutputSliceConstants.EXTRA_PACKAGE_NAME))).isTrue();
-        assertThat(TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, intentCaptor.getValue()
-                .getPackage())).isTrue();
-        assertThat(intentCaptor.getValue().getExtras().getParcelable(
+        assertThat(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT).isEqualTo(intent.getAction());
+        assertThat(TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, intent.getPackage())).isTrue();
+        assertThat(intent.getExtras().getParcelable(
                 MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN) == null).isTrue();
     }