• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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