Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2905a47f authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 9475114 from 7a5dc9bd to udc-release

Change-Id: I9cd062562e93121f58ba99df3ec230d3fe667c8f
parents c594d398 7a5dc9bd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ public class CsipSetCoordinatorStateMachine extends StateMachine {
    static final int CONNECT = 1;
    static final int DISCONNECT = 2;
    @VisibleForTesting static final int STACK_EVENT = 101;
    private static final int CONNECT_TIMEOUT = 201;
    @VisibleForTesting static final int CONNECT_TIMEOUT = 201;

    // NOTE: the value is not "final" - it is modified in the unit tests
    @VisibleForTesting static int sConnectTimeoutMs = 30000; // 30s
+4 −2
Original line number Diff line number Diff line
@@ -145,7 +145,8 @@ public class BluetoothMapContentObserver {
    boolean mObserverRegistered = false;
    @VisibleForTesting
    BluetoothMapAccountItem mAccount;
    private String mAuthority = null;
    @VisibleForTesting
    String mAuthority = null;

    // Default supported feature bit mask is 0x1f
    private int mMapSupportedFeatures = BluetoothMapUtils.MAP_FEATURE_DEFAULT_BITMASK;
@@ -1975,7 +1976,8 @@ public class BluetoothMapContentObserver {
        }
    }

    private void handleContactListChanges(Uri uri) {
    @VisibleForTesting
    void handleContactListChanges(Uri uri) {
        if (uri.getAuthority().equals(mAuthority)) {
            try {
                if (V) {
+6 −0
Original line number Diff line number Diff line
@@ -166,6 +166,9 @@ public class MapClientService extends ProfileService {
    }

    private synchronized void addDeviceToMapAndConnect(BluetoothDevice device) {
        if (Utils.isInstrumentationTestMode()) {
            Log.d(TAG, "addDeviceToMapAndConnect: device=" + device, new Exception());
        }
        // When creating a new statemachine, its state is set to CONNECTING - which will trigger
        // connect.
        MceStateMachine mapStateMachine = new MceStateMachine(this, device);
@@ -365,6 +368,9 @@ public class MapClientService extends ProfileService {
        }
        removeUncleanAccounts();
        mMapInstanceMap.clear();
        if (Utils.isInstrumentationTestMode()) {
            Log.d(TAG, "cleanup() called.", new Exception());
        }
        // TODO(b/72948646): should be moved to stop()
        setMapClientService(null);
    }
+116 −0
Original line number Diff line number Diff line
/*
 * Copyright 2023 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 com.android.bluetooth.audio_util;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.media.MediaDescription;
import android.media.MediaMetadata;
import android.media.session.MediaSession;
import android.media.session.PlaybackState;

import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.ArrayList;
import java.util.List;

@SmallTest
@RunWith(AndroidJUnit4.class)
public class GPMWrapperTest {

    private Context mContext;
    private MediaController mMediaController;

    @Before
    public void setUp() throws Exception {
        mContext = InstrumentationRegistry.getTargetContext();
        mMediaController = mock(MediaController.class);
    }

    @Test
    public void isMetadataSynced_whenQueueIsNull_returnsFalse() {
        when(mMediaController.getQueue()).thenReturn(null);

        GPMWrapper wrapper = new GPMWrapper(mContext, mMediaController, null);

        assertThat(wrapper.isMetadataSynced()).isFalse();
    }

    @Test
    public void isMetadataSynced_whenOutOfSync_returnsFalse() {
        long activeQueueItemId = 3;
        PlaybackState state = new PlaybackState.Builder()
                .setActiveQueueItemId(activeQueueItemId).build();
        when(mMediaController.getPlaybackState()).thenReturn(state);

        List<MediaSession.QueueItem> queue = new ArrayList<>();
        MediaDescription description = new MediaDescription.Builder()
                .setTitle("Title from queue item")
                .build();
        MediaSession.QueueItem queueItem = new MediaSession.QueueItem(
                description, activeQueueItemId);
        queue.add(queueItem);
        when(mMediaController.getQueue()).thenReturn(queue);

        MediaMetadata metadata = new MediaMetadata.Builder()
                .putString(MediaMetadata.METADATA_KEY_TITLE,
                        "Different Title from MediaMetadata")
                .build();
        when(mMediaController.getMetadata()).thenReturn(metadata);

        GPMWrapper wrapper = new GPMWrapper(mContext, mMediaController, null);

        assertThat(wrapper.isMetadataSynced()).isFalse();
    }

    @Test
    public void isMetadataSynced_whenSynced_returnsTrue() {
        String title = "test_title";

        long activeQueueItemId = 3;
        PlaybackState state = new PlaybackState.Builder()
                .setActiveQueueItemId(activeQueueItemId).build();
        when(mMediaController.getPlaybackState()).thenReturn(state);

        List<MediaSession.QueueItem> queue = new ArrayList<>();
        MediaDescription description = new MediaDescription.Builder()
                .setTitle(title)
                .build();
        MediaSession.QueueItem queueItem = new MediaSession.QueueItem(
                description, activeQueueItemId);
        queue.add(queueItem);
        when(mMediaController.getQueue()).thenReturn(queue);

        MediaMetadata metadata = new MediaMetadata.Builder()
                .putString(MediaMetadata.METADATA_KEY_TITLE, title)
                .build();
        when(mMediaController.getMetadata()).thenReturn(metadata);

        GPMWrapper wrapper = new GPMWrapper(mContext, mMediaController, null);

        assertThat(wrapper.isMetadataSynced()).isFalse();
    }
}
+142 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.bluetooth.audio_util;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.*;

import android.content.Context;
@@ -717,4 +719,144 @@ public class MediaPlayerWrapperTest {
        Assert.assertFalse(wrapper.getTimeoutHandler().hasMessages(MSG_TIMEOUT));
        verify(mFailHandler, never()).onTerribleFailure(any(), any(), anyBoolean());
    }

    @Test
    public void pauseCurrent() {
        MediaController.TransportControls transportControls
                = mock(MediaController.TransportControls.class);
        when(mMockController.getTransportControls()).thenReturn(transportControls);
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        wrapper.pauseCurrent();

        verify(transportControls).pause();
    }

    @Test
    public void playCurrent() {
        MediaController.TransportControls transportControls
                = mock(MediaController.TransportControls.class);
        when(mMockController.getTransportControls()).thenReturn(transportControls);
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        wrapper.playCurrent();

        verify(transportControls).play();
    }

    @Test
    public void playItemFromQueue() {
        MediaController.TransportControls transportControls
                = mock(MediaController.TransportControls.class);
        when(mMockController.getTransportControls()).thenReturn(transportControls);
        when(mMockController.getQueue()).thenReturn(new ArrayList<>());
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        long queueItemId = 4;
        wrapper.playItemFromQueue(queueItemId);

        verify(transportControls).skipToQueueItem(queueItemId);
    }

    @Test
    public void rewind() {
        MediaController.TransportControls transportControls
                = mock(MediaController.TransportControls.class);
        when(mMockController.getTransportControls()).thenReturn(transportControls);
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        wrapper.rewind();

        verify(transportControls).rewind();
    }

    @Test
    public void seekTo() {
        MediaController.TransportControls transportControls
                = mock(MediaController.TransportControls.class);
        when(mMockController.getTransportControls()).thenReturn(transportControls);
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        long position = 50;
        wrapper.seekTo(position);

        verify(transportControls).seekTo(position);
    }

    @Test
    public void setPlaybackSpeed() {
        MediaController.TransportControls transportControls
                = mock(MediaController.TransportControls.class);
        when(mMockController.getTransportControls()).thenReturn(transportControls);
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        float speed = 2.0f;
        wrapper.setPlaybackSpeed(speed);

        verify(transportControls).setPlaybackSpeed(speed);
    }

    @Test
    public void skipToNext() {
        MediaController.TransportControls transportControls
                = mock(MediaController.TransportControls.class);
        when(mMockController.getTransportControls()).thenReturn(transportControls);
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        wrapper.skipToNext();

        verify(transportControls).skipToNext();
    }

    @Test
    public void skipToPrevious() {
        MediaController.TransportControls transportControls
                = mock(MediaController.TransportControls.class);
        when(mMockController.getTransportControls()).thenReturn(transportControls);
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        wrapper.skipToPrevious();

        verify(transportControls).skipToPrevious();
    }

    @Test
    public void stopCurrent() {
        MediaController.TransportControls transportControls
                = mock(MediaController.TransportControls.class);
        when(mMockController.getTransportControls()).thenReturn(transportControls);
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        wrapper.stopCurrent();

        verify(transportControls).stop();
    }

    @Test
    public void toggleRepeat_andToggleShuffle_doesNotCrash() {
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        wrapper.toggleRepeat(true);
        wrapper.toggleRepeat(false);
        wrapper.toggleShuffle(true);
        wrapper.toggleShuffle(false);
    }

    @Test
    public void toString_doesNotCrash() {
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapperFactory.wrap(mMockContext, mMockController, mThread.getLooper());

        assertThat(wrapper.toString()).isNotEmpty();
    }
}
Loading