Home | History | Annotate | Download | only in cts
      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.media.cts;
     18 
     19 import static android.media.AudioManager.ADJUST_LOWER;
     20 import static android.media.AudioManager.ADJUST_RAISE;
     21 import static android.media.AudioManager.ADJUST_SAME;
     22 import static android.media.AudioManager.MODE_IN_CALL;
     23 import static android.media.AudioManager.MODE_IN_COMMUNICATION;
     24 import static android.media.AudioManager.MODE_NORMAL;
     25 import static android.media.AudioManager.MODE_RINGTONE;
     26 import static android.media.AudioManager.RINGER_MODE_NORMAL;
     27 import static android.media.AudioManager.RINGER_MODE_SILENT;
     28 import static android.media.AudioManager.RINGER_MODE_VIBRATE;
     29 import static android.media.AudioManager.STREAM_ACCESSIBILITY;
     30 import static android.media.AudioManager.STREAM_MUSIC;
     31 import static android.media.AudioManager.STREAM_RING;
     32 import static android.media.AudioManager.USE_DEFAULT_STREAM_TYPE;
     33 import static android.media.AudioManager.VIBRATE_SETTING_OFF;
     34 import static android.media.AudioManager.VIBRATE_SETTING_ON;
     35 import static android.media.AudioManager.VIBRATE_SETTING_ONLY_SILENT;
     36 import static android.media.AudioManager.VIBRATE_TYPE_NOTIFICATION;
     37 import static android.media.AudioManager.VIBRATE_TYPE_RINGER;
     38 import static android.provider.Settings.System.SOUND_EFFECTS_ENABLED;
     39 
     40 import android.app.ActivityManager;
     41 import android.app.NotificationChannel;
     42 import android.app.NotificationManager;
     43 import android.content.BroadcastReceiver;
     44 import android.content.Context;
     45 import android.content.Intent;
     46 import android.content.IntentFilter;
     47 import android.content.pm.PackageManager;
     48 import android.content.res.Resources;
     49 import android.media.AudioAttributes;
     50 import android.media.AudioDeviceInfo;
     51 import android.media.AudioManager;
     52 import android.media.MediaPlayer;
     53 import android.media.MicrophoneInfo;
     54 import android.os.Vibrator;
     55 import android.platform.test.annotations.AppModeFull;
     56 import android.provider.Settings;
     57 import android.provider.Settings.System;
     58 import android.test.InstrumentationTestCase;
     59 import android.text.TextUtils;
     60 import android.util.Log;
     61 import android.view.SoundEffectConstants;
     62 
     63 import com.android.compatibility.common.util.CddTest;
     64 import com.android.internal.annotations.GuardedBy;
     65 
     66 import java.util.HashMap;
     67 import java.util.List;
     68 import java.util.Map;
     69 
     70 public class AudioManagerTest extends InstrumentationTestCase {
     71     private final static String TAG = "AudioManagerTest";
     72 
     73     private final static long ASYNC_TIMING_TOLERANCE_MS = 50;
     74     private final static int MP3_TO_PLAY = R.raw.testmp3;
     75     private final static long TIME_TO_PLAY = 2000;
     76     private final static String APPOPS_OP_STR = "android:write_settings";
     77     private AudioManager mAudioManager;
     78     private NotificationManager mNm;
     79     private boolean mHasVibrator;
     80     private boolean mUseFixedVolume;
     81     private boolean mIsTelevision;
     82     private boolean mIsSingleVolume;
     83     private boolean mSkipRingerTests;
     84     // From N onwards, ringer mode adjustments that toggle DND are not allowed unless
     85     // package has DND access. Many tests in this package toggle DND access in order
     86     // to get device out of the DND state for the test to proceed correctly.
     87     // But DND access is disabled completely on low ram devices,
     88     // so completely skip those tests here.
     89     // These tests are migrated to CTS verifier tests to ensure test coverage.
     90     private boolean mSupportNotificationPolicyAccess;
     91     private Context mContext;
     92     private int mOriginalRingerMode;
     93     private Map<Integer, Integer> mOriginalStreamVolumes = new HashMap<>();
     94     private NotificationManager.Policy mOriginalNotificationPolicy;
     95     private int mOriginalZen;
     96 
     97     @Override
     98     protected void setUp() throws Exception {
     99         super.setUp();
    100         mContext = getInstrumentation().getContext();
    101         Utils.enableAppOps(mContext.getPackageName(), APPOPS_OP_STR, getInstrumentation());
    102         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
    103         Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
    104         mNm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    105         mHasVibrator = (vibrator != null) && vibrator.hasVibrator();
    106         mUseFixedVolume = mContext.getResources().getBoolean(
    107                 Resources.getSystem().getIdentifier("config_useFixedVolume", "bool", "android"));
    108         PackageManager packageManager = mContext.getPackageManager();
    109         mIsTelevision = packageManager != null
    110                 && (packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
    111                         || packageManager.hasSystemFeature(PackageManager.FEATURE_TELEVISION));
    112         mIsSingleVolume = mContext.getResources().getBoolean(
    113                 Resources.getSystem().getIdentifier("config_single_volume", "bool", "android"));
    114         mSkipRingerTests = mUseFixedVolume || mIsTelevision || mIsSingleVolume;
    115         ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
    116         mSupportNotificationPolicyAccess = !am.isLowRamDevice();
    117 
    118         // Store the original volumes that that they can be recovered in tearDown().
    119         final int[] streamTypes = {
    120             AudioManager.STREAM_VOICE_CALL,
    121             AudioManager.STREAM_SYSTEM,
    122             AudioManager.STREAM_RING,
    123             AudioManager.STREAM_MUSIC,
    124             AudioManager.STREAM_ALARM,
    125             AudioManager.STREAM_NOTIFICATION,
    126             AudioManager.STREAM_DTMF,
    127             AudioManager.STREAM_ACCESSIBILITY,
    128         };
    129         mOriginalRingerMode = mAudioManager.getRingerMode();
    130         for (int streamType : streamTypes) {
    131             mOriginalStreamVolumes.put(streamType, mAudioManager.getStreamVolume(streamType));
    132         }
    133 
    134         if (mSupportNotificationPolicyAccess) {
    135             try {
    136                 Utils.toggleNotificationPolicyAccess(
    137                         mContext.getPackageName(), getInstrumentation(), true);
    138                 mOriginalNotificationPolicy = mNm.getNotificationPolicy();
    139                 mOriginalZen = mNm.getCurrentInterruptionFilter();
    140             } finally {
    141                 setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
    142                 Utils.toggleNotificationPolicyAccess(
    143                         mContext.getPackageName(), getInstrumentation(), false);
    144             }
    145         }
    146     }
    147 
    148     @Override
    149     protected void tearDown() throws Exception {
    150         if (!mSupportNotificationPolicyAccess) {
    151             return;
    152         }
    153         try {
    154             Utils.toggleNotificationPolicyAccess(
    155                     mContext.getPackageName(), getInstrumentation(), true);
    156             mNm.setNotificationPolicy(mOriginalNotificationPolicy);
    157             setInterruptionFilter(mOriginalZen);
    158 
    159             // Recover the volume and the ringer mode that the test may have overwritten.
    160             for (Map.Entry<Integer, Integer> e : mOriginalStreamVolumes.entrySet()) {
    161                 mAudioManager.setStreamVolume(e.getKey(), e.getValue(),
    162                                               AudioManager.FLAG_ALLOW_RINGER_MODES);
    163             }
    164             mAudioManager.setRingerMode(mOriginalRingerMode);
    165         } finally {
    166             Utils.toggleNotificationPolicyAccess(
    167                     mContext.getPackageName(), getInstrumentation(), false);
    168         }
    169     }
    170 
    171     @AppModeFull(reason = "Instant apps cannot hold android.permission.MODIFY_AUDIO_SETTINGS")
    172     public void testMicrophoneMute() throws Exception {
    173         mAudioManager.setMicrophoneMute(true);
    174         assertTrue(mAudioManager.isMicrophoneMute());
    175         mAudioManager.setMicrophoneMute(false);
    176         assertFalse(mAudioManager.isMicrophoneMute());
    177     }
    178 
    179     @AppModeFull(reason = "Instant apps cannot hold android.permission.MODIFY_AUDIO_SETTINGS")
    180     public void testMicrophoneMuteIntent() throws Exception {
    181         // Skip this test for automotive.
    182         // This tests listens for ACTION_MICROPHONE_MUTE_CHANGED which AudioService only broadcasts
    183         // to system user. Automotive devices, which runs in secondary user, will fail this test.
    184         if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
    185             return;
    186         }
    187 
    188         final MyBlockingIntentReceiver receiver = new MyBlockingIntentReceiver(
    189                 AudioManager.ACTION_MICROPHONE_MUTE_CHANGED);
    190         final boolean initialMicMute = mAudioManager.isMicrophoneMute();
    191         try {
    192             mContext.registerReceiver(receiver,
    193                     new IntentFilter(AudioManager.ACTION_MICROPHONE_MUTE_CHANGED));
    194             // change the mic mute state
    195             mAudioManager.setMicrophoneMute(!initialMicMute);
    196             // verify a change was reported
    197             final boolean intentFired = receiver.waitForExpectedAction(500/*ms*/);
    198             assertTrue("ACTION_MICROPHONE_MUTE_CHANGED wasn't fired", intentFired);
    199             // verify the mic mute state is expected
    200             final boolean newMicMute = mAudioManager.isMicrophoneMute();
    201             assertTrue("new mic mute state not as expected (" + !initialMicMute + ")",
    202                     newMicMute == !initialMicMute);
    203         } finally {
    204             mContext.unregisterReceiver(receiver);
    205             mAudioManager.setMicrophoneMute(initialMicMute);
    206         }
    207     }
    208 
    209     @AppModeFull(reason = "Instant apps cannot hold android.permission.MODIFY_AUDIO_SETTINGS")
    210     public void testSpeakerphoneIntent() throws Exception {
    211         final MyBlockingIntentReceiver receiver = new MyBlockingIntentReceiver(
    212                 AudioManager.ACTION_SPEAKERPHONE_STATE_CHANGED);
    213         final boolean initialSpeakerphoneState = mAudioManager.isSpeakerphoneOn();
    214         try {
    215             mContext.registerReceiver(receiver,
    216                     new IntentFilter(AudioManager.ACTION_SPEAKERPHONE_STATE_CHANGED));
    217             // change the speakerphone state
    218             mAudioManager.setSpeakerphoneOn(!initialSpeakerphoneState);
    219             // verify a change was reported
    220             final boolean intentFired = receiver.waitForExpectedAction(500/*ms*/);
    221             assertTrue("ACTION_SPEAKERPHONE_STATE_CHANGED wasn't fired", intentFired);
    222             // verify the speakerphon state is expected
    223             final boolean newSpeakerphoneState = mAudioManager.isSpeakerphoneOn();
    224             assertTrue("new mic mute state not as expected ("
    225                     + !initialSpeakerphoneState + ")",
    226                     newSpeakerphoneState == !initialSpeakerphoneState);
    227         } finally {
    228             mContext.unregisterReceiver(receiver);
    229             mAudioManager.setSpeakerphoneOn(initialSpeakerphoneState);
    230         }
    231     }
    232 
    233     private static final class MyBlockingIntentReceiver extends BroadcastReceiver {
    234         private final SafeWaitObject mLock = new SafeWaitObject();
    235         // the action for the intent to check
    236         private final String mAction;
    237         @GuardedBy("mLock")
    238         private boolean mIntentReceived = false;
    239 
    240         MyBlockingIntentReceiver(String action) {
    241             mAction = action;
    242         }
    243 
    244         @Override
    245         public void onReceive(Context context, Intent intent) {
    246             if (!TextUtils.equals(intent.getAction(), mAction)) {
    247                 // move along, this is not the action we're looking for
    248                 return;
    249             }
    250             synchronized (mLock) {
    251                 mIntentReceived = true;
    252                 mLock.safeNotify();
    253             }
    254         }
    255 
    256         public boolean waitForExpectedAction(long timeOutMs) {
    257             synchronized (mLock) {
    258                 try {
    259                     mLock.safeWait(timeOutMs);
    260                 } catch (InterruptedException e) { }
    261                 return mIntentReceived;
    262             }
    263         }
    264     }
    265 
    266     public void testSoundEffects() throws Exception {
    267         Settings.System.putInt(mContext.getContentResolver(), SOUND_EFFECTS_ENABLED, 1);
    268 
    269         // should hear sound after loadSoundEffects() called.
    270         mAudioManager.loadSoundEffects();
    271         Thread.sleep(TIME_TO_PLAY);
    272         float volume = 13;
    273         mAudioManager.playSoundEffect(SoundEffectConstants.CLICK);
    274         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP);
    275         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
    276         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);
    277         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
    278 
    279         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP, volume);
    280         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN, volume);
    281         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT, volume);
    282         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT, volume);
    283 
    284         // won't hear sound after unloadSoundEffects() called();
    285         mAudioManager.unloadSoundEffects();
    286         mAudioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
    287         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP);
    288         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
    289         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);
    290         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
    291 
    292         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP, volume);
    293         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN, volume);
    294         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT, volume);
    295         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT, volume);
    296     }
    297 
    298     public void testCheckingZenModeBlockDoesNotRequireNotificationPolicyAccess() throws Exception {
    299         if (!mSupportNotificationPolicyAccess) {
    300             return;
    301         }
    302         try {
    303             // set zen mode to priority only, so playSoundEffect will check notification policy
    304             Utils.toggleNotificationPolicyAccess(mContext.getPackageName(), getInstrumentation(),
    305                     true);
    306             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
    307             Settings.System.putInt(mContext.getContentResolver(), SOUND_EFFECTS_ENABLED, 1);
    308 
    309             // take away write-notification policy access from the package
    310             Utils.toggleNotificationPolicyAccess(mContext.getPackageName(), getInstrumentation(),
    311                     false);
    312 
    313             // playSoundEffect should NOT throw a security exception; all apps have read-access
    314             mAudioManager.playSoundEffect(SoundEffectConstants.CLICK);
    315         } finally {
    316             Utils.toggleNotificationPolicyAccess(mContext.getPackageName(), getInstrumentation(),
    317                     true);
    318             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
    319             Utils.toggleNotificationPolicyAccess(mContext.getPackageName(), getInstrumentation(),
    320                     false);
    321         }
    322     }
    323 
    324     public void testMusicActive() throws Exception {
    325         if (mAudioManager.isMusicActive()) {
    326             return;
    327         }
    328         MediaPlayer mp = MediaPlayer.create(mContext, MP3_TO_PLAY);
    329         assertNotNull(mp);
    330         mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
    331         mp.start();
    332         Thread.sleep(TIME_TO_PLAY);
    333         assertTrue(mAudioManager.isMusicActive());
    334         Thread.sleep(TIME_TO_PLAY);
    335         mp.stop();
    336         mp.release();
    337         Thread.sleep(TIME_TO_PLAY);
    338         assertFalse(mAudioManager.isMusicActive());
    339     }
    340 
    341     @AppModeFull(reason = "Instant apps cannot hold android.permission.MODIFY_AUDIO_SETTINGS")
    342     public void testAccessMode() throws Exception {
    343         mAudioManager.setMode(MODE_RINGTONE);
    344         assertEquals(MODE_RINGTONE, mAudioManager.getMode());
    345         mAudioManager.setMode(MODE_IN_COMMUNICATION);
    346         assertEquals(MODE_IN_COMMUNICATION, mAudioManager.getMode());
    347         mAudioManager.setMode(MODE_NORMAL);
    348         assertEquals(MODE_NORMAL, mAudioManager.getMode());
    349     }
    350 
    351     @SuppressWarnings("deprecation")
    352     @AppModeFull(reason = "Instant apps cannot hold android.permission.MODIFY_AUDIO_SETTINGS")
    353     public void testRouting() throws Exception {
    354         // setBluetoothA2dpOn is a no-op, and getRouting should always return -1
    355         // AudioManager.MODE_CURRENT
    356         boolean oldA2DP = mAudioManager.isBluetoothA2dpOn();
    357         mAudioManager.setBluetoothA2dpOn(true);
    358         assertEquals(oldA2DP , mAudioManager.isBluetoothA2dpOn());
    359         mAudioManager.setBluetoothA2dpOn(false);
    360         assertEquals(oldA2DP , mAudioManager.isBluetoothA2dpOn());
    361 
    362         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_RINGTONE));
    363         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_NORMAL));
    364         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_CALL));
    365         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_COMMUNICATION));
    366 
    367         mAudioManager.setBluetoothScoOn(true);
    368         assertTrue(mAudioManager.isBluetoothScoOn());
    369         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_RINGTONE));
    370         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_NORMAL));
    371         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_CALL));
    372         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_COMMUNICATION));
    373 
    374         mAudioManager.setBluetoothScoOn(false);
    375         assertFalse(mAudioManager.isBluetoothScoOn());
    376         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_RINGTONE));
    377         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_NORMAL));
    378         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_CALL));
    379         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_COMMUNICATION));
    380 
    381         mAudioManager.setSpeakerphoneOn(true);
    382         assertTrue(mAudioManager.isSpeakerphoneOn());
    383         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_CALL));
    384         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_COMMUNICATION));
    385         mAudioManager.setSpeakerphoneOn(false);
    386         assertFalse(mAudioManager.isSpeakerphoneOn());
    387         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_CALL));
    388         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_COMMUNICATION));
    389     }
    390 
    391     public void testVibrateNotification() throws Exception {
    392         if (mUseFixedVolume || !mHasVibrator || !mSupportNotificationPolicyAccess) {
    393             return;
    394         }
    395         Utils.toggleNotificationPolicyAccess(
    396                 mContext.getPackageName(), getInstrumentation(), true);
    397         // VIBRATE_SETTING_ON
    398         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ON);
    399         assertEquals(mHasVibrator ? VIBRATE_SETTING_ON : VIBRATE_SETTING_OFF,
    400                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
    401         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    402         assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
    403 
    404         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    405         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
    406 
    407         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    408         assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
    409                 mAudioManager.getRingerMode());
    410         assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
    411 
    412         // VIBRATE_SETTING_OFF
    413         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_OFF);
    414         assertEquals(VIBRATE_SETTING_OFF,
    415                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
    416         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    417         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
    418 
    419         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    420         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
    421 
    422         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    423         assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
    424                 mAudioManager.getRingerMode());
    425         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
    426 
    427         // VIBRATE_SETTING_ONLY_SILENT
    428         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ONLY_SILENT);
    429         assertEquals(mHasVibrator ? VIBRATE_SETTING_ONLY_SILENT : VIBRATE_SETTING_OFF,
    430                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
    431         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    432         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
    433 
    434         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    435         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
    436 
    437         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    438         assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
    439                 mAudioManager.getRingerMode());
    440         assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
    441 
    442         // VIBRATE_TYPE_NOTIFICATION
    443         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ON);
    444         assertEquals(mHasVibrator ? VIBRATE_SETTING_ON : VIBRATE_SETTING_OFF,
    445                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
    446         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_OFF);
    447         assertEquals(VIBRATE_SETTING_OFF, mAudioManager
    448                 .getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
    449         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ONLY_SILENT);
    450         assertEquals(mHasVibrator ? VIBRATE_SETTING_ONLY_SILENT : VIBRATE_SETTING_OFF,
    451                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
    452     }
    453 
    454     public void testVibrateRinger() throws Exception {
    455         if (mUseFixedVolume || !mHasVibrator || !mSupportNotificationPolicyAccess) {
    456             return;
    457         }
    458         Utils.toggleNotificationPolicyAccess(
    459                 mContext.getPackageName(), getInstrumentation(), true);
    460         // VIBRATE_TYPE_RINGER
    461         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ON);
    462         assertEquals(mHasVibrator ? VIBRATE_SETTING_ON : VIBRATE_SETTING_OFF,
    463                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
    464         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    465         assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
    466 
    467         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    468         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
    469 
    470         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    471         assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
    472                 mAudioManager.getRingerMode());
    473         assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
    474 
    475         // VIBRATE_SETTING_OFF
    476         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_OFF);
    477         assertEquals(VIBRATE_SETTING_OFF, mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
    478         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    479         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
    480 
    481         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    482         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
    483 
    484         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    485         assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
    486                 mAudioManager.getRingerMode());
    487         // Note: as of Froyo, if VIBRATE_TYPE_RINGER is set to OFF, it will
    488         // not vibrate, even in RINGER_MODE_VIBRATE. This allows users to
    489         // disable the vibration for incoming calls only.
    490         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
    491 
    492         // VIBRATE_SETTING_ONLY_SILENT
    493         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ONLY_SILENT);
    494         assertEquals(mHasVibrator ? VIBRATE_SETTING_ONLY_SILENT : VIBRATE_SETTING_OFF,
    495                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
    496         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    497         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
    498 
    499         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    500         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
    501 
    502         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    503         assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
    504                 mAudioManager.getRingerMode());
    505         assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
    506 
    507         // VIBRATE_TYPE_NOTIFICATION
    508         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ON);
    509         assertEquals(mHasVibrator ? VIBRATE_SETTING_ON : VIBRATE_SETTING_OFF,
    510                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
    511         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_OFF);
    512         assertEquals(VIBRATE_SETTING_OFF, mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
    513         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ONLY_SILENT);
    514         assertEquals(mHasVibrator ? VIBRATE_SETTING_ONLY_SILENT : VIBRATE_SETTING_OFF,
    515                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
    516     }
    517 
    518     public void testAccessRingMode() throws Exception {
    519         if (!mSupportNotificationPolicyAccess) {
    520             return;
    521         }
    522         Utils.toggleNotificationPolicyAccess(
    523                 mContext.getPackageName(), getInstrumentation(), true);
    524         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    525         assertEquals(RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
    526 
    527         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    528         // AudioService#setRingerMode() has:
    529         // if (isTelevision) return;
    530         if (mSkipRingerTests) {
    531             assertEquals(RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
    532         } else {
    533             assertEquals(RINGER_MODE_SILENT, mAudioManager.getRingerMode());
    534         }
    535 
    536         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    537         if (mSkipRingerTests) {
    538             assertEquals(RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
    539         } else {
    540             assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
    541                     mAudioManager.getRingerMode());
    542         }
    543     }
    544 
    545     public void testSetRingerModePolicyAccess() throws Exception {
    546         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
    547             return;
    548         }
    549         // Apps without policy access cannot change silent -> normal or silent -> vibrate.
    550         Utils.toggleNotificationPolicyAccess(
    551                 mContext.getPackageName(), getInstrumentation(), true);
    552         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    553         assertEquals(RINGER_MODE_SILENT, mAudioManager.getRingerMode());
    554         Utils.toggleNotificationPolicyAccess(
    555                 mContext.getPackageName(), getInstrumentation(), false);
    556 
    557         try {
    558             mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    559             fail("Apps without notification policy access cannot change ringer mode");
    560         } catch (SecurityException e) {
    561         }
    562 
    563         try {
    564             mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    565             fail("Apps without notification policy access cannot change ringer mode");
    566         } catch (SecurityException e) {
    567         }
    568 
    569         // Apps without policy access cannot change normal -> silent.
    570         Utils.toggleNotificationPolicyAccess(
    571                 mContext.getPackageName(), getInstrumentation(), true);
    572         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    573         assertEquals(RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
    574         Utils.toggleNotificationPolicyAccess(
    575                 mContext.getPackageName(), getInstrumentation(), false);
    576 
    577         try {
    578             mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    579             fail("Apps without notification policy access cannot change ringer mode");
    580         } catch (SecurityException e) {
    581         }
    582         assertEquals(RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
    583 
    584         if (mHasVibrator) {
    585             // Apps without policy access cannot change vibrate -> silent.
    586             Utils.toggleNotificationPolicyAccess(
    587                     mContext.getPackageName(), getInstrumentation(), true);
    588             mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    589             assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
    590             Utils.toggleNotificationPolicyAccess(
    591                     mContext.getPackageName(), getInstrumentation(), false);
    592 
    593             try {
    594                 mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    595                 fail("Apps without notification policy access cannot change ringer mode");
    596             } catch (SecurityException e) {
    597             }
    598 
    599             // Apps without policy access can change vibrate -> normal and vice versa.
    600             assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
    601             mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    602             assertEquals(RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
    603             mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
    604             assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
    605         }
    606     }
    607 
    608     public void testVolume() throws Exception {
    609         if (!mSupportNotificationPolicyAccess) {
    610             return;
    611         }
    612         Utils.toggleNotificationPolicyAccess(
    613                 mContext.getPackageName(), getInstrumentation(), true);
    614         int volume, volumeDelta;
    615         int[] streams = {AudioManager.STREAM_ALARM,
    616                 AudioManager.STREAM_MUSIC,
    617                 AudioManager.STREAM_VOICE_CALL,
    618                 AudioManager.STREAM_RING};
    619 
    620         mAudioManager.adjustVolume(ADJUST_RAISE, 0);
    621         // adjusting volume is aynchronous, wait before other volume checks
    622         Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    623         mAudioManager.adjustSuggestedStreamVolume(
    624                 ADJUST_LOWER, USE_DEFAULT_STREAM_TYPE, 0);
    625         Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    626         int maxMusicVolume = mAudioManager.getStreamMaxVolume(STREAM_MUSIC);
    627 
    628         for (int stream : streams) {
    629             // set ringer mode to back normal to not interfere with volume tests
    630             mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    631 
    632             int maxVolume = mAudioManager.getStreamMaxVolume(stream);
    633             int minVolume = mAudioManager.getStreamMinVolume(stream);
    634 
    635             // validate min
    636             assertTrue(String.format("minVolume(%d) must be >= 0", minVolume), minVolume >= 0);
    637             assertTrue(String.format("minVolume(%d) must be < maxVolume(%d)", minVolume,
    638                     maxVolume),
    639                     minVolume < maxVolume);
    640 
    641             mAudioManager.setStreamVolume(stream, 1, 0);
    642             if (mUseFixedVolume) {
    643                 assertEquals(maxVolume, mAudioManager.getStreamVolume(stream));
    644                 continue;
    645             }
    646             assertEquals(String.format("stream=%d", stream),
    647                     1, mAudioManager.getStreamVolume(stream));
    648 
    649             if (stream == AudioManager.STREAM_MUSIC && mAudioManager.isWiredHeadsetOn()) {
    650                 // due to new regulations, music sent over a wired headset may be volume limited
    651                 // until the user explicitly increases the limit, so we can't rely on being able
    652                 // to set the volume to getStreamMaxVolume(). Instead, determine the current limit
    653                 // by increasing the volume until it won't go any higher, then use that volume as
    654                 // the maximum for the purposes of this test
    655                 int curvol = 0;
    656                 int prevvol = 0;
    657                 do {
    658                     prevvol = curvol;
    659                     mAudioManager.adjustStreamVolume(stream, ADJUST_RAISE, 0);
    660                     curvol = mAudioManager.getStreamVolume(stream);
    661                 } while (curvol != prevvol);
    662                 maxVolume = maxMusicVolume = curvol;
    663             }
    664             mAudioManager.setStreamVolume(stream, maxVolume, 0);
    665             mAudioManager.adjustStreamVolume(stream, ADJUST_RAISE, 0);
    666             assertEquals(maxVolume, mAudioManager.getStreamVolume(stream));
    667 
    668             volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(stream));
    669             mAudioManager.adjustSuggestedStreamVolume(ADJUST_LOWER, stream, 0);
    670             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    671             assertEquals(maxVolume - volumeDelta, mAudioManager.getStreamVolume(stream));
    672 
    673             // volume lower
    674             mAudioManager.setStreamVolume(stream, maxVolume, 0);
    675             volume = mAudioManager.getStreamVolume(stream);
    676             while (volume > minVolume) {
    677                 volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(stream));
    678                 mAudioManager.adjustStreamVolume(stream, ADJUST_LOWER, 0);
    679                 assertEquals(Math.max(0, volume - volumeDelta),
    680                         mAudioManager.getStreamVolume(stream));
    681                 volume = mAudioManager.getStreamVolume(stream);
    682             }
    683 
    684             mAudioManager.adjustStreamVolume(stream, ADJUST_SAME, 0);
    685 
    686             // volume raise
    687             mAudioManager.setStreamVolume(stream, 1, 0);
    688             volume = mAudioManager.getStreamVolume(stream);
    689             while (volume < maxVolume) {
    690                 volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(stream));
    691                 mAudioManager.adjustStreamVolume(stream, ADJUST_RAISE, 0);
    692                 assertEquals(Math.min(volume + volumeDelta, maxVolume),
    693                         mAudioManager.getStreamVolume(stream));
    694                 volume = mAudioManager.getStreamVolume(stream);
    695             }
    696 
    697             // volume same
    698             mAudioManager.setStreamVolume(stream, maxVolume, 0);
    699             for (int k = 0; k < maxVolume; k++) {
    700                 mAudioManager.adjustStreamVolume(stream, ADJUST_SAME, 0);
    701                 assertEquals(maxVolume, mAudioManager.getStreamVolume(stream));
    702             }
    703 
    704             mAudioManager.setStreamVolume(stream, maxVolume, 0);
    705         }
    706 
    707         if (mUseFixedVolume) {
    708             return;
    709         }
    710 
    711         // adjust volume
    712         mAudioManager.adjustVolume(ADJUST_RAISE, 0);
    713         Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    714 
    715         boolean isMusicPlayingBeforeTest = false;
    716         if (mAudioManager.isMusicActive()) {
    717             isMusicPlayingBeforeTest = true;
    718         }
    719 
    720         MediaPlayer mp = MediaPlayer.create(mContext, MP3_TO_PLAY);
    721         assertNotNull(mp);
    722         mp.setAudioStreamType(STREAM_MUSIC);
    723         mp.setLooping(true);
    724         mp.start();
    725         Thread.sleep(TIME_TO_PLAY);
    726         assertTrue(mAudioManager.isMusicActive());
    727 
    728         // adjust volume as ADJUST_SAME
    729         for (int k = 0; k < maxMusicVolume; k++) {
    730             mAudioManager.adjustVolume(ADJUST_SAME, 0);
    731             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    732             assertEquals(maxMusicVolume, mAudioManager.getStreamVolume(STREAM_MUSIC));
    733         }
    734 
    735         // adjust volume as ADJUST_RAISE
    736         mAudioManager.setStreamVolume(STREAM_MUSIC, 0, 0);
    737         volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(STREAM_MUSIC));
    738         mAudioManager.adjustVolume(ADJUST_RAISE, 0);
    739         Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    740         assertEquals(Math.min(volumeDelta, maxMusicVolume),
    741                 mAudioManager.getStreamVolume(STREAM_MUSIC));
    742 
    743         // adjust volume as ADJUST_LOWER
    744         mAudioManager.setStreamVolume(STREAM_MUSIC, maxMusicVolume, 0);
    745         maxMusicVolume = mAudioManager.getStreamVolume(STREAM_MUSIC);
    746         volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(STREAM_MUSIC));
    747         mAudioManager.adjustVolume(ADJUST_LOWER, 0);
    748         Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    749         assertEquals(Math.max(0, maxMusicVolume - volumeDelta),
    750                 mAudioManager.getStreamVolume(STREAM_MUSIC));
    751 
    752         mp.stop();
    753         mp.release();
    754         Thread.sleep(TIME_TO_PLAY);
    755         if (!isMusicPlayingBeforeTest) {
    756             assertFalse(mAudioManager.isMusicActive());
    757         }
    758     }
    759 
    760     public void testAccessibilityVolume() throws Exception {
    761         if (mUseFixedVolume) {
    762             Log.i("AudioManagerTest", "testAccessibilityVolume() skipped: fixed volume");
    763             return;
    764         }
    765         final int maxA11yVol = mAudioManager.getStreamMaxVolume(STREAM_ACCESSIBILITY);
    766         assertTrue("Max a11yVol not strictly positive", maxA11yVol > 0);
    767         int currentVol = mAudioManager.getStreamVolume(STREAM_ACCESSIBILITY);
    768 
    769         // changing STREAM_ACCESSIBILITY is subject to permission, shouldn't be able to change it
    770         // test setStreamVolume
    771         final int testSetVol;
    772         if (currentVol != maxA11yVol) {
    773             testSetVol = maxA11yVol;
    774         } else {
    775             testSetVol = maxA11yVol - 1;
    776         }
    777         mAudioManager.setStreamVolume(STREAM_ACCESSIBILITY, testSetVol, 0);
    778         Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    779         currentVol = mAudioManager.getStreamVolume(STREAM_ACCESSIBILITY);
    780         assertTrue("Should not be able to change A11y vol", currentVol != testSetVol);
    781 
    782         // test adjustStreamVolume
    783         //        LOWER
    784         currentVol = mAudioManager.getStreamVolume(STREAM_ACCESSIBILITY);
    785         if (currentVol > 0) {
    786             mAudioManager.adjustStreamVolume(STREAM_ACCESSIBILITY, ADJUST_LOWER, 0);
    787             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    788             int newVol = mAudioManager.getStreamVolume(STREAM_ACCESSIBILITY);
    789             assertTrue("Should not be able to lower A11y vol", currentVol == newVol);
    790         }
    791         //        RAISE
    792         currentVol = mAudioManager.getStreamVolume(STREAM_ACCESSIBILITY);
    793         if (currentVol < maxA11yVol) {
    794             mAudioManager.adjustStreamVolume(STREAM_ACCESSIBILITY, ADJUST_RAISE, 0);
    795             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
    796             int newVol = mAudioManager.getStreamVolume(STREAM_ACCESSIBILITY);
    797             assertTrue("Should not be able to raise A11y vol", currentVol == newVol);
    798         }
    799     }
    800 
    801     public void testSetVoiceCallVolumeToZeroPermission() {
    802         // Verify that only apps with MODIFY_PHONE_STATE can set VOICE_CALL_STREAM to 0
    803         mAudioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, 0, 0);
    804         assertTrue("MODIFY_PHONE_STATE is required in order to set voice call volume to 0",
    805                     mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL) != 0);
    806     }
    807 
    808     public void testMuteFixedVolume() throws Exception {
    809         int[] streams = {
    810                 AudioManager.STREAM_VOICE_CALL,
    811                 AudioManager.STREAM_MUSIC,
    812                 AudioManager.STREAM_RING,
    813                 AudioManager.STREAM_ALARM,
    814                 AudioManager.STREAM_NOTIFICATION,
    815                 AudioManager.STREAM_SYSTEM};
    816         if (mUseFixedVolume) {
    817             for (int stream : streams) {
    818                 mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
    819                 assertFalse("Muting should not affect a fixed volume device.",
    820                         mAudioManager.isStreamMute(stream));
    821 
    822                 mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_TOGGLE_MUTE, 0);
    823                 assertFalse("Toggling mute should not affect a fixed volume device.",
    824                         mAudioManager.isStreamMute(stream));
    825 
    826                 mAudioManager.setStreamMute(stream, true);
    827                 assertFalse("Muting should not affect a fixed volume device.",
    828                         mAudioManager.isStreamMute(stream));
    829             }
    830         }
    831     }
    832 
    833     public void testMuteDndAffectedStreams() throws Exception {
    834         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
    835             return;
    836         }
    837         int[] streams = { AudioManager.STREAM_RING };
    838         // Mute streams
    839         Utils.toggleNotificationPolicyAccess(
    840                 mContext.getPackageName(), getInstrumentation(), true);
    841         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
    842         Utils.toggleNotificationPolicyAccess(
    843                 mContext.getPackageName(), getInstrumentation(), false);
    844         // Verify streams cannot be unmuted without policy access.
    845         for (int stream : streams) {
    846             try {
    847                 mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0);
    848                 assertEquals("Apps without Notification policy access can't change ringer mode",
    849                         RINGER_MODE_SILENT, mAudioManager.getRingerMode());
    850             } catch (SecurityException e) {
    851             }
    852 
    853             try {
    854                 mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_TOGGLE_MUTE,
    855                         0);
    856                 assertEquals("Apps without Notification policy access can't change ringer mode",
    857                         RINGER_MODE_SILENT, mAudioManager.getRingerMode());
    858             } catch (SecurityException e) {
    859             }
    860 
    861             try {
    862                 mAudioManager.setStreamMute(stream, false);
    863                 assertEquals("Apps without Notification policy access can't change ringer mode",
    864                         RINGER_MODE_SILENT, mAudioManager.getRingerMode());
    865             } catch (SecurityException e) {
    866             }
    867         }
    868 
    869         // This ensures we're out of vibrate or silent modes.
    870         Utils.toggleNotificationPolicyAccess(
    871                 mContext.getPackageName(), getInstrumentation(), true);
    872         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    873         for (int stream : streams) {
    874             // ensure each stream is on and turned up.
    875             mAudioManager.setStreamVolume(stream,
    876                     mAudioManager.getStreamMaxVolume(stream),
    877                     0);
    878 
    879             Utils.toggleNotificationPolicyAccess(
    880                     mContext.getPackageName(), getInstrumentation(), false);
    881             try {
    882                 mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
    883                 assertEquals("Apps without Notification policy access can't change ringer mode",
    884                         RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
    885             } catch (SecurityException e) {
    886             }
    887             try {
    888                 mAudioManager.adjustStreamVolume(
    889                         stream, AudioManager.ADJUST_TOGGLE_MUTE, 0);
    890                 assertEquals("Apps without Notification policy access can't change ringer mode",
    891                         RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
    892             } catch (SecurityException e) {
    893             }
    894 
    895             try {
    896                 mAudioManager.setStreamMute(stream, true);
    897                 assertEquals("Apps without Notification policy access can't change ringer mode",
    898                         RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
    899             } catch (SecurityException e) {
    900             }
    901             Utils.toggleNotificationPolicyAccess(
    902                     mContext.getPackageName(), getInstrumentation(), true);
    903             testStreamMuting(stream);
    904         }
    905     }
    906 
    907     public void testMuteDndUnaffectedStreams() throws Exception {
    908         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
    909             return;
    910         }
    911         int[] streams = {
    912                 AudioManager.STREAM_VOICE_CALL,
    913                 AudioManager.STREAM_MUSIC,
    914                 AudioManager.STREAM_ALARM
    915         };
    916 
    917         int muteAffectedStreams = System.getInt(mContext.getContentResolver(),
    918                 System.MUTE_STREAMS_AFFECTED,
    919                 // same defaults as in AudioService. Should be kept in sync.
    920                  (1 << STREAM_MUSIC) |
    921                          (1 << AudioManager.STREAM_RING) |
    922                          (1 << AudioManager.STREAM_NOTIFICATION) |
    923                          (1 << AudioManager.STREAM_SYSTEM) |
    924                          (1 << AudioManager.STREAM_VOICE_CALL));
    925 
    926         Utils.toggleNotificationPolicyAccess(
    927                 mContext.getPackageName(), getInstrumentation(), true);
    928         // This ensures we're out of vibrate or silent modes.
    929         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
    930         Utils.toggleNotificationPolicyAccess(
    931                 mContext.getPackageName(), getInstrumentation(), false);
    932         for (int stream : streams) {
    933             // ensure each stream is on and turned up.
    934             mAudioManager.setStreamVolume(stream,
    935                     mAudioManager.getStreamMaxVolume(stream),
    936                     0);
    937             if (((1 << stream) & muteAffectedStreams) == 0) {
    938                 mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
    939                 assertFalse("Stream " + stream + " should not be affected by mute.",
    940                         mAudioManager.isStreamMute(stream));
    941                 mAudioManager.setStreamMute(stream, true);
    942                 assertFalse("Stream " + stream + " should not be affected by mute.",
    943                         mAudioManager.isStreamMute(stream));
    944                 mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_TOGGLE_MUTE,
    945                         0);
    946                 assertFalse("Stream " + stream + " should not be affected by mute.",
    947                         mAudioManager.isStreamMute(stream));
    948                 continue;
    949             }
    950             testStreamMuting(stream);
    951         }
    952     }
    953 
    954     private void testStreamMuting(int stream) {
    955         // Voice call requires MODIFY_PHONE_STATE, so we should not be able to mute
    956         if (stream == AudioManager.STREAM_VOICE_CALL) {
    957             mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
    958             assertFalse("Muting voice call stream (" + stream + ") should require "
    959                             + "MODIFY_PHONE_STATE.", mAudioManager.isStreamMute(stream));
    960         } else {
    961             mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
    962             assertTrue("Muting stream " + stream + " failed.",
    963                     mAudioManager.isStreamMute(stream));
    964 
    965             mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0);
    966             assertFalse("Unmuting stream " + stream + " failed.",
    967                     mAudioManager.isStreamMute(stream));
    968 
    969             mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_TOGGLE_MUTE, 0);
    970             assertTrue("Toggling mute on stream " + stream + " failed.",
    971                     mAudioManager.isStreamMute(stream));
    972 
    973             mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_TOGGLE_MUTE, 0);
    974             assertFalse("Toggling mute on stream " + stream + " failed.",
    975                     mAudioManager.isStreamMute(stream));
    976 
    977             mAudioManager.setStreamMute(stream, true);
    978             assertTrue("Muting stream " + stream + " using setStreamMute failed",
    979                     mAudioManager.isStreamMute(stream));
    980 
    981             // mute it three more times to verify the ref counting is gone.
    982             mAudioManager.setStreamMute(stream, true);
    983             mAudioManager.setStreamMute(stream, true);
    984             mAudioManager.setStreamMute(stream, true);
    985 
    986             mAudioManager.setStreamMute(stream, false);
    987             assertFalse("Unmuting stream " + stream + " using setStreamMute failed.",
    988                     mAudioManager.isStreamMute(stream));
    989         }
    990     }
    991 
    992     public void testSetInvalidRingerMode() {
    993         int ringerMode = mAudioManager.getRingerMode();
    994         mAudioManager.setRingerMode(-1337);
    995         assertEquals(ringerMode, mAudioManager.getRingerMode());
    996 
    997         mAudioManager.setRingerMode(-3007);
    998         assertEquals(ringerMode, mAudioManager.getRingerMode());
    999     }
   1000 
   1001     public void testAdjustVolumeInTotalSilenceMode() throws Exception {
   1002         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1003             return;
   1004         }
   1005         try {
   1006             Utils.toggleNotificationPolicyAccess(
   1007                     mContext.getPackageName(), getInstrumentation(), true);
   1008             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1009             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);
   1010             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1011             int musicVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
   1012             mAudioManager.adjustStreamVolume(
   1013                     AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
   1014             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1015             assertEquals(musicVolume, mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
   1016 
   1017         } finally {
   1018             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1019         }
   1020     }
   1021 
   1022     public void testAdjustVolumeInAlarmsOnlyMode() throws Exception {
   1023         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1024             return;
   1025         }
   1026         try {
   1027             Utils.toggleNotificationPolicyAccess(
   1028                     mContext.getPackageName(), getInstrumentation(), true);
   1029             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1030 
   1031             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALARMS);
   1032             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1033             int musicVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
   1034             mAudioManager.adjustStreamVolume(
   1035                     AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
   1036             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1037             int volumeDelta =
   1038                     getVolumeDelta(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
   1039             assertEquals(musicVolume + volumeDelta,
   1040                     mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
   1041 
   1042         } finally {
   1043             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1044         }
   1045     }
   1046 
   1047     public void testSetStreamVolumeInTotalSilenceMode() throws Exception {
   1048         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1049             return;
   1050         }
   1051         try {
   1052             Utils.toggleNotificationPolicyAccess(
   1053                     mContext.getPackageName(), getInstrumentation(), true);
   1054             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
   1055             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1056 
   1057             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);
   1058             // delay for streams to get into correct volume states
   1059             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1060 
   1061             int musicVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
   1062             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 7, 0);
   1063             assertEquals(musicVolume, mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
   1064             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 7, 0);
   1065             assertEquals(7, mAudioManager.getStreamVolume(AudioManager.STREAM_RING));
   1066         } finally {
   1067             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1068         }
   1069     }
   1070 
   1071     public void testSetStreamVolumeInAlarmsOnlyMode() throws Exception {
   1072         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1073             return;
   1074         }
   1075         try {
   1076             Utils.toggleNotificationPolicyAccess(
   1077                     mContext.getPackageName(), getInstrumentation(), true);
   1078             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
   1079             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1080             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALARMS);
   1081             // delay for streams to get into correct volume states
   1082             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1083 
   1084             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 3, 0);
   1085             assertEquals(3, mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
   1086             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 7, 0);
   1087             assertEquals(7, mAudioManager.getStreamVolume(AudioManager.STREAM_RING));
   1088         } finally {
   1089             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1090         }
   1091     }
   1092 
   1093     public void testSetStreamVolumeInPriorityOnlyMode() throws Exception {
   1094         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1095             return;
   1096         }
   1097         Utils.toggleNotificationPolicyAccess(
   1098                 mContext.getPackageName(), getInstrumentation(), true);
   1099 
   1100         try {
   1101             // turn off zen, set stream volumes to check for later
   1102             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1103 
   1104             final int testRingerVol = getTestRingerVol();
   1105             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1106             mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
   1107             int musicVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
   1108             int alarmVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM);
   1109 
   1110             // disallow all sounds in priority only, turn on priority only DND, try to change volume
   1111             mNm.setNotificationPolicy(new NotificationManager.Policy(0, 0 , 0));
   1112             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
   1113             // delay for streams to get into correct volume states
   1114             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1115             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 3, 0);
   1116             mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 5, 0);
   1117             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, testRingerVol, 0);
   1118 
   1119             // Turn off zen and make sure stream levels are still the same prior to zen
   1120             // aside from ringer since ringer can exit dnd
   1121             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1122             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS); // delay for streams to get into correct states
   1123             assertEquals(musicVolume, mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
   1124             assertEquals(alarmVolume, mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM));
   1125             assertEquals(testRingerVol, mAudioManager.getStreamVolume(AudioManager.STREAM_RING));
   1126         } finally {
   1127             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1128         }
   1129     }
   1130 
   1131     public void testAdjustVolumeInPriorityOnly() throws Exception {
   1132         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1133             return;
   1134         }
   1135 
   1136         Utils.toggleNotificationPolicyAccess(
   1137                 mContext.getPackageName(), getInstrumentation(), true);
   1138         try {
   1139             // turn off zen, set stream volumes to check for later
   1140             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1141             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
   1142             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1143             mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
   1144             int ringVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_RING);
   1145             int musicVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
   1146             int alarmVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM);
   1147 
   1148             // disallow all sounds in priority only, turn on priority only DND, try to change volume
   1149             mNm.setNotificationPolicy(new NotificationManager.Policy(0, 0, 0));
   1150             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
   1151             // delay for streams to get into correct mute states
   1152             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1153             mAudioManager.adjustStreamVolume(
   1154                     AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);
   1155             mAudioManager.adjustStreamVolume(
   1156                     AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
   1157             mAudioManager.adjustStreamVolume(
   1158                     AudioManager.STREAM_ALARM, AudioManager.ADJUST_RAISE, 0);
   1159 
   1160             // Turn off zen and make sure stream levels are still the same prior to zen
   1161             // aside from ringer since ringer can exit dnd
   1162             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1163             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS); // delay for streams to get into correct states
   1164             assertEquals(musicVolume, mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
   1165             assertEquals(alarmVolume, mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM));
   1166 
   1167             int volumeDelta =
   1168                     getVolumeDelta(mAudioManager.getStreamVolume(AudioManager.STREAM_RING));
   1169             assertEquals(ringVolume + volumeDelta,
   1170                     mAudioManager.getStreamVolume(AudioManager.STREAM_RING));
   1171         } finally {
   1172             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1173         }
   1174     }
   1175 
   1176     public void testPriorityOnlyMuteAll() throws Exception {
   1177         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1178             return;
   1179         }
   1180 
   1181         Utils.toggleNotificationPolicyAccess(
   1182                 mContext.getPackageName(), getInstrumentation(), true);
   1183         try {
   1184             // ensure volume is not muted/0 to start test
   1185             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1186             mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
   1187             mAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 1, 0);
   1188             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
   1189 
   1190             // disallow all sounds in priority only, turn on priority only DND
   1191             mNm.setNotificationPolicy(new NotificationManager.Policy(0, 0, 0));
   1192             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
   1193             // delay for streams to get into correct mute states
   1194             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1195 
   1196             assertTrue("Music (media) stream should be muted",
   1197                     mAudioManager.isStreamMute(AudioManager.STREAM_MUSIC));
   1198             assertTrue("System stream should be muted",
   1199                     mAudioManager.isStreamMute(AudioManager.STREAM_SYSTEM));
   1200             assertTrue("Alarm stream should be muted",
   1201                     mAudioManager.isStreamMute(AudioManager.STREAM_ALARM));
   1202 
   1203             // Test requires that the phone's default state has no channels that can bypass dnd
   1204             assertTrue("Ringer stream should be muted",
   1205                     mAudioManager.isStreamMute(AudioManager.STREAM_RING));
   1206         } finally {
   1207             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1208         }
   1209     }
   1210 
   1211     public void testPriorityOnlyMediaAllowed() throws Exception {
   1212         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1213             return;
   1214         }
   1215         Utils.toggleNotificationPolicyAccess(
   1216                 mContext.getPackageName(), getInstrumentation(), true);
   1217         try {
   1218             // ensure volume is not muted/0 to start test
   1219             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1220             mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
   1221             mAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 1, 0);
   1222             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
   1223 
   1224             // allow only media in priority only
   1225             mNm.setNotificationPolicy(new NotificationManager.Policy(
   1226                     NotificationManager.Policy.PRIORITY_CATEGORY_MEDIA, 0, 0));
   1227             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
   1228             // delay for streams to get into correct mute states
   1229             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1230 
   1231             assertFalse("Music (media) stream should not be muted",
   1232                     mAudioManager.isStreamMute(AudioManager.STREAM_MUSIC));
   1233             assertTrue("System stream should be muted",
   1234                     mAudioManager.isStreamMute(AudioManager.STREAM_SYSTEM));
   1235             assertTrue("Alarm stream should be muted",
   1236                     mAudioManager.isStreamMute(AudioManager.STREAM_ALARM));
   1237 
   1238             // Test requires that the phone's default state has no channels that can bypass dnd
   1239             assertTrue("Ringer stream should be muted",
   1240                     mAudioManager.isStreamMute(AudioManager.STREAM_RING));
   1241         } finally {
   1242             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1243         }
   1244     }
   1245 
   1246     public void testPriorityOnlySystemAllowed() throws Exception {
   1247         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1248             return;
   1249         }
   1250 
   1251         Utils.toggleNotificationPolicyAccess(
   1252                 mContext.getPackageName(), getInstrumentation(), true);
   1253         try {
   1254             // ensure volume is not muted/0 to start test
   1255             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1256             mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
   1257             mAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 1, 0);
   1258             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
   1259 
   1260             // allow only system in priority only
   1261             mNm.setNotificationPolicy(new NotificationManager.Policy(
   1262                     NotificationManager.Policy.PRIORITY_CATEGORY_SYSTEM, 0, 0));
   1263             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
   1264             // delay for streams to get into correct mute states
   1265             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1266 
   1267             assertTrue("Music (media) stream should be muted",
   1268                     mAudioManager.isStreamMute(AudioManager.STREAM_MUSIC));
   1269             assertFalse("System stream should not be muted",
   1270                     mAudioManager.isStreamMute(AudioManager.STREAM_SYSTEM));
   1271             assertTrue("Alarm stream should be muted",
   1272                     mAudioManager.isStreamMute(AudioManager.STREAM_ALARM));
   1273 
   1274             // Test requires that the phone's default state has no channels that can bypass dnd
   1275             assertTrue("Ringer stream should be muted",
   1276                     mAudioManager.isStreamMute(AudioManager.STREAM_RING));
   1277         } finally {
   1278             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1279         }
   1280     }
   1281 
   1282     public void testPriorityOnlyAlarmsAllowed() throws Exception {
   1283         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1284             return;
   1285         }
   1286 
   1287         Utils.toggleNotificationPolicyAccess(
   1288                 mContext.getPackageName(), getInstrumentation(), true);
   1289         try {
   1290             // ensure volume is not muted/0 to start test
   1291             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1292             mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
   1293             mAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 1, 0);
   1294             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
   1295 
   1296             // allow only alarms in priority only
   1297             mNm.setNotificationPolicy(new NotificationManager.Policy(
   1298                     NotificationManager.Policy.PRIORITY_CATEGORY_ALARMS, 0, 0));
   1299             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
   1300             // delay for streams to get into correct mute states
   1301             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1302 
   1303             assertTrue("Music (media) stream should be muted",
   1304                     mAudioManager.isStreamMute(AudioManager.STREAM_MUSIC));
   1305             assertTrue("System stream should be muted",
   1306                     mAudioManager.isStreamMute(AudioManager.STREAM_SYSTEM));
   1307             assertFalse("Alarm stream should not be muted",
   1308                     mAudioManager.isStreamMute(AudioManager.STREAM_ALARM));
   1309 
   1310             // Test requires that the phone's default state has no channels that can bypass dnd
   1311             assertTrue("Ringer stream should be muted",
   1312                     mAudioManager.isStreamMute(AudioManager.STREAM_RING));
   1313         } finally {
   1314             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1315         }
   1316     }
   1317 
   1318     public void testPriorityOnlyRingerAllowed() throws Exception {
   1319         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1320             return;
   1321         }
   1322 
   1323         Utils.toggleNotificationPolicyAccess(
   1324                 mContext.getPackageName(), getInstrumentation(), true);
   1325         try {
   1326             // ensure volume is not muted/0 to start test
   1327             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1328             mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
   1329             mAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 1, 0);
   1330             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
   1331 
   1332             // allow only reminders in priority only
   1333             mNm.setNotificationPolicy(new NotificationManager.Policy(
   1334                     NotificationManager.Policy.PRIORITY_CATEGORY_REMINDERS, 0, 0));
   1335             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
   1336             // delay for streams to get into correct mute states
   1337             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1338 
   1339             assertTrue("Music (media) stream should be muted",
   1340                     mAudioManager.isStreamMute(AudioManager.STREAM_MUSIC));
   1341             assertTrue("System stream should be muted",
   1342                     mAudioManager.isStreamMute(AudioManager.STREAM_SYSTEM));
   1343             assertTrue("Alarm stream should be muted",
   1344                     mAudioManager.isStreamMute(AudioManager.STREAM_ALARM));
   1345             assertFalse("Ringer stream should not be muted",
   1346                     mAudioManager.isStreamMute(AudioManager.STREAM_RING));
   1347 
   1348         } finally {
   1349             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1350         }
   1351     }
   1352 
   1353     public void testPriorityOnlyChannelsCanBypassDnd() throws Exception {
   1354         final String NOTIFICATION_CHANNEL_ID = "test_id";
   1355         if (mSkipRingerTests || !mSupportNotificationPolicyAccess) {
   1356             return;
   1357         }
   1358 
   1359         Utils.toggleNotificationPolicyAccess(
   1360                 mContext.getPackageName(), getInstrumentation(), true);
   1361         NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "TEST",
   1362                 NotificationManager.IMPORTANCE_DEFAULT);
   1363         try {
   1364             // ensure volume is not muted/0 to start test
   1365             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
   1366             mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
   1367             mAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 1, 0);
   1368             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
   1369 
   1370             // create a channel that can bypass dnd
   1371             channel.setBypassDnd(true);
   1372             mNm.createNotificationChannel(channel);
   1373 
   1374             // allow nothing
   1375             mNm.setNotificationPolicy(new NotificationManager.Policy(0,0, 0));
   1376             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
   1377             // delay for streams to get into correct mute states
   1378             Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
   1379 
   1380             assertTrue("Music (media) stream should be muted",
   1381                     mAudioManager.isStreamMute(AudioManager.STREAM_MUSIC));
   1382             assertTrue("System stream should be muted",
   1383                     mAudioManager.isStreamMute(AudioManager.STREAM_SYSTEM));
   1384             assertTrue("Alarm stream should be muted",
   1385                     mAudioManager.isStreamMute(AudioManager.STREAM_ALARM));
   1386             assertFalse("Ringer stream should not be muted",
   1387                     mAudioManager.isStreamMute(AudioManager.STREAM_RING));
   1388 
   1389         } finally {
   1390             setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
   1391             mNm.deleteNotificationChannel(NOTIFICATION_CHANNEL_ID);
   1392             Utils.toggleNotificationPolicyAccess(mContext.getPackageName(), getInstrumentation(),
   1393                     false);
   1394 
   1395         }
   1396     }
   1397 
   1398     public void testAdjustVolumeWithIllegalDirection() throws Exception {
   1399         // Call the method with illegal direction. System should not reboot.
   1400         mAudioManager.adjustVolume(37, 0);
   1401     }
   1402 
   1403     private final int[] PUBLIC_STREAM_TYPES = { AudioManager.STREAM_VOICE_CALL,
   1404             AudioManager.STREAM_SYSTEM, AudioManager.STREAM_RING, AudioManager.STREAM_MUSIC,
   1405             AudioManager.STREAM_ALARM, AudioManager.STREAM_NOTIFICATION,
   1406             AudioManager.STREAM_DTMF,  AudioManager.STREAM_ACCESSIBILITY };
   1407 
   1408     public void testGetStreamVolumeDbWithIllegalArguments() throws Exception {
   1409         Exception ex = null;
   1410         // invalid stream type
   1411         try {
   1412             float gain = mAudioManager.getStreamVolumeDb(-100 /*streamType*/, 0,
   1413                     AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
   1414         } catch (Exception e) {
   1415             ex = e; // expected
   1416         }
   1417         assertNotNull("No exception was thrown for an invalid stream type", ex);
   1418         assertEquals("Wrong exception thrown for invalid stream type",
   1419                 ex.getClass(), IllegalArgumentException.class);
   1420 
   1421         // invalid volume index
   1422         ex = null;
   1423         try {
   1424             float gain = mAudioManager.getStreamVolumeDb(AudioManager.STREAM_MUSIC, -101 /*volume*/,
   1425                     AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
   1426         } catch (Exception e) {
   1427             ex = e; // expected
   1428         }
   1429         assertNotNull("No exception was thrown for an invalid volume index", ex);
   1430         assertEquals("Wrong exception thrown for invalid volume index",
   1431                 ex.getClass(), IllegalArgumentException.class);
   1432 
   1433         // invalid out of range volume index
   1434         ex = null;
   1435         try {
   1436             final int maxVol = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
   1437             float gain = mAudioManager.getStreamVolumeDb(AudioManager.STREAM_MUSIC, maxVol + 1,
   1438                     AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
   1439         } catch (Exception e) {
   1440             ex = e; // expected
   1441         }
   1442         assertNotNull("No exception was thrown for an invalid out of range volume index", ex);
   1443         assertEquals("Wrong exception thrown for invalid out of range volume index",
   1444                 ex.getClass(), IllegalArgumentException.class);
   1445 
   1446         // invalid device type
   1447         ex = null;
   1448         try {
   1449             float gain = mAudioManager.getStreamVolumeDb(AudioManager.STREAM_MUSIC, 0,
   1450                     -102 /*deviceType*/);
   1451         } catch (Exception e) {
   1452             ex = e; // expected
   1453         }
   1454         assertNotNull("No exception was thrown for an invalid device type", ex);
   1455         assertEquals("Wrong exception thrown for invalid device type",
   1456                 ex.getClass(), IllegalArgumentException.class);
   1457 
   1458         // invalid input device type
   1459         ex = null;
   1460         try {
   1461             float gain = mAudioManager.getStreamVolumeDb(AudioManager.STREAM_MUSIC, 0,
   1462                     AudioDeviceInfo.TYPE_BUILTIN_MIC);
   1463         } catch (Exception e) {
   1464             ex = e; // expected
   1465         }
   1466         assertNotNull("No exception was thrown for an invalid input device type", ex);
   1467         assertEquals("Wrong exception thrown for invalid input device type",
   1468                 ex.getClass(), IllegalArgumentException.class);
   1469     }
   1470 
   1471     public void testGetStreamVolumeDb() throws Exception {
   1472         for (int streamType : PUBLIC_STREAM_TYPES) {
   1473             // verify mininum index is strictly inferior to maximum index
   1474             final int minIndex = mAudioManager.getStreamMinVolume(streamType);
   1475             final int maxIndex = mAudioManager.getStreamMaxVolume(streamType);
   1476             assertTrue("Min vol index (" + minIndex + ") for stream " + streamType + " not inferior"
   1477                     + " to max vol index (" + maxIndex + ")", minIndex <= maxIndex);
   1478             float prevGain = Float.NEGATIVE_INFINITY;
   1479             // verify gain increases with the volume indices
   1480             for (int idx = minIndex ; idx <= maxIndex ; idx++) {
   1481                 float gain = mAudioManager.getStreamVolumeDb(streamType, idx,
   1482                         AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
   1483                 assertTrue("Non-monotonically increasing gain at index " + idx + " for stream"
   1484                         + streamType, prevGain <= gain);
   1485                 prevGain = gain;
   1486             }
   1487         }
   1488     }
   1489 
   1490     public void testAdjustSuggestedStreamVolumeWithIllegalArguments() throws Exception {
   1491         // Call the method with illegal direction. System should not reboot.
   1492         mAudioManager.adjustSuggestedStreamVolume(37, AudioManager.STREAM_MUSIC, 0);
   1493 
   1494         // Call the method with illegal stream. System should not reboot.
   1495         mAudioManager.adjustSuggestedStreamVolume(AudioManager.ADJUST_RAISE, 66747, 0);
   1496     }
   1497 
   1498     @CddTest(requirement="5.4.4/C-4-1")
   1499     public void testGetMicrophones() throws Exception {
   1500         if (!mContext.getPackageManager().hasSystemFeature(
   1501                 PackageManager.FEATURE_MICROPHONE)) {
   1502             return;
   1503         }
   1504         List<MicrophoneInfo> microphones = mAudioManager.getMicrophones();
   1505         assertTrue(microphones.size() > 0);
   1506         for (int i = 0; i < microphones.size(); i++) {
   1507             MicrophoneInfo microphone = microphones.get(i);
   1508             Log.i(TAG, "deviceId:" + microphone.getDescription());
   1509             Log.i(TAG, "portId:" + microphone.getId());
   1510             Log.i(TAG, "type:" + microphone.getType());
   1511             Log.i(TAG, "address:" + microphone.getAddress());
   1512             Log.i(TAG, "deviceLocation:" + microphone.getLocation());
   1513             Log.i(TAG, "deviceGroup:" + microphone.getGroup()
   1514                     + " index:" + microphone.getIndexInTheGroup());
   1515             MicrophoneInfo.Coordinate3F position = microphone.getPosition();
   1516             Log.i(TAG, "position:" + position.x + " " + position.y + " " + position.z);
   1517             MicrophoneInfo.Coordinate3F orientation = microphone.getOrientation();
   1518             Log.i(TAG, "orientation:" + orientation.x + " "
   1519                     + orientation.y + " " + orientation.z);
   1520             Log.i(TAG, "frequencyResponse:" + microphone.getFrequencyResponse());
   1521             Log.i(TAG, "channelMapping:" + microphone.getChannelMapping());
   1522             Log.i(TAG, "sensitivity:" + microphone.getSensitivity());
   1523             Log.i(TAG, "max spl:" + microphone.getMaxSpl());
   1524             Log.i(TAG, "min spl:" + microphone.getMinSpl());
   1525             Log.i(TAG, "directionality:" + microphone.getDirectionality());
   1526             Log.i(TAG, "--------------");
   1527         }
   1528     }
   1529 
   1530     public void testIsHapticPlaybackSupported() throws Exception {
   1531         // Calling the API to make sure it doesn't crash.
   1532         Log.i(TAG, "isHapticPlaybackSupported: " + AudioManager.isHapticPlaybackSupported());
   1533     }
   1534 
   1535     private void setInterruptionFilter(int filter) throws Exception {
   1536         mNm.setInterruptionFilter(filter);
   1537         for (int i = 0; i < 5; i++) {
   1538             if (mNm.getCurrentInterruptionFilter() == filter) {
   1539                 break;
   1540             }
   1541             Thread.sleep(1000);
   1542         }
   1543     }
   1544 
   1545     private int getVolumeDelta(int volume) {
   1546         return 1;
   1547     }
   1548 
   1549     private int getTestRingerVol() {
   1550         final int currentRingVol = mAudioManager.getStreamVolume(STREAM_RING);
   1551         final int maxRingVol = mAudioManager.getStreamMaxVolume(STREAM_RING);
   1552         if (currentRingVol != maxRingVol) {
   1553             return maxRingVol;
   1554         } else {
   1555             return maxRingVol - 1;
   1556         }
   1557     }
   1558 
   1559     public void testAllowedCapturePolicy() throws Exception {
   1560         final int policy = mAudioManager.getAllowedCapturePolicy();
   1561         assertEquals("Wrong default capture policy", AudioAttributes.ALLOW_CAPTURE_BY_ALL, policy);
   1562 
   1563         for (int setPolicy : new int[] { AudioAttributes.ALLOW_CAPTURE_BY_NONE,
   1564                                       AudioAttributes.ALLOW_CAPTURE_BY_SYSTEM,
   1565                                       AudioAttributes.ALLOW_CAPTURE_BY_ALL}) {
   1566             mAudioManager.setAllowedCapturePolicy(setPolicy);
   1567             final int getPolicy = mAudioManager.getAllowedCapturePolicy();
   1568             assertEquals("Allowed capture policy doesn't match", setPolicy, getPolicy);
   1569         }
   1570     }
   1571 }
   1572