• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 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.permission.cts;
18 
19 import static org.testng.Assert.assertThrows;
20 
21 import android.content.Context;
22 import android.content.pm.PackageManager;
23 import android.media.AudioFormat;
24 import android.media.AudioManager;
25 import android.media.AudioRecord;
26 import android.media.MediaRecorder;
27 import android.test.AndroidTestCase;
28 import android.util.Log;
29 
30 import androidx.test.filters.SmallTest;
31 
32 /**
33  * Verify the audio related operations require specific permissions.
34  */
35 public class NoAudioPermissionTest extends AndroidTestCase {
36     private static final String TAG = NoAudioPermissionTest.class.getSimpleName();
37     private AudioManager mAudioManager;
38     private static final int MODE_COUNT = 3;
39 
40     @Override
setUp()41     protected void setUp() throws Exception {
42         super.setUp();
43         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
44         assertNotNull(mAudioManager);
45     }
46 
hasMicrophone()47     private boolean hasMicrophone() {
48         return getContext().getPackageManager().hasSystemFeature(
49                 PackageManager.FEATURE_MICROPHONE);
50     }
51 
52     /**
53      * Verify that AudioManager.setMicrophoneMute, AudioManager.setMode requires permissions.
54      * <p>Requires Permission:
55      *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
56      */
57     @SmallTest
testSetMicrophoneMute()58     public void testSetMicrophoneMute() {
59         boolean muteState = mAudioManager.isMicrophoneMute();
60         int originalMode = mAudioManager.getMode();
61         // If there is no permission of MODIFY_AUDIO_SETTINGS, setMicrophoneMute does nothing.
62         if (muteState) {
63             Log.w(TAG, "Mic seems muted by hardware! Please unmute and rerrun the test.");
64         } else {
65             mAudioManager.setMicrophoneMute(!muteState);
66             assertEquals(muteState, mAudioManager.isMicrophoneMute());
67         }
68 
69         // If there is no permission of MODIFY_AUDIO_SETTINGS, setMode does nothing.
70         assertTrue(AudioManager.MODE_NORMAL != AudioManager.MODE_RINGTONE);
71 
72         mAudioManager.setMode(AudioManager.MODE_NORMAL);
73         assertEquals(originalMode, mAudioManager.getMode());
74 
75         mAudioManager.setMode(AudioManager.MODE_RINGTONE);
76         assertEquals(originalMode, mAudioManager.getMode());
77     }
78 
79     /**
80      * Verify that AudioManager routing methods require permissions.
81      * <p>Requires Permission:
82      *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
83      */
84     @SuppressWarnings("deprecation")
85     @SmallTest
testRouting()86     public void testRouting() {
87 
88         // If there is no permission of MODIFY_AUDIO_SETTINGS, setSpeakerphoneOn does nothing.
89         boolean prevState = mAudioManager.isSpeakerphoneOn();
90         mAudioManager.setSpeakerphoneOn(!prevState);
91         assertEquals(prevState, mAudioManager.isSpeakerphoneOn());
92 
93         // If there is no permission of MODIFY_AUDIO_SETTINGS, setBluetoothScoOn does nothing.
94         prevState = mAudioManager.isBluetoothScoOn();
95         mAudioManager.setBluetoothScoOn(!prevState);
96         assertEquals(prevState, mAudioManager.isBluetoothScoOn());
97     }
98 
99     /**
100      * Verify that {@link android.media.AudioRecord.Builder#build} and
101      * {@link android.media.AudioRecord#AudioRecord} require permission
102      * {@link android.Manifest.permission#RECORD_AUDIO}.
103      */
104     @SmallTest
testRecordPermission()105     public void testRecordPermission() {
106         if (!hasMicrophone()) return;
107 
108         // test builder
109         assertThrows(java.lang.UnsupportedOperationException.class, () -> {
110             final AudioRecord record = new AudioRecord.Builder().build();
111             record.release();
112         });
113 
114         // test constructor
115         final int sampleRate = 8000;
116         final int halfSecondInBytes = sampleRate;
117         AudioRecord record = new AudioRecord(
118                 MediaRecorder.AudioSource.DEFAULT, sampleRate, AudioFormat.CHANNEL_IN_MONO,
119                 AudioFormat.ENCODING_PCM_16BIT, halfSecondInBytes);
120         final int state = record.getState();
121         record.release();
122         assertEquals(AudioRecord.STATE_UNINITIALIZED, state);
123     }
124 }
125