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 package android.media.cts; 17 18 import android.app.ActivityManager; 19 import android.media.cts.R; 20 21 22 import android.app.Activity; 23 import android.app.Instrumentation; 24 import android.content.Context; 25 import android.content.pm.PackageManager; 26 import android.database.Cursor; 27 import android.media.AudioManager; 28 import android.media.Ringtone; 29 import android.media.RingtoneManager; 30 import android.net.Uri; 31 import android.platform.test.annotations.AppModeFull; 32 import android.provider.Settings; 33 import android.test.ActivityInstrumentationTestCase2; 34 import android.util.Log; 35 36 @AppModeFull(reason = "TODO: evaluate and port to instant") 37 public class RingtoneManagerTest 38 extends ActivityInstrumentationTestCase2<RingtonePickerActivity> { 39 40 private static final String PKG = "android.media.cts"; 41 private static final String TAG = "RingtoneManagerTest"; 42 43 private RingtonePickerActivity mActivity; 44 private Instrumentation mInstrumentation; 45 private Context mContext; 46 private RingtoneManager mRingtoneManager; 47 private AudioManager mAudioManager; 48 private int mOriginalVolume; 49 private Uri mDefaultUri; 50 RingtoneManagerTest()51 public RingtoneManagerTest() { 52 super(PKG, RingtonePickerActivity.class); 53 } 54 55 @Override setUp()56 protected void setUp() throws Exception { 57 super.setUp(); 58 mActivity = getActivity(); 59 mInstrumentation = getInstrumentation(); 60 mContext = mInstrumentation.getContext(); 61 Utils.enableAppOps(mContext.getPackageName(), "android:write_settings", mInstrumentation); 62 mRingtoneManager = new RingtoneManager(mActivity); 63 mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 64 // backup ringer settings 65 mOriginalVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_RING); 66 mDefaultUri = RingtoneManager.getActualDefaultRingtoneUri(mContext, 67 RingtoneManager.TYPE_RINGTONE); 68 69 if (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT 70 && !ActivityManager.isLowRamDeviceStatic()) { 71 try { 72 Utils.toggleNotificationPolicyAccess( 73 mContext.getPackageName(), getInstrumentation(), true); 74 mAudioManager.adjustStreamVolume(AudioManager.STREAM_RING, 75 AudioManager.ADJUST_RAISE, 76 AudioManager.FLAG_ALLOW_RINGER_MODES); 77 } finally { 78 Utils.toggleNotificationPolicyAccess( 79 mContext.getPackageName(), getInstrumentation(), false); 80 } 81 } 82 } 83 84 @Override tearDown()85 protected void tearDown() throws Exception { 86 if (!ActivityManager.isLowRamDeviceStatic()) { 87 try { 88 Utils.toggleNotificationPolicyAccess( 89 mContext.getPackageName(), getInstrumentation(), true); 90 // restore original ringer settings 91 if (mAudioManager != null) { 92 mAudioManager.setStreamVolume(AudioManager.STREAM_RING, mOriginalVolume, 93 AudioManager.FLAG_ALLOW_RINGER_MODES); 94 } 95 } finally { 96 Utils.toggleNotificationPolicyAccess( 97 mContext.getPackageName(), getInstrumentation(), false); 98 } 99 } 100 RingtoneManager.setActualDefaultRingtoneUri(mContext, RingtoneManager.TYPE_RINGTONE, 101 mDefaultUri); 102 Utils.disableAppOps(mContext.getPackageName(), "android:write_settings", mInstrumentation); 103 super.tearDown(); 104 } 105 hasAudioOutput()106 private boolean hasAudioOutput() { 107 return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT); 108 } 109 isTV()110 private boolean isTV() { 111 return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK_ONLY); 112 } 113 testConstructors()114 public void testConstructors() { 115 new RingtoneManager(mActivity); 116 new RingtoneManager(mContext); 117 } 118 testAccessMethods()119 public void testAccessMethods() { 120 if (isTV()) { 121 return; 122 } 123 if (!hasAudioOutput()) { 124 Log.i(TAG, "Skipping testAccessMethods(): device doesn't have audio output."); 125 return; 126 } 127 128 Cursor c = mRingtoneManager.getCursor(); 129 assertTrue("Must have at least one ring tone available", c.getCount() > 0); 130 131 assertNotNull(mRingtoneManager.getRingtone(0)); 132 assertNotNull(RingtoneManager.getRingtone(mContext, Settings.System.DEFAULT_RINGTONE_URI)); 133 int expectedPosition = 0; 134 Uri uri = mRingtoneManager.getRingtoneUri(expectedPosition); 135 assertEquals(expectedPosition, mRingtoneManager.getRingtonePosition(uri)); 136 assertNotNull(RingtoneManager.getValidRingtoneUri(mContext)); 137 138 RingtoneManager.setActualDefaultRingtoneUri(mContext, RingtoneManager.TYPE_RINGTONE, uri); 139 assertEquals(uri, RingtoneManager.getActualDefaultRingtoneUri(mContext, 140 RingtoneManager.TYPE_RINGTONE)); 141 142 assertEquals(Settings.System.DEFAULT_RINGTONE_URI, 143 RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)); 144 assertEquals(Settings.System.DEFAULT_NOTIFICATION_URI, 145 RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); 146 assertEquals(RingtoneManager.TYPE_RINGTONE, 147 RingtoneManager.getDefaultType(Settings.System.DEFAULT_RINGTONE_URI)); 148 assertEquals(RingtoneManager.TYPE_NOTIFICATION, 149 RingtoneManager.getDefaultType(Settings.System.DEFAULT_NOTIFICATION_URI)); 150 assertTrue(RingtoneManager.isDefault(Settings.System.DEFAULT_RINGTONE_URI)); 151 } 152 testSetType()153 public void testSetType() { 154 mRingtoneManager.setType(RingtoneManager.TYPE_ALARM); 155 assertEquals(AudioManager.STREAM_ALARM, mRingtoneManager.inferStreamType()); 156 Cursor c = mRingtoneManager.getCursor(); 157 assertTrue("Must have at least one alarm tone available", c.getCount() > 0); 158 Ringtone r = mRingtoneManager.getRingtone(0); 159 assertEquals(RingtoneManager.TYPE_ALARM, r.getStreamType()); 160 } 161 testStopPreviousRingtone()162 public void testStopPreviousRingtone() { 163 if (isTV()) { 164 return; 165 } 166 if (!hasAudioOutput()) { 167 Log.i(TAG, "Skipping testStopPreviousRingtone(): device doesn't have audio output."); 168 return; 169 } 170 171 Cursor c = mRingtoneManager.getCursor(); 172 assertTrue("Must have at least one ring tone available", c.getCount() > 0); 173 174 mRingtoneManager.setStopPreviousRingtone(true); 175 assertTrue(mRingtoneManager.getStopPreviousRingtone()); 176 Uri uri = Uri.parse("android.resource://" + PKG + "/" + R.raw.john_cage); 177 Ringtone ringtone = RingtoneManager.getRingtone(mContext, uri); 178 ringtone.play(); 179 assertTrue(ringtone.isPlaying()); 180 ringtone.stop(); 181 assertFalse(ringtone.isPlaying()); 182 Ringtone newRingtone = mRingtoneManager.getRingtone(0); 183 assertFalse(ringtone.isPlaying()); 184 newRingtone.play(); 185 assertTrue(newRingtone.isPlaying()); 186 mRingtoneManager.stopPreviousRingtone(); 187 assertFalse(newRingtone.isPlaying()); 188 } 189 } 190