| /* |
| * Copyright 2019 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.avrcpcontroller; |
| |
| import android.bluetooth.BluetoothAdapter; |
| import android.bluetooth.BluetoothDevice; |
| import android.content.Context; |
| import android.net.Uri; |
| import android.support.v4.media.MediaBrowserCompat.MediaItem; |
| import android.support.v4.media.MediaDescriptionCompat; |
| import android.support.v4.media.MediaMetadataCompat; |
| |
| import androidx.test.InstrumentationRegistry; |
| import androidx.test.runner.AndroidJUnit4; |
| |
| import org.junit.After; |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| /** |
| * A test suite for the AvrcpItem class. |
| */ |
| @RunWith(AndroidJUnit4.class) |
| public final class AvrcpItemTest { |
| |
| private BluetoothDevice mDevice; |
| private static final String UUID = "AVRCP-ITEM-TEST-UUID"; |
| |
| // Attribute ID Values from AVRCP Specification |
| private static final int MEDIA_ATTRIBUTE_TITLE = 0x01; |
| private static final int MEDIA_ATTRIBUTE_ARTIST_NAME = 0x02; |
| private static final int MEDIA_ATTRIBUTE_ALBUM_NAME = 0x03; |
| private static final int MEDIA_ATTRIBUTE_TRACK_NUMBER = 0x04; |
| private static final int MEDIA_ATTRIBUTE_TOTAL_TRACK_NUMBER = 0x05; |
| private static final int MEDIA_ATTRIBUTE_GENRE = 0x06; |
| private static final int MEDIA_ATTRIBUTE_PLAYING_TIME = 0x07; |
| private static final int MEDIA_ATTRIBUTE_COVER_ART_HANDLE = 0x08; |
| |
| @Before |
| public void setUp() { |
| Context context = InstrumentationRegistry.getTargetContext(); |
| mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice("AA:BB:CC:DD:EE:FF"); |
| } |
| |
| @After |
| public void tearDown() { |
| mDevice = null; |
| } |
| |
| @Test |
| public void buildAvrcpItem() { |
| String title = "Aaaaargh"; |
| String artist = "Bluetooth"; |
| String album = "The Best Protocol"; |
| long trackNumber = 1; |
| long totalTracks = 12; |
| String genre = "Viking Metal"; |
| long playingTime = 301; |
| String artHandle = "abc123"; |
| Uri uri = Uri.parse("content://somewhere"); |
| Uri uri2 = Uri.parse("content://somewhereelse"); |
| |
| AvrcpItem.Builder builder = new AvrcpItem.Builder(); |
| builder.setItemType(AvrcpItem.TYPE_MEDIA); |
| builder.setType(AvrcpItem.MEDIA_AUDIO); |
| builder.setDevice(mDevice); |
| builder.setPlayable(true); |
| builder.setUid(0); |
| builder.setUuid(UUID); |
| builder.setTitle(title); |
| builder.setArtistName(artist); |
| builder.setAlbumName(album); |
| builder.setTrackNumber(trackNumber); |
| builder.setTotalNumberOfTracks(totalTracks); |
| builder.setGenre(genre); |
| builder.setPlayingTime(playingTime); |
| builder.setCoverArtHandle(artHandle); |
| builder.setCoverArtLocation(uri); |
| |
| AvrcpItem item = builder.build(); |
| |
| Assert.assertEquals(mDevice, item.getDevice()); |
| Assert.assertEquals(true, item.isPlayable()); |
| Assert.assertEquals(false, item.isBrowsable()); |
| Assert.assertEquals(0, item.getUid()); |
| Assert.assertEquals(UUID, item.getUuid()); |
| Assert.assertEquals(null, item.getDisplayableName()); |
| Assert.assertEquals(title, item.getTitle()); |
| Assert.assertEquals(artist, item.getArtistName()); |
| Assert.assertEquals(album, item.getAlbumName()); |
| Assert.assertEquals(trackNumber, item.getTrackNumber()); |
| Assert.assertEquals(totalTracks, item.getTotalNumberOfTracks()); |
| Assert.assertEquals(artHandle, item.getCoverArtHandle()); |
| Assert.assertEquals(uri, item.getCoverArtLocation()); |
| } |
| |
| @Test |
| public void buildAvrcpItemFromAvrcpAttributes() { |
| String title = "Aaaaargh"; |
| String artist = "Bluetooth"; |
| String album = "The Best Protocol"; |
| String trackNumber = "1"; |
| String totalTracks = "12"; |
| String genre = "Viking Metal"; |
| String playingTime = "301"; |
| String artHandle = "abc123"; |
| |
| int[] attrIds = new int[]{ |
| MEDIA_ATTRIBUTE_TITLE, |
| MEDIA_ATTRIBUTE_ARTIST_NAME, |
| MEDIA_ATTRIBUTE_ALBUM_NAME, |
| MEDIA_ATTRIBUTE_TRACK_NUMBER, |
| MEDIA_ATTRIBUTE_TOTAL_TRACK_NUMBER, |
| MEDIA_ATTRIBUTE_GENRE, |
| MEDIA_ATTRIBUTE_PLAYING_TIME, |
| MEDIA_ATTRIBUTE_COVER_ART_HANDLE |
| }; |
| |
| String[] attrMap = new String[]{ |
| title, |
| artist, |
| album, |
| trackNumber, |
| totalTracks, |
| genre, |
| playingTime, |
| artHandle |
| }; |
| |
| AvrcpItem.Builder builder = new AvrcpItem.Builder(); |
| builder.fromAvrcpAttributeArray(attrIds, attrMap); |
| AvrcpItem item = builder.build(); |
| |
| Assert.assertEquals(null, item.getDevice()); |
| Assert.assertEquals(false, item.isPlayable()); |
| Assert.assertEquals(false, item.isBrowsable()); |
| Assert.assertEquals(0, item.getUid()); |
| Assert.assertEquals(null, item.getUuid()); |
| Assert.assertEquals(null, item.getDisplayableName()); |
| Assert.assertEquals(title, item.getTitle()); |
| Assert.assertEquals(artist, item.getArtistName()); |
| Assert.assertEquals(album, item.getAlbumName()); |
| Assert.assertEquals(1, item.getTrackNumber()); |
| Assert.assertEquals(12, item.getTotalNumberOfTracks()); |
| Assert.assertEquals(artHandle, item.getCoverArtHandle()); |
| Assert.assertEquals(null, item.getCoverArtLocation()); |
| } |
| |
| @Test |
| public void buildAvrcpItemFromAvrcpAttributesWithBadIds_badIdsIgnored() { |
| String title = "Aaaaargh"; |
| String artist = "Bluetooth"; |
| String album = "The Best Protocol"; |
| String trackNumber = "1"; |
| String totalTracks = "12"; |
| String genre = "Viking Metal"; |
| String playingTime = "301"; |
| String artHandle = "abc123"; |
| |
| int[] attrIds = new int[]{ |
| MEDIA_ATTRIBUTE_TITLE, |
| MEDIA_ATTRIBUTE_ARTIST_NAME, |
| MEDIA_ATTRIBUTE_ALBUM_NAME, |
| MEDIA_ATTRIBUTE_TRACK_NUMBER, |
| MEDIA_ATTRIBUTE_TOTAL_TRACK_NUMBER, |
| MEDIA_ATTRIBUTE_GENRE, |
| MEDIA_ATTRIBUTE_PLAYING_TIME, |
| MEDIA_ATTRIBUTE_COVER_ART_HANDLE, |
| 75, |
| 76, |
| 77, |
| 78 |
| }; |
| |
| String[] attrMap = new String[]{ |
| title, |
| artist, |
| album, |
| trackNumber, |
| totalTracks, |
| genre, |
| playingTime, |
| artHandle, |
| "ignore me", |
| "ignore me", |
| "ignore me", |
| "ignore me" |
| }; |
| |
| AvrcpItem.Builder builder = new AvrcpItem.Builder(); |
| builder.fromAvrcpAttributeArray(attrIds, attrMap); |
| AvrcpItem item = builder.build(); |
| |
| Assert.assertEquals(null, item.getDevice()); |
| Assert.assertEquals(false, item.isPlayable()); |
| Assert.assertEquals(false, item.isBrowsable()); |
| Assert.assertEquals(0, item.getUid()); |
| Assert.assertEquals(null, item.getUuid()); |
| Assert.assertEquals(null, item.getDisplayableName()); |
| Assert.assertEquals(title, item.getTitle()); |
| Assert.assertEquals(artist, item.getArtistName()); |
| Assert.assertEquals(album, item.getAlbumName()); |
| Assert.assertEquals(1, item.getTrackNumber()); |
| Assert.assertEquals(12, item.getTotalNumberOfTracks()); |
| Assert.assertEquals(artHandle, item.getCoverArtHandle()); |
| Assert.assertEquals(null, item.getCoverArtLocation()); |
| } |
| |
| @Test |
| public void updateCoverArtLocation() { |
| Uri uri = Uri.parse("content://somewhere"); |
| Uri uri2 = Uri.parse("content://somewhereelse"); |
| |
| AvrcpItem.Builder builder = new AvrcpItem.Builder(); |
| builder.setCoverArtLocation(uri); |
| |
| AvrcpItem item = builder.build(); |
| Assert.assertEquals(uri, item.getCoverArtLocation()); |
| |
| item.setCoverArtLocation(uri2); |
| Assert.assertEquals(uri2, item.getCoverArtLocation()); |
| } |
| |
| @Test |
| public void avrcpMediaItem_toMediaMetadata() { |
| String title = "Aaaaargh"; |
| String artist = "Bluetooth"; |
| String album = "The Best Protocol"; |
| long trackNumber = 1; |
| long totalTracks = 12; |
| String genre = "Viking Metal"; |
| long playingTime = 301; |
| String artHandle = "abc123"; |
| Uri uri = Uri.parse("content://somewhere"); |
| |
| AvrcpItem.Builder builder = new AvrcpItem.Builder(); |
| builder.setItemType(AvrcpItem.TYPE_MEDIA); |
| builder.setType(AvrcpItem.MEDIA_AUDIO); |
| builder.setDevice(mDevice); |
| builder.setPlayable(true); |
| builder.setUid(0); |
| builder.setUuid(UUID); |
| builder.setDisplayableName(title); |
| builder.setTitle(title); |
| builder.setArtistName(artist); |
| builder.setAlbumName(album); |
| builder.setTrackNumber(trackNumber); |
| builder.setTotalNumberOfTracks(totalTracks); |
| builder.setGenre(genre); |
| builder.setPlayingTime(playingTime); |
| builder.setCoverArtHandle(artHandle); |
| builder.setCoverArtLocation(uri); |
| |
| AvrcpItem item = builder.build(); |
| MediaMetadataCompat metadata = item.toMediaMetadata(); |
| |
| Assert.assertEquals(UUID, metadata.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID)); |
| Assert.assertEquals(title, |
| metadata.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE)); |
| Assert.assertEquals(title, metadata.getString(MediaMetadataCompat.METADATA_KEY_TITLE)); |
| Assert.assertEquals(artist, metadata.getString(MediaMetadataCompat.METADATA_KEY_ARTIST)); |
| Assert.assertEquals(album, metadata.getString(MediaMetadataCompat.METADATA_KEY_ALBUM)); |
| Assert.assertEquals(trackNumber, |
| metadata.getLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER)); |
| Assert.assertEquals(totalTracks, |
| metadata.getLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS)); |
| Assert.assertEquals(genre, metadata.getString(MediaMetadataCompat.METADATA_KEY_GENRE)); |
| Assert.assertEquals(playingTime, |
| metadata.getLong(MediaMetadataCompat.METADATA_KEY_DURATION)); |
| Assert.assertEquals(uri, |
| Uri.parse(metadata.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI))); |
| Assert.assertEquals(uri, |
| Uri.parse(metadata.getString(MediaMetadataCompat.METADATA_KEY_ART_URI))); |
| Assert.assertEquals(uri, |
| Uri.parse(metadata.getString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI))); |
| Assert.assertEquals(null, |
| metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON)); |
| Assert.assertEquals(null, metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ART)); |
| Assert.assertEquals(null, metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART)); |
| Assert.assertFalse(metadata.containsKey(MediaMetadataCompat.METADATA_KEY_BT_FOLDER_TYPE)); |
| } |
| |
| @Test |
| public void avrcpFolderItem_toMediaMetadata() { |
| String title = "Bluetooth Playlist"; |
| String artist = "Many"; |
| long totalTracks = 12; |
| String genre = "Viking Metal"; |
| long playingTime = 301; |
| String artHandle = "abc123"; |
| Uri uri = Uri.parse("content://somewhere"); |
| int type = AvrcpItem.FOLDER_TITLES; |
| |
| AvrcpItem.Builder builder = new AvrcpItem.Builder(); |
| builder.setItemType(AvrcpItem.TYPE_FOLDER); |
| builder.setType(type); |
| builder.setDevice(mDevice); |
| builder.setUuid(UUID); |
| builder.setDisplayableName(title); |
| builder.setTitle(title); |
| builder.setArtistName(artist); |
| builder.setTotalNumberOfTracks(totalTracks); |
| builder.setGenre(genre); |
| builder.setPlayingTime(playingTime); |
| builder.setCoverArtHandle(artHandle); |
| builder.setCoverArtLocation(uri); |
| |
| AvrcpItem item = builder.build(); |
| MediaMetadataCompat metadata = item.toMediaMetadata(); |
| |
| Assert.assertEquals(UUID, metadata.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID)); |
| Assert.assertEquals(title, |
| metadata.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE)); |
| Assert.assertEquals(title, metadata.getString(MediaMetadataCompat.METADATA_KEY_TITLE)); |
| Assert.assertEquals(artist, metadata.getString(MediaMetadataCompat.METADATA_KEY_ARTIST)); |
| Assert.assertEquals(null, metadata.getString(MediaMetadataCompat.METADATA_KEY_ALBUM)); |
| Assert.assertEquals(totalTracks, |
| metadata.getLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS)); |
| Assert.assertEquals(genre, metadata.getString(MediaMetadataCompat.METADATA_KEY_GENRE)); |
| Assert.assertEquals(playingTime, |
| metadata.getLong(MediaMetadataCompat.METADATA_KEY_DURATION)); |
| Assert.assertEquals(uri, |
| Uri.parse(metadata.getString(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI))); |
| Assert.assertEquals(uri, |
| Uri.parse(metadata.getString(MediaMetadataCompat.METADATA_KEY_ART_URI))); |
| Assert.assertEquals(uri, |
| Uri.parse(metadata.getString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI))); |
| Assert.assertEquals(null, |
| metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON)); |
| Assert.assertEquals(null, metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ART)); |
| Assert.assertEquals(null, metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART)); |
| Assert.assertEquals(type, |
| metadata.getLong(MediaMetadataCompat.METADATA_KEY_BT_FOLDER_TYPE)); |
| } |
| |
| @Test |
| public void avrcpItemNoDisplayName_toMediaItem() { |
| String title = "Aaaaargh"; |
| Uri uri = Uri.parse("content://somewhere"); |
| |
| AvrcpItem.Builder builder = new AvrcpItem.Builder(); |
| builder.setPlayable(true); |
| builder.setUuid(UUID); |
| builder.setTitle(title); |
| builder.setCoverArtLocation(uri); |
| |
| AvrcpItem item = builder.build(); |
| MediaItem mediaItem = item.toMediaItem(); |
| MediaDescriptionCompat desc = mediaItem.getDescription(); |
| |
| Assert.assertTrue(mediaItem.isPlayable()); |
| Assert.assertFalse(mediaItem.isBrowsable()); |
| Assert.assertEquals(UUID, mediaItem.getMediaId()); |
| |
| Assert.assertEquals(UUID, desc.getMediaId()); |
| Assert.assertEquals(null, desc.getMediaUri()); |
| Assert.assertEquals(title, desc.getTitle().toString()); |
| Assert.assertEquals(desc.getSubtitle(), null); |
| Assert.assertEquals(uri, desc.getIconUri()); |
| Assert.assertEquals(null, desc.getIconBitmap()); |
| } |
| |
| @Test |
| public void avrcpItemWithDisplayName_toMediaItem() { |
| String title = "Aaaaargh"; |
| String displayName = "A Different Type of Aaaaargh"; |
| Uri uri = Uri.parse("content://somewhere"); |
| |
| AvrcpItem.Builder builder = new AvrcpItem.Builder(); |
| builder.setPlayable(true); |
| builder.setUuid(UUID); |
| builder.setDisplayableName(displayName); |
| builder.setTitle(title); |
| builder.setCoverArtLocation(uri); |
| |
| AvrcpItem item = builder.build(); |
| MediaItem mediaItem = item.toMediaItem(); |
| MediaDescriptionCompat desc = mediaItem.getDescription(); |
| |
| Assert.assertTrue(mediaItem.isPlayable()); |
| Assert.assertFalse(mediaItem.isBrowsable()); |
| Assert.assertEquals(UUID, mediaItem.getMediaId()); |
| |
| Assert.assertEquals(UUID, desc.getMediaId()); |
| Assert.assertEquals(null, desc.getMediaUri()); |
| Assert.assertEquals(displayName, desc.getTitle().toString()); |
| Assert.assertEquals(desc.getSubtitle(), null); |
| Assert.assertEquals(uri, desc.getIconUri()); |
| Assert.assertEquals(null, desc.getIconBitmap()); |
| } |
| |
| @Test |
| public void avrcpItemBrowsable_toMediaItem() { |
| String title = "Aaaaargh"; |
| Uri uri = Uri.parse("content://somewhere"); |
| |
| AvrcpItem.Builder builder = new AvrcpItem.Builder(); |
| builder.setBrowsable(true); |
| builder.setUuid(UUID); |
| builder.setTitle(title); |
| builder.setCoverArtLocation(uri); |
| |
| AvrcpItem item = builder.build(); |
| MediaItem mediaItem = item.toMediaItem(); |
| MediaDescriptionCompat desc = mediaItem.getDescription(); |
| |
| Assert.assertFalse(mediaItem.isPlayable()); |
| Assert.assertTrue(mediaItem.isBrowsable()); |
| Assert.assertEquals(UUID, mediaItem.getMediaId()); |
| |
| Assert.assertEquals(UUID, desc.getMediaId()); |
| Assert.assertEquals(null, desc.getMediaUri()); |
| Assert.assertEquals(title, desc.getTitle().toString()); |
| Assert.assertEquals(desc.getSubtitle(), null); |
| Assert.assertEquals(uri, desc.getIconUri()); |
| Assert.assertEquals(null, desc.getIconBitmap()); |
| } |
| } |