blob: b6e744e3c422de3efdac3848908bf2c1d98f2d54 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.cts.verifier.audio;
import static android.media.AudioManager.ADJUST_LOWER;
import static android.media.AudioManager.ADJUST_RAISE;
import static android.media.AudioManager.ADJUST_SAME;
import static android.media.AudioManager.RINGER_MODE_NORMAL;
import static android.media.AudioManager.RINGER_MODE_SILENT;
import static android.media.AudioManager.RINGER_MODE_VIBRATE;
import static android.media.AudioManager.STREAM_MUSIC;
import static android.media.AudioManager.USE_DEFAULT_STREAM_TYPE;
import static android.media.AudioManager.VIBRATE_SETTING_OFF;
import static android.media.AudioManager.VIBRATE_SETTING_ON;
import static android.media.AudioManager.VIBRATE_SETTING_ONLY_SILENT;
import static android.media.AudioManager.VIBRATE_TYPE_NOTIFICATION;
import static android.media.AudioManager.VIBRATE_TYPE_RINGER;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Vibrator;
import android.provider.Settings;
import android.util.Log;
import android.view.SoundEffectConstants;
import android.view.View;
import android.view.ViewGroup;
import com.android.cts.verifier.R;
import com.android.cts.verifier.notifications.InteractiveVerifierActivity;
import java.util.ArrayList;
import java.util.List;
/**
* Contains tests that require {@link AudioManager#getRingerMode()} to be in a particular starting
* state. Only runs on {@link ActivityManager#isLowRamDevice()} devices that don't support
* {@link android.service.notification.ConditionProviderService}. Otherwise the tests live in
* AudioManagerTests in non-verifier cts.
*/
public class RingerModeActivity extends InteractiveVerifierActivity {
private static final String TAG = "RingerModeActivity";
private final static String PKG = "com.android.cts.verifier";
private final static long TIME_TO_PLAY = 2000;
private final static int MP3_TO_PLAY = R.raw.testmp3;
private final static int ASYNC_TIMING_TOLERANCE_MS = 50;
private AudioManager mAudioManager;
private boolean mHasVibrator;
private boolean mUseFixedVolume;
private boolean mIsTelevision;
private boolean mIsSingleVolume;
private boolean mSkipRingerTests;
@Override
protected int getTitleResource() {
return R.string.ringer_mode_tests;
}
@Override
protected int getInstructionsResource() {
return R.string.ringer_mode_info;
}
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
mHasVibrator = (vibrator != null) && vibrator.hasVibrator();
mUseFixedVolume = mContext.getResources().getBoolean(
Resources.getSystem().getIdentifier("config_useFixedVolume", "bool", "android"));
PackageManager packageManager = mContext.getPackageManager();
mIsTelevision = packageManager != null
&& (packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
|| packageManager.hasSystemFeature(PackageManager.FEATURE_TELEVISION));
mIsSingleVolume = mContext.getResources().getBoolean(
Resources.getSystem().getIdentifier("config_single_volume", "bool", "android"));
mSkipRingerTests = mUseFixedVolume || mIsTelevision || mIsSingleVolume;
}
// Test Setup
@Override
protected List<InteractiveTestCase> createTestItems() {
List<InteractiveTestCase> tests = new ArrayList<>();
if (supportsConditionProviders()) {
tests.add(new PassTest());
return tests;
}
tests.add(new SetModeAllTest());
tests.add(new SetModeAlarmsTest());
tests.add(new TestAccessRingerModeDndOn());
tests.add(new TestVibrateNotificationDndOn());
tests.add(new TestVibrateRingerDndOn());
tests.add(new TestSetRingerModePolicyAccessDndOn());
tests.add(new TestVolumeDndAffectedStreamDndOn());
tests.add(new TestAdjustVolumeInAlarmsOnlyMode());
tests.add(new SetModeAllTest());
tests.add(new TestAccessRingerMode());
tests.add(new TestVibrateNotification());
tests.add(new TestVibrateRinger());
tests.add(new TestSetRingerModePolicyAccess());
tests.add(new TestVolumeDndAffectedStream());
tests.add(new TestVolume());
tests.add(new TestMuteStreams());
tests.add(new EnableSoundEffects());
tests.add(new TestSoundEffects());
return tests;
}
private boolean supportsConditionProviders() {
ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
return !am.isLowRamDevice()
|| mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
}
private int getVolumeDelta(int volume) {
return 1;
}
private boolean hasAudioOutput() {
return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
}
private void testStreamMuting(int stream) {
mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
assertTrue("Muting stream " + stream + " failed.",
mAudioManager.isStreamMute(stream));
mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0);
assertFalse("Unmuting stream " + stream + " failed.",
mAudioManager.isStreamMute(stream));
mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_TOGGLE_MUTE, 0);
assertTrue("Toggling mute on stream " + stream + " failed.",
mAudioManager.isStreamMute(stream));
mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_TOGGLE_MUTE, 0);
assertFalse("Toggling mute on stream " + stream + " failed.",
mAudioManager.isStreamMute(stream));
mAudioManager.setStreamMute(stream, true);
assertTrue("Muting stream " + stream + " using setStreamMute failed",
mAudioManager.isStreamMute(stream));
// mute it three more times to verify the ref counting is gone.
mAudioManager.setStreamMute(stream, true);
mAudioManager.setStreamMute(stream, true);
mAudioManager.setStreamMute(stream, true);
mAudioManager.setStreamMute(stream, false);
assertFalse("Unmuting stream " + stream + " using setStreamMute failed.",
mAudioManager.isStreamMute(stream));
}
// Tests
protected class PassTest extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createRetryItem(parent, R.string.ringer_mode_pass_test);
}
@Override
protected void test() {
status = PASS;
}
}
protected class SetModeAllTest extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createRetryItem(parent, R.string.attention_filter_all);
}
@Override
protected void test() {
if (mUserVerified) {
status = PASS;
} else {
status = WAIT_FOR_USER;
}
}
@Override
protected void tearDown() {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
delay();
}
}
protected class SetModeAlarmsTest extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createRetryItem(parent, R.string.attention_filter_alarms);
}
@Override
protected void test() {
if (mUserVerified) {
status = PASS;
} else {
status = WAIT_FOR_USER;
}
}
@Override
protected void tearDown() {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
delay();
}
}
protected class EnableSoundEffects extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createRetryItem(parent, R.string.enable_sound_effects);
}
@Override
protected void test() {
if (mUserVerified) {
status = PASS;
} else {
status = WAIT_FOR_USER;
}
}
@Override
protected void tearDown() {
delay();
}
}
protected class TestSoundEffects extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_sound_effects);
}
@Override
protected void test() {
// should hear sound after loadSoundEffects() called.
mAudioManager.loadSoundEffects();
try {
Thread.sleep(TIME_TO_PLAY);
} catch (InterruptedException e) {
e.printStackTrace();
}
float volume = 13;
mAudioManager.playSoundEffect(SoundEffectConstants.CLICK);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP, volume);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN, volume);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT, volume);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT, volume);
// won't hear sound after unloadSoundEffects() called();
mAudioManager.unloadSoundEffects();
mAudioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP, volume);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN, volume);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT, volume);
mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT, volume);
status = PASS;
}
}
protected class TestVibrateNotificationDndOn extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_vibrate_notification);
}
@Override
protected void test() {
if (mUseFixedVolume || !mHasVibrator) {
status = PASS;
return;
}
// VIBRATE_SETTING_ON
mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ON);
if (VIBRATE_SETTING_ON != mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
// VIBRATE_SETTING_OFF
mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_OFF);
if (VIBRATE_SETTING_OFF != mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
// VIBRATE_SETTING_ONLY_SILENT
mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ONLY_SILENT);
if (VIBRATE_SETTING_ONLY_SILENT
!= mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
status = PASS;
}
}
protected class TestVibrateNotification extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_vibrate_notification);
}
@Override
protected void test() {
if (mUseFixedVolume || !mHasVibrator) {
status = PASS;
return;
}
// VIBRATE_SETTING_ON
mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ON);
if (VIBRATE_SETTING_ON != mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
if (!mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
if (RINGER_MODE_VIBRATE != mAudioManager.getRingerMode()) {
setFailed();
return;
}
if (!mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
// VIBRATE_SETTING_OFF
mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_OFF);
if (VIBRATE_SETTING_OFF != mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
if (RINGER_MODE_VIBRATE != mAudioManager.getRingerMode()) {
setFailed();
return;
}
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
// VIBRATE_SETTING_ONLY_SILENT
mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ONLY_SILENT);
if (VIBRATE_SETTING_ONLY_SILENT
!= mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
if (RINGER_MODE_VIBRATE != mAudioManager.getRingerMode()) {
setFailed();
return;
}
if (!mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
// VIBRATE_TYPE_NOTIFICATION
mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ON);
if(VIBRATE_SETTING_ON != mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_OFF);
if(VIBRATE_SETTING_OFF != mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ONLY_SILENT);
if (VIBRATE_SETTING_ONLY_SILENT
!= mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION)) {
setFailed();
return;
}
status = PASS;
}
}
protected class TestVibrateRingerDndOn extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_vibrate_ringer);
}
@Override
protected void test() {
if (mUseFixedVolume || !mHasVibrator) {
status = PASS;
return;
}
// VIBRATE_SETTING_ON
mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ON);
if (VIBRATE_SETTING_ON != mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
// VIBRATE_SETTING_OFF
mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_OFF);
if (VIBRATE_SETTING_OFF != mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
// VIBRATE_SETTING_ONLY_SILENT
mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ONLY_SILENT);
if (VIBRATE_SETTING_ONLY_SILENT
!= mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
status = PASS;
}
}
protected class TestVibrateRinger extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_vibrate_ringer);
}
@Override
protected void test() {
if (mUseFixedVolume || !mHasVibrator) {
status = PASS;
return;
}
// VIBRATE_SETTING_ON
mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ON);
if (VIBRATE_SETTING_ON != mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
if (!mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
if (RINGER_MODE_VIBRATE != mAudioManager.getRingerMode()) {
setFailed();
return;
}
if (!mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
// VIBRATE_SETTING_OFF
mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_OFF);
if (VIBRATE_SETTING_OFF != mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
if (RINGER_MODE_VIBRATE != mAudioManager.getRingerMode()) {
setFailed();
return;
}
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
// VIBRATE_SETTING_ONLY_SILENT
mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ONLY_SILENT);
if (VIBRATE_SETTING_ONLY_SILENT
!= mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
if (mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
if (RINGER_MODE_VIBRATE != mAudioManager.getRingerMode()) {
setFailed();
return;
}
if (!mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
// VIBRATE_TYPE_NOTIFICATION
mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ON);
if (VIBRATE_SETTING_ON != mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_OFF);
if (VIBRATE_SETTING_OFF != mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ONLY_SILENT);
if (VIBRATE_SETTING_ONLY_SILENT
!= mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER)) {
setFailed();
return;
}
status = PASS;
}
}
protected class TestAccessRingerMode extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_access_ringer_mode);
}
@Override
protected void test() {
if (mSkipRingerTests) {
status = PASS;
return;
}
mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
if (RINGER_MODE_NORMAL != mAudioManager.getRingerMode()) {
setFailed();
return;
}
mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
if (mHasVibrator) {
if (RINGER_MODE_VIBRATE != mAudioManager.getRingerMode()) {
setFailed();
return;
}
} else {
if (RINGER_MODE_NORMAL != mAudioManager.getRingerMode()) {
setFailed();
return;
}
}
status = PASS;
}
@Override
protected void tearDown() {
mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
next();
}
}
protected class TestAccessRingerModeDndOn extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_access_ringer_mode);
}
@Override
protected void test() {
if (mSkipRingerTests) {
status = PASS;
return;
}
if (RINGER_MODE_SILENT != mAudioManager.getRingerMode()) {
setFailed();
return;
}
status = PASS;
}
}
protected class TestSetRingerModePolicyAccessDndOn extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_ringer_mode_policy_access);
}
@Override
protected void test() {
if (mSkipRingerTests) {
status = PASS;
return;
}
// This tests a subset of testSetRingerModePolicyAccess as cts verifier cannot
// get policy access on these devices.
try {
mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
status = FAIL;
logFail("Apps without notification policy access cannot change ringer mode");
} catch (SecurityException e) {
}
try {
mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
status = FAIL;
logFail("Apps without notification policy access cannot change ringer mode");
} catch (SecurityException e) {
}
status = PASS;
}
}
protected class TestSetRingerModePolicyAccess extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_ringer_mode_policy_access);
}
@Override
protected void test() {
if (mSkipRingerTests) {
status = PASS;
return;
}
// This tests a subset of testSetRingerModePolicyAccess as cts verifier cannot
// get policy access on these devices.
try {
mAudioManager.setRingerMode(RINGER_MODE_SILENT);
status = FAIL;
logFail("Apps without notification policy access cannot change ringer mode");
} catch (SecurityException e) {
}
if (mHasVibrator) {
mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
try {
mAudioManager.setRingerMode(RINGER_MODE_SILENT);
status = FAIL;
logFail("Apps without notification policy access cannot change ringer mode");
} catch (SecurityException e) {
}
}
status = PASS;
}
}
protected class TestVolumeDndAffectedStream extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_volume_dnd_affected_stream);
}
@Override
protected void test() {
if (mSkipRingerTests || mHasVibrator) {
status = PASS;
return;
}
mAudioManager.setStreamVolume(
AudioManager.STREAM_SYSTEM, 7, AudioManager.FLAG_ALLOW_RINGER_MODES);
// 7 to 0, fail.
try {
mAudioManager.setStreamVolume(
AudioManager.STREAM_SYSTEM, 0, AudioManager.FLAG_ALLOW_RINGER_MODES);
status = FAIL;
logFail("Apps without notification policy access cannot change ringer mode");
return;
} catch (SecurityException e) {}
// 7 to 1: success
mAudioManager.setStreamVolume(
AudioManager.STREAM_SYSTEM, 1, AudioManager.FLAG_ALLOW_RINGER_MODES);
if (1 != mAudioManager.getStreamVolume(AudioManager.STREAM_SYSTEM)) {
setFailed();
return;
}
status = PASS;
}
}
protected class TestVolumeDndAffectedStreamDndOn extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_volume_dnd_affected_stream);
}
@Override
protected void test() {
if (mSkipRingerTests || mHasVibrator) {
status = PASS;
return;
}
mAudioManager.setStreamVolume(
AudioManager.STREAM_SYSTEM, 0, AudioManager.FLAG_ALLOW_RINGER_MODES);
try {
mAudioManager.setStreamVolume(
AudioManager.STREAM_SYSTEM, 6, AudioManager.FLAG_ALLOW_RINGER_MODES);
status = FAIL;
logFail("Apps without notification policy access cannot change ringer mode");
return;
} catch (SecurityException e) {}
status = PASS;
}
}
protected class TestVolume extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_volume_dnd_affected_stream);
}
@Override
protected void test() {
int volume, volumeDelta;
int[] streams = {STREAM_MUSIC,
AudioManager.STREAM_VOICE_CALL,
AudioManager.STREAM_ALARM,
AudioManager.STREAM_RING};
mAudioManager.adjustVolume(ADJUST_RAISE, 0);
// adjusting volume is aynchronous, wait before other volume checks
try {
Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
} catch (InterruptedException e) {
e.printStackTrace();
}
mAudioManager.adjustSuggestedStreamVolume(
ADJUST_LOWER, USE_DEFAULT_STREAM_TYPE, 0);
try {
Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
} catch (InterruptedException e) {
e.printStackTrace();
}
int maxMusicVolume = mAudioManager.getStreamMaxVolume(STREAM_MUSIC);
for (int stream : streams) {
Log.d(TAG, "testing stream: " + stream);
mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
int maxVolume = mAudioManager.getStreamMaxVolume(stream);
int minVolume = 1; // mAudioManager.getStreamMinVolume(stream); is @hide
// validate min
assertTrue(String.format("minVolume(%d) must be >= 0", minVolume), minVolume >= 0);
assertTrue(String.format("minVolume(%d) must be < maxVolume(%d)", minVolume,
maxVolume),
minVolume < maxVolume);
mAudioManager.setStreamVolume(stream, 1, 0);
if (mUseFixedVolume) {
assertEquals(maxVolume, mAudioManager.getStreamVolume(stream));
return;
}
assertEquals(String.format("stream=%d", stream),
1, mAudioManager.getStreamVolume(stream));
if (stream == STREAM_MUSIC && mAudioManager.isWiredHeadsetOn()) {
// due to new regulations, music sent over a wired headset may be volume limited
// until the user explicitly increases the limit, so we can't rely on being able
// to set the volume to getStreamMaxVolume(). Instead, determine the current limit
// by increasing the volume until it won't go any higher, then use that volume as
// the maximum for the purposes of this test
int curvol = 0;
int prevvol = 0;
do {
prevvol = curvol;
mAudioManager.adjustStreamVolume(stream, ADJUST_RAISE, 0);
curvol = mAudioManager.getStreamVolume(stream);
} while (curvol != prevvol);
maxVolume = maxMusicVolume = curvol;
}
mAudioManager.setStreamVolume(stream, maxVolume, 0);
mAudioManager.adjustStreamVolume(stream, ADJUST_RAISE, 0);
assertEquals(maxVolume, mAudioManager.getStreamVolume(stream));
volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(stream));
mAudioManager.adjustSuggestedStreamVolume(ADJUST_LOWER, stream, 0);
try {
Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
} catch (InterruptedException e) {
e.printStackTrace();
}
assertEquals(maxVolume - volumeDelta, mAudioManager.getStreamVolume(stream));
// volume lower
mAudioManager.setStreamVolume(stream, maxVolume, 0);
volume = mAudioManager.getStreamVolume(stream);
while (volume > minVolume) {
volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(stream));
mAudioManager.adjustStreamVolume(stream, ADJUST_LOWER, 0);
assertEquals(Math.max(0, volume - volumeDelta),
mAudioManager.getStreamVolume(stream));
volume = mAudioManager.getStreamVolume(stream);
}
mAudioManager.adjustStreamVolume(stream, ADJUST_SAME, 0);
// volume raise
mAudioManager.setStreamVolume(stream, 1, 0);
volume = mAudioManager.getStreamVolume(stream);
while (volume < maxVolume) {
volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(stream));
mAudioManager.adjustStreamVolume(stream, ADJUST_RAISE, 0);
assertEquals(Math.min(volume + volumeDelta, maxVolume),
mAudioManager.getStreamVolume(stream));
volume = mAudioManager.getStreamVolume(stream);
}
// volume same
mAudioManager.setStreamVolume(stream, maxVolume, 0);
for (int k = 0; k < maxVolume; k++) {
mAudioManager.adjustStreamVolume(stream, ADJUST_SAME, 0);
assertEquals(maxVolume, mAudioManager.getStreamVolume(stream));
}
mAudioManager.setStreamVolume(stream, maxVolume, 0);
}
if (mUseFixedVolume) {
return;
}
// adjust volume
mAudioManager.adjustVolume(ADJUST_RAISE, 0);
try {
Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean isMusicPlayingBeforeTest = false;
if (mAudioManager.isMusicActive()) {
isMusicPlayingBeforeTest = true;
}
MediaPlayer mp = MediaPlayer.create(mContext, MP3_TO_PLAY);
assertNotNull(mp);
mp.setAudioStreamType(STREAM_MUSIC);
mp.setLooping(true);
mp.start();
try {
Thread.sleep(TIME_TO_PLAY);
} catch (InterruptedException e) {
e.printStackTrace();
}
assertTrue(mAudioManager.isMusicActive());
// adjust volume as ADJUST_SAME
for (int k = 0; k < maxMusicVolume; k++) {
mAudioManager.adjustVolume(ADJUST_SAME, 0);
try {
Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
} catch (InterruptedException e) {
e.printStackTrace();
}
assertEquals(maxMusicVolume, mAudioManager.getStreamVolume(STREAM_MUSIC));
}
// adjust volume as ADJUST_RAISE
mAudioManager.setStreamVolume(STREAM_MUSIC, 0, 0);
volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(STREAM_MUSIC));
mAudioManager.adjustVolume(ADJUST_RAISE, 0);
try {
Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
} catch (InterruptedException e) {
e.printStackTrace();
}
assertEquals(Math.min(volumeDelta, maxMusicVolume),
mAudioManager.getStreamVolume(STREAM_MUSIC));
// adjust volume as ADJUST_LOWER
mAudioManager.setStreamVolume(STREAM_MUSIC, maxMusicVolume, 0);
maxMusicVolume = mAudioManager.getStreamVolume(STREAM_MUSIC);
volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(STREAM_MUSIC));
mAudioManager.adjustVolume(ADJUST_LOWER, 0);
try {
Thread.sleep(ASYNC_TIMING_TOLERANCE_MS);
} catch (InterruptedException e) {
e.printStackTrace();
}
assertEquals(Math.max(0, maxMusicVolume - volumeDelta),
mAudioManager.getStreamVolume(STREAM_MUSIC));
mp.stop();
mp.release();
try {
Thread.sleep(TIME_TO_PLAY);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!isMusicPlayingBeforeTest) {
assertFalse(mAudioManager.isMusicActive());
}
status = PASS;
}
}
protected class TestMuteDndAffectedStreamsDndOn extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_mute_dnd_affected_streams);
}
@Override
protected void test() {
if (mSkipRingerTests) {
return;
}
int[] streams = { AudioManager.STREAM_RING };
// Verify streams cannot be unmuted without policy access.
for (int stream : streams) {
try {
mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0);
assertEquals("Apps without Notification policy access can't change ringer mode",
RINGER_MODE_SILENT, mAudioManager.getRingerMode());
} catch (SecurityException e) {
}
try {
mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_TOGGLE_MUTE,
0);
assertEquals("Apps without Notification policy access can't change ringer mode",
RINGER_MODE_SILENT, mAudioManager.getRingerMode());
} catch (SecurityException e) {
}
try {
mAudioManager.setStreamMute(stream, false);
assertEquals("Apps without Notification policy access can't change ringer mode",
RINGER_MODE_SILENT, mAudioManager.getRingerMode());
} catch (SecurityException e) {
}
}
status = PASS;
}
}
protected class TestMuteStreams extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_mute_dnd_affected_streams);
}
@Override
protected void test() {
if (mSkipRingerTests) {
return;
}
int[] streams = { AudioManager.STREAM_RING };
for (int stream : streams) {
// ensure each stream is on and turned up.
mAudioManager.setStreamVolume(stream, mAudioManager.getStreamMaxVolume(stream),0);
try {
mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
assertEquals("Apps without Notification policy access can't change ringer mode",
RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
} catch (SecurityException e) {
}
try {
mAudioManager.adjustStreamVolume(
stream, AudioManager.ADJUST_TOGGLE_MUTE, 0);
assertEquals("Apps without Notification policy access can't change ringer mode",
RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
} catch (SecurityException e) {
}
try {
mAudioManager.setStreamMute(stream, true);
assertEquals("Apps without Notification policy access can't change ringer mode",
RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
} catch (SecurityException e) {
}
testStreamMuting(stream);
}
streams = new int[] {
AudioManager.STREAM_VOICE_CALL,
AudioManager.STREAM_MUSIC,
AudioManager.STREAM_ALARM
};
int muteAffectedStreams = Settings.System.getInt(mContext.getContentResolver(),
Settings.System.MUTE_STREAMS_AFFECTED,
// Same defaults as in AudioService. Should be kept in
// sync.
((1 << AudioManager.STREAM_MUSIC) |
(1 << AudioManager.STREAM_RING) |
(1 << AudioManager.STREAM_NOTIFICATION) |
(1 << AudioManager.STREAM_SYSTEM)));
for (int stream : streams) {
// ensure each stream is on and turned up.
mAudioManager.setStreamVolume(stream,
mAudioManager.getStreamMaxVolume(stream),
0);
if (((1 << stream) & muteAffectedStreams) == 0) {
mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
assertFalse("Stream " + stream + " should not be affected by mute.",
mAudioManager.isStreamMute(stream));
mAudioManager.setStreamMute(stream, true);
assertFalse("Stream " + stream + " should not be affected by mute.",
mAudioManager.isStreamMute(stream));
mAudioManager.adjustStreamVolume(stream, AudioManager.ADJUST_TOGGLE_MUTE,
0);
assertFalse("Stream " + stream + " should not be affected by mute.",
mAudioManager.isStreamMute(stream));
continue;
}
testStreamMuting(stream);
}
status = PASS;
}
}
protected class TestAdjustVolumeInAlarmsOnlyMode extends InteractiveTestCase {
@Override
protected View inflate(ViewGroup parent) {
return createAutoItem(parent, R.string.test_volume_dnd_affected_stream);
}
@Override
protected void test() {
if (mSkipRingerTests) {
return;
}
int musicVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mAudioManager.adjustStreamVolume(
AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
int volumeDelta =
getVolumeDelta(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
assertEquals(musicVolume + volumeDelta,
mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 3, 0);
assertEquals(3, mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
status = PASS;
}
}
}