1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.car.oem; 18 19 import static android.media.AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE; 20 import static android.media.AudioAttributes.USAGE_MEDIA; 21 import static android.os.Build.VERSION.SDK_INT; 22 23 import static org.junit.Assert.assertThrows; 24 25 import android.car.test.AbstractExpectableTestCase; 26 import android.media.AudioAttributes; 27 import android.media.AudioFocusInfo; 28 import android.media.AudioManager; 29 import android.os.Parcel; 30 31 import org.junit.Test; 32 33 public final class AudioFocusEntryUnitTest extends AbstractExpectableTestCase { 34 35 private static final AudioFocusInfo TEST_AUDIO_FOCUS_INFO = createAudioFocusInfoForMedia(); 36 private static final int TEST_PARCEL_FLAGS = 0; 37 private static final int MEDIA_EMPTY_FLAG = 0; 38 private static final int TEST_AUDIO_CONTEXT = 1; 39 private static final int TEST_VOLUME_GROUP_ID = 2; 40 private static final int MEDIA_APP_UID = 100000; 41 private static final String MEDIA_CLIENT_ID = "client-id"; 42 private static final String MEDIA_PACKAGE_NAME = "android.car.oem"; 43 44 @Test build()45 public void build() { 46 AudioFocusEntry entry = new AudioFocusEntry.Builder(TEST_AUDIO_FOCUS_INFO, 47 TEST_AUDIO_CONTEXT, TEST_VOLUME_GROUP_ID, AudioManager.AUDIOFOCUS_GAIN).build(); 48 49 expectWithMessage("Audio focus info from builder").that(entry.getAudioFocusInfo()) 50 .isEqualTo(TEST_AUDIO_FOCUS_INFO); 51 expectWithMessage("Audio context from builder").that(entry.getAudioContextId()) 52 .isEqualTo(TEST_AUDIO_CONTEXT); 53 expectWithMessage("Volume group id from builder").that(entry.getAudioVolumeGroupId()) 54 .isEqualTo(TEST_VOLUME_GROUP_ID); 55 expectWithMessage("Audio focus results from builder").that(entry.getAudioFocusResult()) 56 .isEqualTo(AudioManager.AUDIOFOCUS_GAIN); 57 } 58 59 @Test writeToParcel()60 public void writeToParcel() { 61 Parcel parcel = Parcel.obtain(); 62 63 AudioFocusEntry entry = createAndWriteEntryToParcel(parcel); 64 65 expectWithMessage("Car volume entry from parcel") 66 .that(new AudioFocusEntry(parcel)).isEqualTo(entry); 67 } 68 69 @Test createFromParcel()70 public void createFromParcel() { 71 Parcel parcel = Parcel.obtain(); 72 73 AudioFocusEntry entry = createAndWriteEntryToParcel(parcel); 74 75 expectWithMessage("Car volume entry created from parcel") 76 .that(AudioFocusEntry.CREATOR.createFromParcel(parcel)).isEqualTo(entry); 77 } 78 79 @Test setAudioFocusEntry()80 public void setAudioFocusEntry() { 81 AudioFocusInfo testSecondInfo = createAudioFocusInfo(USAGE_ASSISTANCE_NAVIGATION_GUIDANCE); 82 83 AudioFocusEntry entry = new AudioFocusEntry.Builder(TEST_AUDIO_FOCUS_INFO, 84 TEST_AUDIO_CONTEXT, TEST_VOLUME_GROUP_ID, AudioManager.AUDIOFOCUS_GAIN) 85 .setAudioFocusInfo(testSecondInfo).build(); 86 87 expectWithMessage("Second audio focus entry from builder").that(entry.getAudioFocusInfo()) 88 .isEqualTo(testSecondInfo); 89 } 90 91 @Test setAudioFocusEntry_withNullInfo_fails()92 public void setAudioFocusEntry_withNullInfo_fails() { 93 NullPointerException thrown = assertThrows(NullPointerException.class, () -> 94 new AudioFocusEntry.Builder(TEST_AUDIO_FOCUS_INFO, 95 TEST_AUDIO_CONTEXT, TEST_VOLUME_GROUP_ID, AudioManager.AUDIOFOCUS_GAIN) 96 .setAudioFocusInfo(/* audioFocusInfo= */ null) 97 ); 98 99 expectWithMessage("Null audio focus name exception") 100 .that(thrown).hasMessageThat().contains("Audio focus info"); 101 } 102 103 @Test setAudioContextId()104 public void setAudioContextId() { 105 int testAudioContext = 10; 106 107 AudioFocusEntry entry = new AudioFocusEntry.Builder(TEST_AUDIO_FOCUS_INFO, 108 TEST_AUDIO_CONTEXT, TEST_VOLUME_GROUP_ID, AudioManager.AUDIOFOCUS_GAIN) 109 .setAudioContextId(testAudioContext).build(); 110 111 expectWithMessage("Set audio context from builder").that(entry.getAudioContextId()) 112 .isEqualTo(testAudioContext); 113 } 114 115 @Test setAudioVolumeGroupId()116 public void setAudioVolumeGroupId() { 117 int testVolumeGroupId = 6; 118 AudioFocusEntry entry = new AudioFocusEntry.Builder(TEST_AUDIO_FOCUS_INFO, 119 TEST_AUDIO_CONTEXT, TEST_VOLUME_GROUP_ID, AudioManager.AUDIOFOCUS_GAIN) 120 .setAudioVolumeGroupId(testVolumeGroupId).build(); 121 122 expectWithMessage("Set audio volume group from builder") 123 .that(entry.getAudioVolumeGroupId()).isEqualTo(testVolumeGroupId); 124 } 125 126 @Test setAudioFocusResult()127 public void setAudioFocusResult() { 128 AudioFocusEntry entry = new AudioFocusEntry.Builder(TEST_AUDIO_FOCUS_INFO, 129 TEST_AUDIO_CONTEXT, TEST_VOLUME_GROUP_ID, AudioManager.AUDIOFOCUS_GAIN) 130 .setAudioFocusResult(AudioManager.AUDIOFOCUS_LOSS).build(); 131 132 expectWithMessage("Set audio focus results from builder") 133 .that(entry.getAudioFocusResult()).isEqualTo(AudioManager.AUDIOFOCUS_LOSS); 134 } 135 136 @Test builder_withReuse_fails()137 public void builder_withReuse_fails() { 138 AudioFocusEntry.Builder builder = new AudioFocusEntry.Builder(TEST_AUDIO_FOCUS_INFO, 139 TEST_AUDIO_CONTEXT, TEST_VOLUME_GROUP_ID, AudioManager.AUDIOFOCUS_GAIN) 140 .setAudioFocusResult(AudioManager.AUDIOFOCUS_LOSS); 141 builder.build(); 142 143 IllegalStateException thrown = assertThrows(IllegalStateException.class, () -> 144 builder.build() 145 ); 146 147 expectWithMessage("Reuse builder exception") 148 .that(thrown).hasMessageThat().contains("should not be reused"); 149 } 150 151 @Test builder_withAudioFocusEntry()152 public void builder_withAudioFocusEntry() { 153 AudioFocusEntry testEntry = new AudioFocusEntry.Builder(TEST_AUDIO_FOCUS_INFO, 154 TEST_AUDIO_CONTEXT, TEST_VOLUME_GROUP_ID, AudioManager.AUDIOFOCUS_GAIN).build(); 155 156 AudioFocusEntry entry = new AudioFocusEntry.Builder(testEntry).build(); 157 158 expectWithMessage("Audio focus info from copy builder") 159 .that(entry.getAudioFocusInfo()).isEqualTo(TEST_AUDIO_FOCUS_INFO); 160 expectWithMessage("Audio context from copy builder").that(entry.getAudioContextId()) 161 .isEqualTo(TEST_AUDIO_CONTEXT); 162 expectWithMessage("Volume group id from copy builder") 163 .that(entry.getAudioVolumeGroupId()).isEqualTo(TEST_VOLUME_GROUP_ID); 164 expectWithMessage("Audio focus results from copy builder") 165 .that(entry.getAudioFocusResult()).isEqualTo(AudioManager.AUDIOFOCUS_GAIN); 166 } 167 168 @Test builder_withNullEntry_fails()169 public void builder_withNullEntry_fails() { 170 NullPointerException thrown = assertThrows(NullPointerException.class, () -> 171 new AudioFocusEntry.Builder(/* entry= */ null) 172 ); 173 174 expectWithMessage("Null audio focus name exception") 175 .that(thrown).hasMessageThat().contains("Audio focus entry"); 176 } 177 createAudioFocusInfoForMedia()178 private static AudioFocusInfo createAudioFocusInfoForMedia() { 179 return createAudioFocusInfo(USAGE_MEDIA); 180 } 181 createAudioFocusInfo(int usage)182 private static AudioFocusInfo createAudioFocusInfo(int usage) { 183 AudioAttributes.Builder builder = new AudioAttributes.Builder(); 184 builder.setUsage(usage); 185 186 return new AudioFocusInfo(builder.build(), MEDIA_APP_UID, MEDIA_CLIENT_ID, 187 MEDIA_PACKAGE_NAME, AudioManager.AUDIOFOCUS_GAIN, AudioManager.AUDIOFOCUS_LOSS, 188 MEDIA_EMPTY_FLAG, SDK_INT); 189 } 190 createAndWriteEntryToParcel(Parcel parcel)191 private AudioFocusEntry createAndWriteEntryToParcel(Parcel parcel) { 192 AudioFocusEntry entry = new AudioFocusEntry.Builder(TEST_AUDIO_FOCUS_INFO, 193 TEST_AUDIO_CONTEXT, TEST_VOLUME_GROUP_ID, AudioManager.AUDIOFOCUS_GAIN).build(); 194 entry.writeToParcel(parcel, TEST_PARCEL_FLAGS); 195 parcel.setDataPosition(/* pos= */ 0); 196 return entry; 197 } 198 } 199