diff --git a/CleanSpec.mk b/CleanSpec.mk
index 417f764..707404b 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -50,6 +50,8 @@
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/com/android/internal/backup)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/app)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/content)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/FrameworkTest_intermediates/)
+
 
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
diff --git a/tests/FrameworkTest/Android.mk b/tests/FrameworkTest/Android.mk
deleted file mode 100644
index 61cdbfa..0000000
--- a/tests/FrameworkTest/Android.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-# Only compile source java files in this apk.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-LOCAL_PACKAGE_NAME := FrameworkTest
-
-include $(BUILD_PACKAGE)
-# Use the following include to make our test apk.
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/FrameworkTest/AndroidManifest.xml b/tests/FrameworkTest/AndroidManifest.xml
deleted file mode 100644
index 4db8952..0000000
--- a/tests/FrameworkTest/AndroidManifest.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.frameworktest">
-
-    <uses-permission android:name="android.permission.READ_CONTACTS" />
-    <uses-permission android:name="android.permission.HARDWARE_TEST" />
-    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
-    <uses-permission android:name="android.permission.ACCESSIBILITY_EVENT_VIEW_TYPES" />
-    <uses-permission android:name="android.permission.ACCESSIBILITY_EVENT_TRANSITION_TYPES" />
-    <uses-permission android:name="android.permission.ACCESSIBILITY_EVENT_NOTIFICATION_TYPES" />
-
-    <application android:theme="@style/Theme">
-        <uses-library android:name="android.test.runner" />
-
-        <activity android:name=".FrameworkTestApplication" android:label="FrameworkTestApplication">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-
-        <activity android:name=".performance.InvalidateCycle" android:label="InvalidateCycle">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>
-        </activity>
-
-        <activity android:name=".settings.RingtonePickerActivityLauncher" android:label="RingtonePickerActivityLauncher">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>
-        </activity>
-        
-
-    </application>
-
-</manifest>
diff --git a/tests/FrameworkTest/README b/tests/FrameworkTest/README
deleted file mode 100644
index d6d0042..0000000
--- a/tests/FrameworkTest/README
+++ /dev/null
@@ -1,8 +0,0 @@
-FrameworkTestApplication should hold snippets of functionality that are
-helpful for testing the UI framework code, but not appropriate for
-sample code.  For instance, a layout contrived to exercise an edge case
-of scrolling behavior.
-
-InstrumentationTestCases should be added under tests and added to the
-list of tests in FrameworkInstrumentationTestRunner.
-
diff --git a/tests/FrameworkTest/res/values/styles.xml b/tests/FrameworkTest/res/values/styles.xml
deleted file mode 100644
index 7a90197..0000000
--- a/tests/FrameworkTest/res/values/styles.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-    <style name="Theme" parent="android:Theme">
-        <item name="android:windowAnimationStyle">@style/Animation</item>
-    </style>
-
-    <style name="Animation">
-        <item name="android:activityOpenEnterAnimation">@null</item>
-        <item name="android:activityOpenExitAnimation">@null</item>
-        <item name="android:activityCloseEnterAnimation">@null</item>
-        <item name="android:activityCloseExitAnimation">@null</item>
-        <item name="android:taskOpenEnterAnimation">@null</item>
-        <item name="android:taskOpenExitAnimation">@null</item>
-        <item name="android:taskCloseEnterAnimation">@null</item>
-        <item name="android:taskCloseExitAnimation">@null</item>
-        <item name="android:taskToFrontEnterAnimation">@null</item>
-        <item name="android:taskToFrontExitAnimation">@null</item>
-        <item name="android:taskToBackEnterAnimation">@null</item>
-        <item name="android:taskToBackExitAnimation">@null</item>
-    </style>
-</resources>
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/FrameworkTestApplication.java b/tests/FrameworkTest/src/com/android/frameworktest/FrameworkTestApplication.java
deleted file mode 100644
index c57b9973..0000000
--- a/tests/FrameworkTest/src/com/android/frameworktest/FrameworkTestApplication.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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;
-
-import android.app.LauncherActivity;
-import android.content.Intent;
-
-/**
- * Holds little snippets of functionality used as code under test for
- * instrumentation tests of framework code.
- */
-public class FrameworkTestApplication extends LauncherActivity {
-
-    protected Intent getTargetIntent() {
-        // TODO: partition into categories by label like the sample code app
-        Intent targetIntent = new Intent(Intent.ACTION_MAIN, null);
-        targetIntent.addCategory(Intent.CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST);
-        targetIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        return targetIntent;
-    }
-}
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/performance/InvalidateCycle.java b/tests/FrameworkTest/src/com/android/frameworktest/performance/InvalidateCycle.java
deleted file mode 100644
index 22bb46f..0000000
--- a/tests/FrameworkTest/src/com/android/frameworktest/performance/InvalidateCycle.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2008 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.performance;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.os.Debug;
-import android.os.Handler;
-import android.view.View;
-import android.view.ViewGroup;
-import android.content.Context;
-import android.graphics.Canvas;
-
-public class InvalidateCycle extends Activity {
-    private boolean mStartProfiling;
-    private InvalidateCycle.AutoInvalidateView mView;
-
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mView = new AutoInvalidateView(this);
-        mView.setLayoutParams(new ViewGroup.LayoutParams(16, 16));
-        setContentView(mView);
-
-        new Handler().postDelayed(new Runnable() {
-            public void run() {
-                mStartProfiling = true;
-                android.util.Log.d("Performance", "Profiling started");
-                Debug.startMethodTracing("invalidateCycle");
-                mView.invalidate();
-            }
-        }, 15000);
-    }
-
-    private class AutoInvalidateView extends View {
-        private boolean mFirstDraw;
-
-        public AutoInvalidateView(Context context) {
-            super(context);
-        }
-
-        protected void onDraw(Canvas canvas) {
-            if (mStartProfiling && !mFirstDraw) {
-                Debug.stopMethodTracing();
-                android.util.Log.d("Performance", "Profiling ended");
-                mFirstDraw = true;
-            }
-            canvas.drawColor(0xFFFF0000);            
-        }
-    }
-}
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/settings/RingtonePickerActivityLauncher.java b/tests/FrameworkTest/src/com/android/frameworktest/settings/RingtonePickerActivityLauncher.java
deleted file mode 100644
index 19113da..0000000
--- a/tests/FrameworkTest/src/com/android/frameworktest/settings/RingtonePickerActivityLauncher.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.internal.app.RingtonePickerActivity;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Bundle;
-
-/**
- * Activity that will launch the RingtonePickerActivity as a subactivity, and
- * waits for its result.
- */
-public class RingtonePickerActivityLauncher extends Activity {
-
-    private static final String TAG = "RingtonePickerActivityLauncher";
-    
-    public boolean resultReceived = false;
-    
-    public int resultCode;
-    public Intent result;
-
-    public Uri pickedUri;
-    
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        
-        setContentView(android.R.layout.simple_list_item_1);
-    }
-
-    /**
-     * Launches the {@link RingtonePickerActivity} and blocks until it returns.
-     * 
-     * @param showDefault {@link RingtonePickerActivity#EXTRA_SHOW_DEFAULT}
-     * @param existingUri {@link RingtonePickerActivity#EXTRA_EXISTING_URI}
-     * @param filterColumns {@link RingtonePickerActivity#EXTRA_RINGTONE_COLUMNS}
-     */
-    public void launchRingtonePickerActivity(boolean showDefault, Uri existingUri,
-            int types) {
-        Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
-        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, showDefault);
-        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, existingUri);
-        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, types);
-        startActivityForResult(intent, 0);
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-       
-        resultReceived = true;
-
-        this.resultCode = resultCode;
-        this.result = data;
-        
-        if (data != null) {
-            this.pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
-        }
-    }
-    
-}
diff --git a/tests/FrameworkTest/tests/Android.mk b/tests/FrameworkTest/tests/Android.mk
deleted file mode 100644
index 5c54684..0000000
--- a/tests/FrameworkTest/tests/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# We only want this apk build for tests.
-LOCAL_MODULE_TAGS := tests
-
-# Include all test java files.
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-LOCAL_PACKAGE_NAME := FrameworkTestTests
-
-LOCAL_INSTRUMENTATION_FOR := FrameworkTest
-
-include $(BUILD_PACKAGE)
-
diff --git a/tests/FrameworkTest/tests/AndroidManifest.xml b/tests/FrameworkTest/tests/AndroidManifest.xml
deleted file mode 100644
index 65aaebb..0000000
--- a/tests/FrameworkTest/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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 name must be unique so suffix with "tests" so package loader doesn't ignore us -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.frameworktest.tests">
-
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <!--
-    This declares that this app uses the instrumentation test runner targeting
-    the package of com.android.frameworktest.  To run the tests use the command:
-    "adb shell am instrument -w com.android.frameworktest.tests/android.test.InstrumentationTestRunner"
-    -->
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
-                     android:targetPackage="com.android.frameworktest"
-                     android:label="framework tests"/>
-
-</manifest>
diff --git a/tests/FrameworkTest/tests/src/com/android/frameworktest/settings/RingtonePickerActivityTest.java b/tests/FrameworkTest/tests/src/com/android/frameworktest/settings/RingtonePickerActivityTest.java
deleted file mode 100644
index 42888ff..0000000
--- a/tests/FrameworkTest/tests/src/com/android/frameworktest/settings/RingtonePickerActivityTest.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * 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);
-        }
-    }
-}
