/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.support.v4.media.session; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import android.os.Bundle; import android.os.Parcel; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; /** * Test {@link PlaybackStateCompat}. */ @RunWith(AndroidJUnit4.class) public class PlaybackStateCompatTest { private static final long TEST_POSITION = 20000L; private static final long TEST_BUFFERED_POSITION = 15000L; private static final long TEST_UPDATE_TIME = 100000L; private static final long TEST_ACTIONS = PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_STOP | PlaybackStateCompat.ACTION_SEEK_TO; private static final long TEST_QUEUE_ITEM_ID = 23L; private static final float TEST_PLAYBACK_SPEED = 3.0f; private static final float TEST_PLAYBACK_SPEED_ON_REWIND = -2.0f; private static final float DELTA = 1e-7f; private static final int TEST_ERROR_CODE = PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED; private static final String TEST_ERROR_MSG = "test-error-msg"; private static final String TEST_CUSTOM_ACTION = "test-custom-action"; private static final String TEST_CUSTOM_ACTION_NAME = "test-custom-action-name"; private static final int TEST_ICON_RESOURCE_ID = android.R.drawable.ic_media_next; private static final String EXTRAS_KEY = "test-key"; private static final String EXTRAS_VALUE = "test-value"; /** * Test default values of {@link PlaybackStateCompat}. */ @Test @SmallTest public void testBuilder() { PlaybackStateCompat state = new PlaybackStateCompat.Builder().build(); assertEquals(new ArrayList<PlaybackStateCompat.CustomAction>(), state.getCustomActions()); assertEquals(0, state.getState()); assertEquals(0L, state.getPosition()); assertEquals(0L, state.getBufferedPosition()); assertEquals(0.0f, state.getPlaybackSpeed(), DELTA); assertEquals(0L, state.getActions()); assertEquals(0, state.getErrorCode()); assertNull(state.getErrorMessage()); assertEquals(0L, state.getLastPositionUpdateTime()); assertEquals(MediaSessionCompat.QueueItem.UNKNOWN_ID, state.getActiveQueueItemId()); assertNull(state.getExtras()); } /** * Test following setter methods of {@link PlaybackStateCompat.Builder}: * {@link PlaybackStateCompat.Builder#setState(int, long, float)} * {@link PlaybackStateCompat.Builder#setActions(long)} * {@link PlaybackStateCompat.Builder#setActiveQueueItemId(long)} * {@link PlaybackStateCompat.Builder#setBufferedPosition(long)} * {@link PlaybackStateCompat.Builder#setErrorMessage(CharSequence)} * {@link PlaybackStateCompat.Builder#setExtras(Bundle)} */ @Test @SmallTest public void testBuilder_setterMethods() { Bundle extras = new Bundle(); extras.putString(EXTRAS_KEY, EXTRAS_VALUE); PlaybackStateCompat state = new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_PLAYING, TEST_POSITION, TEST_PLAYBACK_SPEED) .setActions(TEST_ACTIONS) .setActiveQueueItemId(TEST_QUEUE_ITEM_ID) .setBufferedPosition(TEST_BUFFERED_POSITION) .setErrorMessage(TEST_ERROR_CODE, TEST_ERROR_MSG) .setExtras(extras) .build(); assertEquals(PlaybackStateCompat.STATE_PLAYING, state.getState()); assertEquals(TEST_POSITION, state.getPosition()); assertEquals(TEST_PLAYBACK_SPEED, state.getPlaybackSpeed(), DELTA); assertEquals(TEST_ACTIONS, state.getActions()); assertEquals(TEST_QUEUE_ITEM_ID, state.getActiveQueueItemId()); assertEquals(TEST_BUFFERED_POSITION, state.getBufferedPosition()); assertEquals(TEST_ERROR_CODE, state.getErrorCode()); assertEquals(TEST_ERROR_MSG, state.getErrorMessage().toString()); assertNotNull(state.getExtras()); assertEquals(EXTRAS_VALUE, state.getExtras().get(EXTRAS_KEY)); } /** * Test {@link PlaybackStateCompat.Builder#setState(int, long, float, long)}. */ @Test @SmallTest public void testBuilder_setStateWithUpdateTime() { PlaybackStateCompat state = new PlaybackStateCompat.Builder() .setState( PlaybackStateCompat.STATE_REWINDING, TEST_POSITION, TEST_PLAYBACK_SPEED_ON_REWIND, TEST_UPDATE_TIME) .build(); assertEquals(PlaybackStateCompat.STATE_REWINDING, state.getState()); assertEquals(TEST_POSITION, state.getPosition()); assertEquals(TEST_PLAYBACK_SPEED_ON_REWIND, state.getPlaybackSpeed(), DELTA); assertEquals(TEST_UPDATE_TIME, state.getLastPositionUpdateTime()); } /** * Test {@link PlaybackStateCompat.Builder#addCustomAction(String, String, int)}. */ @Test @SmallTest public void testBuilder_addCustomAction() { ArrayList<PlaybackStateCompat.CustomAction> actions = new ArrayList<>(); PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder(); for (int i = 0; i < 5; i++) { actions.add(new PlaybackStateCompat.CustomAction.Builder( TEST_CUSTOM_ACTION + i, TEST_CUSTOM_ACTION_NAME + i, TEST_ICON_RESOURCE_ID + i) .build()); builder.addCustomAction( TEST_CUSTOM_ACTION + i, TEST_CUSTOM_ACTION_NAME + i, TEST_ICON_RESOURCE_ID + i); } PlaybackStateCompat state = builder.build(); assertEquals(actions.size(), state.getCustomActions().size()); for (int i = 0; i < actions.size(); i++) { assertCustomActionEquals(actions.get(i), state.getCustomActions().get(i)); } } /** * Test {@link PlaybackStateCompat.Builder#addCustomAction(PlaybackStateCompat.CustomAction)}. */ @Test @SmallTest public void testBuilder_addCustomActionWithCustomActionObject() { Bundle extras = new Bundle(); extras.putString(EXTRAS_KEY, EXTRAS_VALUE); ArrayList<PlaybackStateCompat.CustomAction> actions = new ArrayList<>(); PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder(); for (int i = 0; i < 5; i++) { actions.add(new PlaybackStateCompat.CustomAction.Builder( TEST_CUSTOM_ACTION + i, TEST_CUSTOM_ACTION_NAME + i, TEST_ICON_RESOURCE_ID + i) .setExtras(extras) .build()); builder.addCustomAction(new PlaybackStateCompat.CustomAction.Builder( TEST_CUSTOM_ACTION + i, TEST_CUSTOM_ACTION_NAME + i, TEST_ICON_RESOURCE_ID + i) .setExtras(extras) .build()); } PlaybackStateCompat state = builder.build(); assertEquals(actions.size(), state.getCustomActions().size()); for (int i = 0; i < actions.size(); i++) { assertCustomActionEquals(actions.get(i), state.getCustomActions().get(i)); } } /** * Test {@link PlaybackStateCompat#writeToParcel(Parcel, int)}. */ @Test @SmallTest public void testWriteToParcel() { Bundle extras = new Bundle(); extras.putString(EXTRAS_KEY, EXTRAS_VALUE); PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_CONNECTING, TEST_POSITION, TEST_PLAYBACK_SPEED, TEST_UPDATE_TIME) .setActions(TEST_ACTIONS) .setActiveQueueItemId(TEST_QUEUE_ITEM_ID) .setBufferedPosition(TEST_BUFFERED_POSITION) .setErrorMessage(TEST_ERROR_CODE, TEST_ERROR_MSG) .setExtras(extras); for (int i = 0; i < 5; i++) { builder.addCustomAction( new PlaybackStateCompat.CustomAction.Builder( TEST_CUSTOM_ACTION + i, TEST_CUSTOM_ACTION_NAME + i, TEST_ICON_RESOURCE_ID + i) .setExtras(extras) .build()); } PlaybackStateCompat state = builder.build(); Parcel parcel = Parcel.obtain(); state.writeToParcel(parcel, 0); parcel.setDataPosition(0); PlaybackStateCompat stateOut = PlaybackStateCompat.CREATOR.createFromParcel(parcel); assertEquals(PlaybackStateCompat.STATE_CONNECTING, stateOut.getState()); assertEquals(TEST_POSITION, stateOut.getPosition()); assertEquals(TEST_PLAYBACK_SPEED, stateOut.getPlaybackSpeed(), DELTA); assertEquals(TEST_UPDATE_TIME, stateOut.getLastPositionUpdateTime()); assertEquals(TEST_BUFFERED_POSITION, stateOut.getBufferedPosition()); assertEquals(TEST_ACTIONS, stateOut.getActions()); assertEquals(TEST_QUEUE_ITEM_ID, stateOut.getActiveQueueItemId()); assertEquals(TEST_ERROR_CODE, stateOut.getErrorCode()); assertEquals(TEST_ERROR_MSG, stateOut.getErrorMessage()); assertNotNull(stateOut.getExtras()); assertEquals(EXTRAS_VALUE, stateOut.getExtras().get(EXTRAS_KEY)); assertEquals(state.getCustomActions().size(), stateOut.getCustomActions().size()); for (int i = 0; i < state.getCustomActions().size(); i++) { assertCustomActionEquals( state.getCustomActions().get(i), stateOut.getCustomActions().get(i)); } parcel.recycle(); } /** * Test {@link PlaybackStateCompat#describeContents()}. */ @Test @SmallTest public void testDescribeContents() { assertEquals(0, new PlaybackStateCompat.Builder().build().describeContents()); } /** * Test {@link PlaybackStateCompat.CustomAction}. */ @Test @SmallTest public void testCustomAction() { Bundle extras = new Bundle(); extras.putString(EXTRAS_KEY, EXTRAS_VALUE); // Test Builder/Getters PlaybackStateCompat.CustomAction customAction = new PlaybackStateCompat.CustomAction .Builder(TEST_CUSTOM_ACTION, TEST_CUSTOM_ACTION_NAME, TEST_ICON_RESOURCE_ID) .setExtras(extras) .build(); assertEquals(TEST_CUSTOM_ACTION, customAction.getAction()); assertEquals(TEST_CUSTOM_ACTION_NAME, customAction.getName().toString()); assertEquals(TEST_ICON_RESOURCE_ID, customAction.getIcon()); assertEquals(EXTRAS_VALUE, customAction.getExtras().get(EXTRAS_KEY)); // Test describeContents assertEquals(0, customAction.describeContents()); // Test writeToParcel Parcel parcel = Parcel.obtain(); customAction.writeToParcel(parcel, 0); parcel.setDataPosition(0); assertCustomActionEquals( customAction, PlaybackStateCompat.CustomAction.CREATOR.createFromParcel(parcel)); parcel.recycle(); } private void assertCustomActionEquals(PlaybackStateCompat.CustomAction action1, PlaybackStateCompat.CustomAction action2) { assertEquals(action1.getAction(), action2.getAction()); assertEquals(action1.getName(), action2.getName()); assertEquals(action1.getIcon(), action2.getIcon()); // To be the same, two extras should be both null or both not null. assertEquals(action1.getExtras() != null, action2.getExtras() != null); if (action1.getExtras() != null) { assertEquals(action1.getExtras().get(EXTRAS_KEY), action2.getExtras().get(EXTRAS_KEY)); } } }