Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.server.telecom.tests;
     18 
     19 import android.app.NotificationManager;
     20 import android.content.Context;
     21 import android.content.res.Resources;
     22 import android.media.AudioAttributes;
     23 import android.media.AudioManager;
     24 import android.media.Ringtone;
     25 import android.net.Uri;
     26 import android.os.Bundle;
     27 import android.os.VibrationEffect;
     28 import android.os.Vibrator;
     29 import android.telecom.TelecomManager;
     30 import android.test.suitebuilder.annotation.SmallTest;
     31 
     32 import com.android.server.telecom.AsyncRingtonePlayer;
     33 import com.android.server.telecom.Call;
     34 import com.android.server.telecom.InCallController;
     35 import com.android.server.telecom.InCallTonePlayer;
     36 import com.android.server.telecom.Ringer;
     37 import com.android.server.telecom.RingtoneFactory;
     38 import com.android.server.telecom.SystemSettingsUtil;
     39 
     40 import org.junit.Before;
     41 import org.junit.Test;
     42 import org.junit.runner.RunWith;
     43 import org.junit.runners.JUnit4;
     44 import org.mockito.Mock;
     45 
     46 import static org.junit.Assert.assertFalse;
     47 import static org.junit.Assert.assertTrue;
     48 import static org.mockito.ArgumentMatchers.any;
     49 import static org.mockito.ArgumentMatchers.anyInt;
     50 import static org.mockito.ArgumentMatchers.eq;
     51 import static org.mockito.Mockito.mock;
     52 import static org.mockito.Mockito.never;
     53 import static org.mockito.Mockito.verify;
     54 import static org.mockito.Mockito.when;
     55 
     56 @RunWith(JUnit4.class)
     57 public class RingerTest extends TelecomTestCase {
     58     private static final Uri FAKE_RINGTONE_URI = Uri.parse("content://media/fake/audio/1729");
     59 
     60     @Mock InCallTonePlayer.Factory mockPlayerFactory;
     61     @Mock SystemSettingsUtil mockSystemSettingsUtil;
     62     @Mock AsyncRingtonePlayer mockRingtonePlayer;
     63     @Mock RingtoneFactory mockRingtoneFactory;
     64     @Mock Vibrator mockVibrator;
     65     @Mock InCallController mockInCallController;
     66 
     67     @Mock InCallTonePlayer mockTonePlayer;
     68     @Mock Call mockCall1;
     69     @Mock Call mockCall2;
     70 
     71     Ringer mRingerUnderTest;
     72     AudioManager mockAudioManager;
     73 
     74     @Override
     75     @Before
     76     public void setUp() throws Exception {
     77         super.setUp();
     78         mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
     79         mRingerUnderTest = new Ringer(mockPlayerFactory, mContext, mockSystemSettingsUtil,
     80                 mockRingtonePlayer, mockRingtoneFactory, mockVibrator, mockInCallController);
     81         when(mockPlayerFactory.createPlayer(anyInt())).thenReturn(mockTonePlayer);
     82         mockAudioManager =
     83                 (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
     84         when(mockAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
     85         NotificationManager notificationManager =
     86                 (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
     87         when(notificationManager.matchesCallFilter(any(Bundle.class))).thenReturn(true);
     88     }
     89 
     90     @SmallTest
     91     @Test
     92     public void testNoActionInTheaterMode() {
     93         // Start call waiting to make sure that it doesn't stop when we start ringing
     94         mRingerUnderTest.startCallWaiting(mockCall1);
     95         when(mockSystemSettingsUtil.isTheaterModeOn(any(Context.class))).thenReturn(true);
     96         assertFalse(mRingerUnderTest.startRinging(mockCall2, false));
     97         verify(mockTonePlayer, never()).stopTone();
     98         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
     99         verify(mockVibrator, never())
    100                 .vibrate(any(VibrationEffect.class), any(AudioAttributes.class));
    101     }
    102 
    103     @SmallTest
    104     @Test
    105     public void testNoActionWithExternalRinger() {
    106         Bundle externalRingerExtra = new Bundle();
    107         externalRingerExtra.putBoolean(TelecomManager.EXTRA_CALL_EXTERNAL_RINGER, true);
    108         when(mockCall1.getIntentExtras()).thenReturn(externalRingerExtra);
    109         when(mockCall2.getIntentExtras()).thenReturn(externalRingerExtra);
    110         // Start call waiting to make sure that it doesn't stop when we start ringing
    111         mRingerUnderTest.startCallWaiting(mockCall1);
    112         assertFalse(mRingerUnderTest.startRinging(mockCall2, false));
    113         verify(mockTonePlayer, never()).stopTone();
    114         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
    115         verify(mockVibrator, never())
    116                 .vibrate(any(VibrationEffect.class), any(AudioAttributes.class));
    117     }
    118 
    119     @SmallTest
    120     @Test
    121     public void testNoActionWhenDialerRings() {
    122         // Start call waiting to make sure that it doesn't stop when we start ringing
    123         mRingerUnderTest.startCallWaiting(mockCall1);
    124         when(mockInCallController.doesConnectedDialerSupportRinging()).thenReturn(true);
    125         assertFalse(mRingerUnderTest.startRinging(mockCall2, false));
    126         verify(mockTonePlayer, never()).stopTone();
    127         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
    128         verify(mockVibrator, never())
    129                 .vibrate(any(VibrationEffect.class), any(AudioAttributes.class));
    130     }
    131 
    132     @SmallTest
    133     @Test
    134     public void testAudioFocusStillAcquiredWhenDialerRings() {
    135         // Start call waiting to make sure that it doesn't stop when we start ringing
    136         mRingerUnderTest.startCallWaiting(mockCall1);
    137         when(mockInCallController.doesConnectedDialerSupportRinging()).thenReturn(true);
    138         ensureRingerIsAudible();
    139         assertTrue(mRingerUnderTest.startRinging(mockCall2, false));
    140         verify(mockTonePlayer, never()).stopTone();
    141         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
    142         verify(mockVibrator, never())
    143                 .vibrate(any(VibrationEffect.class), any(AudioAttributes.class));
    144     }
    145 
    146     @SmallTest
    147     @Test
    148     public void testNoActionWhenCallIsSelfManaged() {
    149         // Start call waiting to make sure that it doesn't stop when we start ringing
    150         mRingerUnderTest.startCallWaiting(mockCall1);
    151         when(mockCall2.isSelfManaged()).thenReturn(true);
    152         // We do want to acquire audio focus when self-managed
    153         assertTrue(mRingerUnderTest.startRinging(mockCall2, true));
    154         verify(mockTonePlayer, never()).stopTone();
    155         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
    156         verify(mockVibrator, never())
    157                 .vibrate(any(VibrationEffect.class), any(AudioAttributes.class));
    158     }
    159 
    160     @SmallTest
    161     @Test
    162     public void testCallWaitingButNoRingForSpecificContacts() {
    163         NotificationManager notificationManager =
    164                 (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    165         when(notificationManager.matchesCallFilter(any(Bundle.class))).thenReturn(false);
    166         // Start call waiting to make sure that it does stop when we start ringing
    167         mRingerUnderTest.startCallWaiting(mockCall1);
    168         verify(mockTonePlayer).startTone();
    169 
    170         assertFalse(mRingerUnderTest.startRinging(mockCall2, false));
    171         verify(mockTonePlayer).stopTone();
    172         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
    173         verify(mockVibrator, never())
    174                 .vibrate(any(VibrationEffect.class), any(AudioAttributes.class));
    175     }
    176 
    177     @SmallTest
    178     @Test
    179     public void testVibrateButNoRingForNullRingtone() {
    180         mRingerUnderTest.startCallWaiting(mockCall1);
    181         when(mockRingtoneFactory.getRingtone(any(Call.class))).thenReturn(null);
    182         when(mockAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
    183         enableVibrationWhenRinging();
    184         assertFalse(mRingerUnderTest.startRinging(mockCall2, false));
    185         verify(mockTonePlayer).stopTone();
    186         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
    187         verify(mockVibrator).vibrate(eq(mRingerUnderTest.mDefaultVibrationEffect),
    188                 any(AudioAttributes.class));
    189     }
    190 
    191     @SmallTest
    192     @Test
    193     public void testVibrateButNoRingForSilentRingtone() {
    194         mRingerUnderTest.startCallWaiting(mockCall1);
    195         Ringtone mockRingtone = mock(Ringtone.class);
    196         when(mockRingtoneFactory.getRingtone(any(Call.class))).thenReturn(mockRingtone);
    197         when(mockAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
    198         when(mockAudioManager.getStreamVolume(AudioManager.STREAM_RING)).thenReturn(0);
    199         enableVibrationWhenRinging();
    200         assertFalse(mRingerUnderTest.startRinging(mockCall2, false));
    201         verify(mockTonePlayer).stopTone();
    202         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
    203         verify(mockVibrator).vibrate(eq(mRingerUnderTest.mDefaultVibrationEffect),
    204                 any(AudioAttributes.class));
    205     }
    206 
    207     @SmallTest
    208     @Test
    209     public void testCustomVibrationForRingtone() {
    210         Resources resources = mContext.getResources();
    211         when(resources.getStringArray(com.android.internal.R.array.config_ringtoneEffectUris))
    212                 .thenReturn(new String[] { FAKE_RINGTONE_URI.toString() });
    213         mRingerUnderTest.startCallWaiting(mockCall1);
    214         Ringtone mockRingtone = mock(Ringtone.class);
    215         when(mockRingtoneFactory.getRingtone(any(Call.class))).thenReturn(mockRingtone);
    216         when(mockRingtone.getUri()).thenReturn(FAKE_RINGTONE_URI);
    217         enableVibrationWhenRinging();
    218         assertTrue(mRingerUnderTest.startRinging(mockCall2, false));
    219         verify(mockTonePlayer).stopTone();
    220         verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class));
    221         verify(mockVibrator).vibrate(eq(VibrationEffect.get(FAKE_RINGTONE_URI, mContext)),
    222                 any(AudioAttributes.class));
    223     }
    224 
    225     @SmallTest
    226     @Test
    227     public void testRingAndNoVibrate() {
    228         mRingerUnderTest.startCallWaiting(mockCall1);
    229         ensureRingerIsAudible();
    230         enableVibrationOnlyWhenNotRinging();
    231         assertTrue(mRingerUnderTest.startRinging(mockCall2, false));
    232         verify(mockTonePlayer).stopTone();
    233         verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class));
    234         verify(mockVibrator, never())
    235                 .vibrate(any(VibrationEffect.class), any(AudioAttributes.class));
    236     }
    237 
    238     @SmallTest
    239     @Test
    240     public void testSilentRingWithHfpStillAcquiresFocus1() {
    241         mRingerUnderTest.startCallWaiting(mockCall1);
    242         Ringtone mockRingtone = mock(Ringtone.class);
    243         when(mockRingtoneFactory.getRingtone(any(Call.class))).thenReturn(mockRingtone);
    244         when(mockAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
    245         when(mockAudioManager.getStreamVolume(AudioManager.STREAM_RING)).thenReturn(0);
    246         enableVibrationOnlyWhenNotRinging();
    247         assertTrue(mRingerUnderTest.startRinging(mockCall2, true));
    248         verify(mockTonePlayer).stopTone();
    249         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
    250         verify(mockVibrator, never())
    251                 .vibrate(any(VibrationEffect.class), any(AudioAttributes.class));
    252     }
    253 
    254     @SmallTest
    255     @Test
    256     public void testSilentRingWithHfpStillAcquiresFocus2() {
    257         mRingerUnderTest.startCallWaiting(mockCall1);
    258         when(mockRingtoneFactory.getRingtone(any(Call.class))).thenReturn(null);
    259         when(mockAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
    260         when(mockAudioManager.getStreamVolume(AudioManager.STREAM_RING)).thenReturn(0);
    261         enableVibrationOnlyWhenNotRinging();
    262         assertTrue(mRingerUnderTest.startRinging(mockCall2, true));
    263         verify(mockTonePlayer).stopTone();
    264         verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class));
    265         verify(mockVibrator, never())
    266                 .vibrate(any(VibrationEffect.class), any(AudioAttributes.class));
    267     }
    268 
    269     private void ensureRingerIsAudible() {
    270         Ringtone mockRingtone = mock(Ringtone.class);
    271         when(mockRingtoneFactory.getRingtone(any(Call.class))).thenReturn(mockRingtone);
    272         when(mockAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
    273         when(mockAudioManager.getStreamVolume(AudioManager.STREAM_RING)).thenReturn(100);
    274     }
    275 
    276     private void enableVibrationWhenRinging() {
    277         when(mockVibrator.hasVibrator()).thenReturn(true);
    278         when(mockSystemSettingsUtil.canVibrateWhenRinging(any(Context.class))).thenReturn(true);
    279     }
    280 
    281     private void enableVibrationOnlyWhenNotRinging() {
    282         when(mockVibrator.hasVibrator()).thenReturn(true);
    283         when(mockSystemSettingsUtil.canVibrateWhenRinging(any(Context.class))).thenReturn(false);
    284     }
    285 }
    286