1/*
2 * Copyright 2017 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 */
16package android.support.mediacompat.client;
17
18import static org.hamcrest.core.IsEqual.equalTo;
19import static org.hamcrest.core.IsNot.not;
20import static org.junit.Assert.assertThat;
21
22import android.media.AudioAttributes;
23import android.media.AudioManager;
24import android.os.Build;
25import android.support.test.filters.SdkSuppress;
26import android.support.test.filters.SmallTest;
27import android.support.test.runner.AndroidJUnit4;
28import android.support.v4.media.AudioAttributesCompat;
29
30import org.junit.After;
31import org.junit.Before;
32import org.junit.Test;
33import org.junit.runner.RunWith;
34
35/** Test {@link AudioAttributesCompat}. */
36@SmallTest
37@RunWith(AndroidJUnit4.class)
38public class AudioAttributesCompatTest {
39    // some macros for conciseness
40    static final AudioAttributesCompat.Builder mkBuilder(
41            @AudioAttributesCompat.AttributeContentType int type,
42            @AudioAttributesCompat.AttributeUsage int usage) {
43        return new AudioAttributesCompat.Builder().setContentType(type).setUsage(usage);
44    }
45
46    static final AudioAttributesCompat.Builder mkBuilder(int legacyStream) {
47        return new AudioAttributesCompat.Builder().setLegacyStreamType(legacyStream);
48    }
49
50    // some objects we'll toss around
51    Object mMediaAA;
52    AudioAttributesCompat mMediaAAC,
53            mMediaLegacyAAC,
54            mMediaAACFromAA,
55            mNotificationAAC,
56            mNotificationLegacyAAC;
57
58    @Before
59    @SdkSuppress(minSdkVersion = 21)
60    public void setUpApi21() {
61        if (Build.VERSION.SDK_INT < 21) return;
62        mMediaAA =
63                new AudioAttributes.Builder()
64                        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
65                        .setUsage(AudioAttributes.USAGE_MEDIA)
66                        .build();
67        mMediaAACFromAA = AudioAttributesCompat.wrap((AudioAttributes) mMediaAA);
68    }
69
70    @Before
71    public void setUp() {
72        mMediaAAC =
73                mkBuilder(AudioAttributesCompat.CONTENT_TYPE_MUSIC,
74                        AudioAttributesCompat.USAGE_MEDIA).build();
75        mMediaLegacyAAC = mkBuilder(AudioManager.STREAM_MUSIC).build();
76        mNotificationAAC =
77                mkBuilder(AudioAttributesCompat.CONTENT_TYPE_SONIFICATION,
78                        AudioAttributesCompat.USAGE_NOTIFICATION)
79                        .build();
80        mNotificationLegacyAAC = mkBuilder(AudioManager.STREAM_NOTIFICATION).build();
81    }
82
83    @Test
84    @SdkSuppress(minSdkVersion = 21)
85    public void testCreateWithAudioAttributesApi21() {
86        assertThat(mMediaAACFromAA, not(equalTo(null)));
87        assertThat((AudioAttributes) mMediaAACFromAA.unwrap(), equalTo(mMediaAA));
88        assertThat(
89                (AudioAttributes) mMediaAACFromAA.unwrap(),
90                equalTo(new AudioAttributes.Builder((AudioAttributes) mMediaAA).build()));
91    }
92
93    @Test
94    @SdkSuppress(minSdkVersion = 21)
95    public void testEqualityApi21() {
96        assertThat("self equality", mMediaAACFromAA, equalTo(mMediaAACFromAA));
97        assertThat("different things", mMediaAACFromAA, not(equalTo(mNotificationAAC)));
98    }
99
100    @Test
101    public void testEquality() {
102        assertThat("self equality", mMediaAAC, equalTo(mMediaAAC));
103        assertThat(
104                "equal to clone",
105                mMediaAAC,
106                equalTo(new AudioAttributesCompat.Builder(mMediaAAC).build()));
107        assertThat("different things are different", mMediaAAC, not(equalTo(mNotificationAAC)));
108        assertThat("different things are different 2", mNotificationAAC, not(equalTo(mMediaAAC)));
109        assertThat(
110                "equal to clone 2",
111                mNotificationAAC,
112                equalTo(new AudioAttributesCompat.Builder(mNotificationAAC).build()));
113    }
114
115    @Test
116    public void testGetters() {
117        assertThat(mMediaAAC.getContentType(), equalTo(AudioAttributesCompat.CONTENT_TYPE_MUSIC));
118        assertThat(mMediaAAC.getUsage(), equalTo(AudioAttributesCompat.USAGE_MEDIA));
119        assertThat(mMediaAAC.getFlags(), equalTo(0));
120    }
121
122    @Test
123    public void testLegacyStreamTypeInference() {
124        assertThat(mMediaAAC.getLegacyStreamType(), equalTo(AudioManager.STREAM_MUSIC));
125        assertThat(mMediaLegacyAAC.getLegacyStreamType(), equalTo(AudioManager.STREAM_MUSIC));
126        assertThat(
127                mNotificationAAC.getLegacyStreamType(), equalTo(AudioManager.STREAM_NOTIFICATION));
128        assertThat(
129                mNotificationLegacyAAC.getLegacyStreamType(),
130                equalTo(AudioManager.STREAM_NOTIFICATION));
131    }
132
133    @Test
134    @SdkSuppress(minSdkVersion = 21)
135    public void testLegacyStreamTypeInferenceApi21() {
136        assertThat(mMediaAACFromAA.getLegacyStreamType(), equalTo(AudioManager.STREAM_MUSIC));
137    }
138
139    @Test
140    public void testLegacyStreamTypeInferenceInLegacyMode() {
141        // the builders behave differently based on the value of this only-for-testing global
142        // so we need our very own objects inside this method
143        AudioAttributesCompat.setForceLegacyBehavior(true);
144
145        AudioAttributesCompat mediaAAC =
146                mkBuilder(AudioAttributesCompat.CONTENT_TYPE_MUSIC,
147                        AudioAttributesCompat.USAGE_MEDIA).build();
148        AudioAttributesCompat mediaLegacyAAC = mkBuilder(AudioManager.STREAM_MUSIC).build();
149
150        AudioAttributesCompat notificationAAC =
151                mkBuilder(AudioAttributesCompat.CONTENT_TYPE_SONIFICATION,
152                        AudioAttributesCompat.USAGE_NOTIFICATION)
153                        .build();
154        AudioAttributesCompat notificationLegacyAAC =
155                mkBuilder(AudioManager.STREAM_NOTIFICATION).build();
156
157        assertThat(mediaAAC.getLegacyStreamType(), equalTo(AudioManager.STREAM_MUSIC));
158        assertThat(mediaLegacyAAC.getLegacyStreamType(), equalTo(AudioManager.STREAM_MUSIC));
159        assertThat(
160                notificationAAC.getLegacyStreamType(), equalTo(AudioManager.STREAM_NOTIFICATION));
161        assertThat(
162                notificationLegacyAAC.getLegacyStreamType(),
163                equalTo(AudioManager.STREAM_NOTIFICATION));
164    }
165
166    @After
167    public void cleanUp() {
168        AudioAttributesCompat.setForceLegacyBehavior(false);
169    }
170}
171