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