• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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