/* * Copyright (C) 2007 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.frameworktest.settings; import com.android.frameworktest.settings.RingtonePickerActivityLauncher; import android.app.Instrumentation; import android.database.Cursor; import android.media.RingtoneManager; import android.net.Uri; import android.provider.MediaStore; import android.test.ActivityInstrumentationTestCase; import android.test.suitebuilder.annotation.Suppress; import android.view.KeyEvent; /** * Tests the RingtonePickerActivity. * <p> * There is a launcher for launching the RingtonePickerActivity (RPA) since the RPA needs * to be a subactivity. We don't have a reference to the actual RPA. * <p> * This relies heavily on keypresses getting to the right widget. It depends on: * <li> Less than NUM_RINGTONES_AND_SOME ringtones on the system * <li> Pressing arrow-down a ton will eventually end up on the 'Cancel' button * <li> From the 'Cancel' button, pressing arrow-left will end up on 'OK' button */ @Suppress public class RingtonePickerActivityTest extends ActivityInstrumentationTestCase<RingtonePickerActivityLauncher> { private static final int NUM_RINGTONES_AND_SOME = 20; private RingtonePickerActivityLauncher mActivity; private Instrumentation mInstrumentation; public RingtonePickerActivityTest() { super("com.android.frameworktest", RingtonePickerActivityLauncher.class); } @Override protected void setUp() throws Exception { super.setUp(); mActivity = getActivity(); mInstrumentation = getInstrumentation(); assertNotNull(mActivity); assertFalse(mActivity.resultReceived); assertNotNull(mInstrumentation); } public void testDefault() { mActivity.launchRingtonePickerActivity(true, null, RingtoneManager.TYPE_ALL); mInstrumentation.waitForIdleSync(); // Go to top goTo(true); // Select default ringtone sendKeys(KeyEvent.KEYCODE_DPAD_CENTER); // Go to bottom/cancel button goTo(false); // Select OK button sendKeys(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_CENTER); mInstrumentation.waitForIdleSync(); assertTrue(mActivity.resultReceived); assertNotNull(mActivity.result); assertTrue(RingtoneManager.isDefault(mActivity.pickedUri)); } public void testFirst() { mActivity.launchRingtonePickerActivity(true, null, RingtoneManager.TYPE_ALL); mInstrumentation.waitForIdleSync(); // Go to top goTo(true); // Select first (non-default) ringtone sendKeys(KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_CENTER); // Go to bottom/cancel button goTo(false); // Select OK button sendKeys(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_CENTER); mInstrumentation.waitForIdleSync(); assertTrue(mActivity.resultReceived); assertNotNull(mActivity.result); assertNotNull(mActivity.pickedUri); assertFalse(RingtoneManager.isDefault(mActivity.pickedUri)); } public void testExisting() { // We need to get an existing ringtone first, so launch it, pick first, // and keep that URI testFirst(); Uri firstUri = mActivity.pickedUri; mActivity.launchRingtonePickerActivity(true, firstUri, RingtoneManager.TYPE_ALL); mInstrumentation.waitForIdleSync(); //// Hit cancel: // Go to bottom goTo(false); // Select Cancel button sendKeys(KeyEvent.KEYCODE_DPAD_CENTER); mInstrumentation.waitForIdleSync(); assertTrue(mActivity.resultReceived); assertEquals(mActivity.pickedUri, firstUri); } public void testExistingButDifferent() { // We need to get an existing ringtone first, so launch it, pick first, // and keep that URI testFirst(); Uri firstUri = mActivity.pickedUri; mActivity.launchRingtonePickerActivity(true, firstUri, RingtoneManager.TYPE_ALL); mInstrumentation.waitForIdleSync(); //// Pick second: // Go to top goTo(true); // Select second (non-default) ringtone sendKeys(KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_CENTER); // Go to bottom/cancel button goTo(false); // Select OK button sendKeys(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_CENTER); mInstrumentation.waitForIdleSync(); assertTrue(mActivity.resultReceived); assertNotNull(mActivity.result); assertTrue(!firstUri.equals(mActivity.pickedUri)); } public void testCancel() { mActivity.launchRingtonePickerActivity(true, null, RingtoneManager.TYPE_ALL); mInstrumentation.waitForIdleSync(); // Go to bottom goTo(false); // Select Cancel button sendKeys(KeyEvent.KEYCODE_DPAD_CENTER); mInstrumentation.waitForIdleSync(); assertTrue(mActivity.resultReceived); assertNull(mActivity.result); } public void testNoDefault() { mActivity.launchRingtonePickerActivity(false, null, RingtoneManager.TYPE_ALL); mInstrumentation.waitForIdleSync(); // Go to top goTo(true); // Select first (non-default) ringtone sendKeys(KeyEvent.KEYCODE_DPAD_CENTER); // Go to bottom/cancel button goTo(false); // Select OK button sendKeys(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_CENTER); mInstrumentation.waitForIdleSync(); assertTrue(mActivity.resultReceived); assertNotNull(mActivity.result); assertNotNull(mActivity.pickedUri); assertFalse(RingtoneManager.isDefault(mActivity.pickedUri)); } public void testNotifications() { mActivity.launchRingtonePickerActivity(false, null, RingtoneManager.TYPE_NOTIFICATION); mInstrumentation.waitForIdleSync(); // Move to top of list goTo(true); // Select first ringtone in list sendKeys(KeyEvent.KEYCODE_DPAD_CENTER); // Move all the way down (will focus 'Cancel') goTo(false); // Move left and click (will click 'Ok') sendKeys(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_CENTER); // Wait until main thread is idle mInstrumentation.waitForIdleSync(); assertTrue(mActivity.resultReceived); assertNotNull(mActivity.result); assertNotNull(mActivity.pickedUri); // Get the path of the picked ringtone Uri uri = mActivity.pickedUri; Cursor c = mActivity.getContentResolver().query(uri, new String[] { "_data" }, null, null, null); assertTrue("Query for selected ringtone URI does not have a result", c.moveToFirst()); String path = c.getString(0); // Quick check to see if the ringtone is a notification assertTrue("The path of the selected ringtone did not contain \"notification\"", path.contains("notifications")); } private void goTo(boolean top) { // Get to the buttons at the bottom (top == false), or the top (top == true) for (int i = 0; i < NUM_RINGTONES_AND_SOME; i++) { sendKeys(top ? KeyEvent.KEYCODE_DPAD_UP : KeyEvent.KEYCODE_DPAD_DOWN); } } }