Merge "Tapping on Play media can have up to a 1 minute delay" into rvc-dev
This commit is contained in:
@@ -25,8 +25,8 @@ import android.content.Intent;
|
|||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.media.session.MediaController;
|
import android.media.session.MediaController;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
|
import androidx.annotation.VisibleForTesting;
|
||||||
import androidx.core.graphics.drawable.IconCompat;
|
import androidx.core.graphics.drawable.IconCompat;
|
||||||
import androidx.slice.Slice;
|
import androidx.slice.Slice;
|
||||||
import androidx.slice.builders.ListBuilder;
|
import androidx.slice.builders.ListBuilder;
|
||||||
@@ -36,7 +36,6 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.slices.CustomSliceable;
|
import com.android.settings.slices.CustomSliceable;
|
||||||
import com.android.settings.slices.SliceBackgroundWorker;
|
import com.android.settings.slices.SliceBackgroundWorker;
|
||||||
import com.android.settings.slices.SliceBroadcastReceiver;
|
|
||||||
import com.android.settingslib.media.MediaOutputSliceConstants;
|
import com.android.settingslib.media.MediaOutputSliceConstants;
|
||||||
|
|
||||||
public class MediaOutputIndicatorSlice implements CustomSliceable {
|
public class MediaOutputIndicatorSlice implements CustomSliceable {
|
||||||
@@ -60,8 +59,10 @@ public class MediaOutputIndicatorSlice implements CustomSliceable {
|
|||||||
final IconCompat icon = IconCompat.createWithResource(mContext,
|
final IconCompat icon = IconCompat.createWithResource(mContext,
|
||||||
com.android.internal.R.drawable.ic_settings_bluetooth);
|
com.android.internal.R.drawable.ic_settings_bluetooth);
|
||||||
final CharSequence title = mContext.getText(R.string.media_output_title);
|
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(
|
final SliceAction primarySliceAction = SliceAction.createDeeplink(
|
||||||
getBroadcastIntent(), icon, ListBuilder.ICON_IMAGE, title);
|
primaryActionIntent, icon, ListBuilder.ICON_IMAGE, title);
|
||||||
@ColorInt final int color = Utils.getColorAccentDefaultColor(mContext);
|
@ColorInt final int color = Utils.getColorAccentDefaultColor(mContext);
|
||||||
// To set an empty icon to indent the row
|
// To set an empty icon to indent the row
|
||||||
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
|
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
|
||||||
@@ -74,18 +75,27 @@ public class MediaOutputIndicatorSlice implements CustomSliceable {
|
|||||||
return listBuilder.build();
|
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() {
|
private IconCompat createEmptyIcon() {
|
||||||
final Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
|
final Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
|
||||||
return IconCompat.createWithBitmap(bitmap);
|
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
|
@Override
|
||||||
public Uri getUri() {
|
public Uri getUri() {
|
||||||
return MEDIA_OUTPUT_INDICATOR_SLICE_URI;
|
return MEDIA_OUTPUT_INDICATOR_SLICE_URI;
|
||||||
@@ -103,26 +113,6 @@ public class MediaOutputIndicatorSlice implements CustomSliceable {
|
|||||||
return MediaOutputIndicatorWorker.class;
|
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() {
|
private MediaOutputIndicatorWorker getWorker() {
|
||||||
if (mWorker == null) {
|
if (mWorker == null) {
|
||||||
mWorker = SliceBackgroundWorker.getInstance(getUri());
|
mWorker = SliceBackgroundWorker.getInstance(getUri());
|
||||||
|
@@ -21,11 +21,8 @@ import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDIC
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
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.doReturn;
|
||||||
import static org.mockito.Mockito.never;
|
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -48,14 +45,12 @@ import com.android.settings.Utils;
|
|||||||
import com.android.settings.slices.SliceBackgroundWorker;
|
import com.android.settings.slices.SliceBackgroundWorker;
|
||||||
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
|
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
|
||||||
import com.android.settingslib.bluetooth.LocalBluetoothManager;
|
import com.android.settingslib.bluetooth.LocalBluetoothManager;
|
||||||
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 com.android.settingslib.media.MediaOutputSliceConstants;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.ArgumentCaptor;
|
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
@@ -85,8 +80,6 @@ public class MediaOutputIndicatorSliceTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private MediaController mMediaController;
|
private MediaController mMediaController;
|
||||||
@Mock
|
@Mock
|
||||||
private LocalMediaManager mLocalMediaManager;
|
|
||||||
@Mock
|
|
||||||
private MediaDevice mDevice1;
|
private MediaDevice mDevice1;
|
||||||
@Mock
|
@Mock
|
||||||
private MediaDevice mDevice2;
|
private MediaDevice mDevice2;
|
||||||
@@ -193,46 +186,32 @@ public class MediaOutputIndicatorSliceTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onNotifyChange_noWorker_doNothing() {
|
public void getMediaOutputSliceIntent_withActiveLocalMedia_verifyIntentExtra() {
|
||||||
sMediaOutputIndicatorWorker = null;
|
|
||||||
mMediaOutputIndicatorSlice.onNotifyChange(new Intent());
|
|
||||||
|
|
||||||
verify(mContext, never()).startActivity(any());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onNotifyChange_withActiveLocalMedia_verifyIntentExtra() {
|
|
||||||
when(mMediaController.getSessionToken()).thenReturn(mToken);
|
when(mMediaController.getSessionToken()).thenReturn(mToken);
|
||||||
when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||||
doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
|
doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
|
||||||
.getActiveLocalMediaController();
|
.getActiveLocalMediaController();
|
||||||
|
final Intent intent = mMediaOutputIndicatorSlice.getMediaOutputSliceIntent();
|
||||||
|
|
||||||
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
|
assertThat(TextUtils.equals(TEST_PACKAGE_NAME, intent.getStringExtra(
|
||||||
mMediaOutputIndicatorSlice.onNotifyChange(new Intent());
|
|
||||||
verify(mContext).startActivity(intentCaptor.capture());
|
|
||||||
|
|
||||||
assertThat(TextUtils.equals(TEST_PACKAGE_NAME, intentCaptor.getValue().getStringExtra(
|
|
||||||
MediaOutputSliceConstants.EXTRA_PACKAGE_NAME))).isTrue();
|
MediaOutputSliceConstants.EXTRA_PACKAGE_NAME))).isTrue();
|
||||||
assertThat(TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, intentCaptor.getValue()
|
assertThat(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT).isEqualTo(intent.getAction());
|
||||||
.getPackage())).isTrue();
|
assertThat(TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, intent.getPackage())).isTrue();
|
||||||
assertThat(mToken == intentCaptor.getValue().getExtras().getParcelable(
|
assertThat(mToken == intent.getExtras().getParcelable(
|
||||||
MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN)).isTrue();
|
MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN)).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onNotifyChange_withoutActiveLocalMedia_verifyIntentExtra() {
|
public void getMediaOutputSliceIntent_withoutActiveLocalMedia_verifyIntentExtra() {
|
||||||
doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
|
doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
|
||||||
.getActiveLocalMediaController();
|
.getActiveLocalMediaController();
|
||||||
|
final Intent intent = mMediaOutputIndicatorSlice.getMediaOutputSliceIntent();
|
||||||
|
|
||||||
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
|
assertThat(TextUtils.isEmpty(intent.getStringExtra(
|
||||||
mMediaOutputIndicatorSlice.onNotifyChange(new Intent());
|
|
||||||
verify(mContext).startActivity(intentCaptor.capture());
|
|
||||||
|
|
||||||
assertThat(TextUtils.isEmpty(intentCaptor.getValue().getStringExtra(
|
|
||||||
MediaOutputSliceConstants.EXTRA_PACKAGE_NAME))).isTrue();
|
MediaOutputSliceConstants.EXTRA_PACKAGE_NAME))).isTrue();
|
||||||
assertThat(TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, intentCaptor.getValue()
|
assertThat(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT).isEqualTo(intent.getAction());
|
||||||
.getPackage())).isTrue();
|
assertThat(TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, intent.getPackage())).isTrue();
|
||||||
assertThat(intentCaptor.getValue().getExtras().getParcelable(
|
assertThat(intent.getExtras().getParcelable(
|
||||||
MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN) == null).isTrue();
|
MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN) == null).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user