auto import from //depot/cupcake/@135843
diff --git a/test-runner/android/test/TestBrowserActivity.java b/test-runner/android/test/TestBrowserActivity.java
new file mode 100644
index 0000000..ea5f91e
--- /dev/null
+++ b/test-runner/android/test/TestBrowserActivity.java
@@ -0,0 +1,127 @@
+/*
+ * 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 android.test;
+
+import com.android.internal.R;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import java.util.List;
+
+/**
+ * @hide - This is part of a framework that is under development and should not be used for
+ * active development.
+ */
+public abstract class TestBrowserActivity extends ListActivity
+        implements android.test.TestBrowserView, AdapterView.OnItemClickListener,
+        TestSuiteProvider {
+
+    private TestBrowserController mTestBrowserController;
+    public static final String BUNDLE_EXTRA_PACKAGE = "package";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        getListView().setOnItemClickListener(this);
+
+        mTestBrowserController = ServiceLocator.getTestBrowserController();
+        mTestBrowserController.setTargetPackageName(getPackageName());
+        mTestBrowserController.registerView(this);
+        mTestBrowserController.setTargetBrowserActivityClassName(this.getClass().getName());
+
+        // Apk paths used to search for test classes when using TestSuiteBuilders.
+        String[] apkPaths = {getPackageCodePath()};
+        ClassPathPackageInfoSource.setApkPaths(apkPaths);
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        TestSuite testSuite = getTestSuiteToBrowse();
+        mTestBrowserController.setTestSuite(testSuite);
+        
+        String name = testSuite.getName();
+        if (name != null) {
+            setTitle(name.substring(name.lastIndexOf(".") + 1));
+        }
+    }
+
+    /**
+     * Subclasses will override this method and return the TestSuite specific to their .apk.
+     * When this method is invoked due to an intent fired from
+     * {@link #onItemClick(android.widget.AdapterView, android.view.View, int, long)} then get the
+     * targeted TestSuite from the intent.
+     *
+     * @return testSuite to browse
+     */
+    @SuppressWarnings("unchecked")
+    private TestSuite getTestSuiteToBrowse() {
+        Intent intent = getIntent();
+        if (Intent.ACTION_RUN.equals(intent.getAction())) {
+            String testClassName = intent.getData().toString();
+
+            try {
+                Class<Test> testClass = (Class<Test>) getClassLoader().loadClass(testClassName);
+                return TestCaseUtil.createTestSuite(testClass);
+            } catch (ClassNotFoundException e) {
+                Log.e("TestBrowserActivity", "ClassNotFoundException for " + testClassName, e);
+                throw new RuntimeException(e);
+            } catch (IllegalAccessException e) {
+                Log.e("TestBrowserActivity", "IllegalAccessException for " + testClassName, e);
+                throw new RuntimeException(e);
+            } catch (InstantiationException e) {
+                Log.e("TestBrowserActivity", "InstantiationException for " + testClassName, e);
+                throw new RuntimeException(e);
+            }
+        } else {
+            // get test classes to browwes from subclass
+            return getTopTestSuite();
+        }
+
+    }
+
+    public TestSuite getTestSuite() {
+        return getTopTestSuite();
+    }
+
+    /**
+     * @return A TestSuite that should be run for a given application.
+     */
+    public abstract TestSuite getTopTestSuite();
+
+    public void onItemClick(AdapterView parent, View v, int position, long id) {
+        Intent intent = mTestBrowserController.getIntentForTestAt(position);
+        intent.putExtra(BUNDLE_EXTRA_PACKAGE, getPackageName());
+        startActivity(intent);
+    }
+
+    public void setTestNames(List<String> testNames) {
+        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
+                R.layout.test_list_item, testNames);
+        setListAdapter(arrayAdapter);
+    }
+}
+