auto import from //depot/cupcake/@135843
diff --git a/tests/StatusBar/Android.mk b/tests/StatusBar/Android.mk
new file mode 100644
index 0000000..44f5099
--- /dev/null
+++ b/tests/StatusBar/Android.mk
@@ -0,0 +1,11 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := test
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := StatusBarTest
+LOCAL_CERTIFICATE := platform
+
+include $(BUILD_PACKAGE)
diff --git a/tests/StatusBar/AndroidManifest.xml b/tests/StatusBar/AndroidManifest.xml
new file mode 100644
index 0000000..9bba79c
--- /dev/null
+++ b/tests/StatusBar/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.statusbartest">
+    <uses-permission android:name="android.permission.DEVICE_POWER" />
+    <uses-permission android:name="android.permission.STATUS_BAR" />
+    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
+    <uses-permission android:name="android.permission.VIBRATE" />
+
+    <application>
+        <activity android:name="StatusBarTest" android:label="_StatusBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name="NotificationTestList" android:label="_Notifications">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name="ToastTest" android:label="_Toasts">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name="PowerTest" android:label="_Power">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/StatusBar/res/drawable/app_gmail.png b/tests/StatusBar/res/drawable/app_gmail.png
new file mode 100644
index 0000000..beaaacf
--- /dev/null
+++ b/tests/StatusBar/res/drawable/app_gmail.png
Binary files differ
diff --git a/tests/StatusBar/res/drawable/app_phone.png b/tests/StatusBar/res/drawable/app_phone.png
new file mode 100644
index 0000000..2748c1c
--- /dev/null
+++ b/tests/StatusBar/res/drawable/app_phone.png
Binary files differ
diff --git a/tests/StatusBar/res/drawable/ic_statusbar_chat.png b/tests/StatusBar/res/drawable/ic_statusbar_chat.png
new file mode 100644
index 0000000..e08cddb
--- /dev/null
+++ b/tests/StatusBar/res/drawable/ic_statusbar_chat.png
Binary files differ
diff --git a/tests/StatusBar/res/drawable/ic_statusbar_email.png b/tests/StatusBar/res/drawable/ic_statusbar_email.png
new file mode 100644
index 0000000..19c9005
--- /dev/null
+++ b/tests/StatusBar/res/drawable/ic_statusbar_email.png
Binary files differ
diff --git a/tests/StatusBar/res/drawable/ic_statusbar_missedcall.png b/tests/StatusBar/res/drawable/ic_statusbar_missedcall.png
new file mode 100644
index 0000000..ced62d7
--- /dev/null
+++ b/tests/StatusBar/res/drawable/ic_statusbar_missedcall.png
Binary files differ
diff --git a/tests/StatusBar/res/drawable/icon1.png b/tests/StatusBar/res/drawable/icon1.png
new file mode 100644
index 0000000..abfb6fa
--- /dev/null
+++ b/tests/StatusBar/res/drawable/icon1.png
Binary files differ
diff --git a/tests/StatusBar/res/drawable/icon2.png b/tests/StatusBar/res/drawable/icon2.png
new file mode 100644
index 0000000..564b38b
--- /dev/null
+++ b/tests/StatusBar/res/drawable/icon2.png
Binary files differ
diff --git a/tests/StatusBar/res/drawable/icon3.png b/tests/StatusBar/res/drawable/icon3.png
new file mode 100644
index 0000000..e765d8f
--- /dev/null
+++ b/tests/StatusBar/res/drawable/icon3.png
Binary files differ
diff --git a/tests/StatusBar/res/drawable/icon4.png b/tests/StatusBar/res/drawable/icon4.png
new file mode 100644
index 0000000..5f33885
--- /dev/null
+++ b/tests/StatusBar/res/drawable/icon4.png
Binary files differ
diff --git a/tests/StatusBar/res/layout/chrono_notification.xml b/tests/StatusBar/res/layout/chrono_notification.xml
new file mode 100644
index 0000000..913a860
--- /dev/null
+++ b/tests/StatusBar/res/layout/chrono_notification.xml
@@ -0,0 +1,41 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="80sp"
+    android:orientation="horizontal"
+    >
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="fill_parent"
+        android:layout_weight="0"
+        android:orientation="vertical"
+        >
+
+        <ImageView android:id="@+id/icon"
+            android:layout_width="wrap_content"
+            android:layout_height="45dp"
+            android:layout_gravity="center"
+            android:scaleType="fitCenter"
+            android:src="@android:drawable/sym_def_app_icon"
+            />
+
+        <Chronometer android:id="@+id/time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:textColor="#ffffffff" />
+
+    </LinearLayout>
+
+    <TextView android:id="@+id/appName"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_weight="1"
+        android:paddingTop="4dp"
+        android:textSize="12sp"
+        android:textColor="#ffffffff"
+        />
+
+</LinearLayout>
+
diff --git a/tests/StatusBar/res/raw/ringer.mp3 b/tests/StatusBar/res/raw/ringer.mp3
new file mode 100644
index 0000000..aa052e7
--- /dev/null
+++ b/tests/StatusBar/res/raw/ringer.mp3
Binary files differ
diff --git a/tests/StatusBar/res/values/strings.xml b/tests/StatusBar/res/values/strings.xml
new file mode 100644
index 0000000..0c2cf0d
--- /dev/null
+++ b/tests/StatusBar/res/values/strings.xml
@@ -0,0 +1,22 @@
+<?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.
+-->
+
+<resources>
+    <string name="mainLabel">Hello <u>th<ignore>e</ignore>re</u>, <i>you</i> <b>Activity</b>!</string>
+    <string name="back">Back</string>
+    <string name="clear">Clear</string>
+</resources>
+
diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
new file mode 100644
index 0000000..e1a0e7d
--- /dev/null
+++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
@@ -0,0 +1,517 @@
+/*
+ * 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.statusbartest;
+
+import android.app.ListActivity;
+import android.app.PendingIntent;
+import android.widget.ArrayAdapter;
+import android.view.View;
+import android.widget.ListView;
+import android.content.Intent;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.os.Vibrator;
+import android.os.Bundle;
+import android.os.Handler;
+import android.util.Log;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.widget.RemoteViews;
+import android.widget.TextView;
+import android.os.PowerManager;
+
+public class NotificationTestList extends TestActivity
+{
+    private final static String TAG = "NotificationTestList";
+
+    NotificationManager mNM;
+    Vibrator mVibrator = new Vibrator();
+    Handler mHandler = new Handler();
+
+    long mChronometerBase = 0;
+
+    @Override
+    protected String tag() {
+        return TAG;
+    }
+
+    @Override
+    protected Test[] tests() {
+        mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
+        
+        return mTests;
+    }
+
+    private Test[] mTests = new Test[] {
+        new Test("Crash") {
+            public void run()
+            {
+                PowerManager.WakeLock wl
+                        = ((PowerManager)NotificationTestList.this.getSystemService("power"))
+                            .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "crasher");
+                wl.acquire();
+                mHandler.postDelayed(new Runnable() {
+                            public void run() {
+                                throw new RuntimeException("Die!");
+                            }
+                        }, 10000);
+
+            }
+        },
+
+        new Test("No view") {
+            public void run() {
+                Notification n = new Notification(R.drawable.icon1, "No view",
+                        System.currentTimeMillis());
+                mNM.notify(1, n);
+            }
+        },
+
+        new Test("No intent") {
+            public void run() {
+                Notification n = new Notification(R.drawable.icon1, "No intent",
+                        System.currentTimeMillis());
+                n.setLatestEventInfo(NotificationTestList.this, "No intent",
+                            "No intent", null);
+                mNM.notify(1, n);
+            }
+        },
+
+        new Test("Layout") {
+            public void run()
+            {
+
+                mNM.notify(1, new Notification(NotificationTestList.this,
+                            R.drawable.ic_statusbar_missedcall,
+                            null, System.currentTimeMillis()-(1000*60*60*24),
+                            "(453) 123-2328",
+                            "", null));
+
+                mNM.notify(2, new Notification(NotificationTestList.this,
+                            R.drawable.ic_statusbar_email,
+                            null, System.currentTimeMillis(),
+                            "Mark Willem, Me (2)",
+                            "Re: Didn't you get the memo?", null));
+
+                mNM.notify(3, new Notification(NotificationTestList.this,
+                            R.drawable.ic_statusbar_chat,
+                            null, System.currentTimeMillis()+(1000*60*60*24),
+                            "Sophia Winterlanden",
+                            "Lorem ipsum dolor sit amet.", null));
+            }
+        },
+
+        new StateStress("Stress - Ongoing / Latest", 100, 100, new Runnable[] {
+                new Runnable() {
+                    public void run() {
+                        Log.d(TAG, "Stress - Ongoing/Latest 0");
+                        Notification n = new Notification(NotificationTestList.this,
+                                R.drawable.icon3,
+                                null, System.currentTimeMillis(), "Stress - Ongoing",
+                                "Notify me!!!", null);
+                        n.flags |= Notification.FLAG_ONGOING_EVENT;
+                        mNM.notify(1, n);
+                    }
+                },
+                new Runnable() {
+                    public void run() {
+                        Log.d(TAG, "Stress - Ongoing/Latest 1");
+                        Notification n = new Notification(NotificationTestList.this,
+                                R.drawable.icon4,
+                                null, System.currentTimeMillis(), "Stress - Latest",
+                                "Notify me!!!", null);
+                        n.flags |= Notification.FLAG_ONGOING_EVENT;
+                        mNM.notify(1, n);
+                    }
+                }
+            }),
+
+        new Test("Long") {
+            public void run()
+            {
+                Notification n = new Notification();
+                n.defaults |= Notification.DEFAULT_SOUND ;
+                n.vibrate = new long[] {
+                        300, 400, 300, 400, 300, 400, 300, 400, 300, 400, 300, 400,
+                        300, 400, 300, 400, 300, 400, 300, 400, 300, 400, 300, 400, 
+                        300, 400, 300, 400, 300, 400, 300, 400, 300, 400, 300, 400 };
+                mNM.notify(1, n);
+            }
+        },
+
+        new Test("Default All") {
+            public void run()
+            {
+                Notification n = new Notification();
+                n.defaults |= Notification.DEFAULT_ALL;
+                mNM.notify(1, n);
+            }
+        },
+
+        new Test("Default All, once") {
+            public void run()
+            {
+                Notification n = new Notification();
+                n.defaults |= Notification.DEFAULT_ALL;
+                n.flags |= Notification.FLAG_ONLY_ALERT_ONCE ;
+                mNM.notify(1, n);
+            }
+        },
+
+        new Test("Content Sound") {
+            public void run()
+            {
+                Notification n = new Notification();
+                n.sound = Uri.parse(
+                        "content://media/internal/audio/media/7");
+
+                mNM.notify(1, n);
+            }
+        },
+
+        new Test("Resource Sound") {
+            public void run()
+            {
+                Notification n = new Notification();
+                n.sound = Uri.parse(
+                        "android.resource://com.android.notificationtest/raw/ringer");
+                Log.d(TAG, "n.sound=" + n.sound);
+
+                mNM.notify(1, n);
+            }
+        },
+
+        new Test("Sound and Cancel") {
+            public void run()
+            {
+                Notification n = new Notification();
+                n.sound = Uri.parse(
+                            "content://media/internal/audio/media/7");
+
+                mNM.notify(1, n);
+                SystemClock.sleep(200);
+                mNM.cancel(1);
+            }
+        },
+
+        new Test("Vibrate") {
+            public void run()
+            {
+                Notification n = new Notification();
+                    n.vibrate = new long[] { 0, 700, 500, 1000 };
+
+                mNM.notify(1, n);
+            }
+        },
+
+        new Test("Vibrate and cancel") {
+            public void run()
+            {
+                Notification n = new Notification();
+                    n.vibrate = new long[] { 0, 700, 500, 1000 };
+
+                mNM.notify(1, n);
+                SystemClock.sleep(500);
+                mNM.cancel(1);
+            }
+        },
+
+        new Test("Vibrate pattern") {
+            public void run()
+            {
+                mVibrator.vibrate(new long[] { 250, 1000, 500, 2000 }, -1);
+            }
+        },
+
+        new Test("Vibrate pattern repeating") {
+            public void run()
+            {
+                mVibrator.vibrate(new long[] { 250, 1000, 500 }, 1);
+            }
+        },
+
+        new Test("Vibrate 3s") {
+            public void run()
+            {
+                mVibrator.vibrate(3000);
+            }
+        },
+
+        new Test("Vibrate 100s") {
+            public void run()
+            {
+                mVibrator.vibrate(100000);
+            }
+        },
+
+        new Test("Vibrate off") {
+            public void run()
+            {
+                mVibrator.cancel();
+            }
+        },
+
+        new Test("Cancel #1") {
+            public void run() {
+                mNM.cancel(1);
+            }
+        },
+
+        new Test("Cancel #1 in 3 sec") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                            public void run() {
+                                Log.d(TAG, "Cancelling now...");
+                                mNM.cancel(1);
+                            }
+                        }, 3000);
+            }
+        },
+
+        new Test("Cancel #2") {
+            public void run() {
+                mNM.cancel(2);
+            }
+        },
+
+        new Test("Persistent #1") {
+            public void run() {
+                Notification n = new Notification(R.drawable.icon1, "tick tick tick",
+                        System.currentTimeMillis());
+                n.setLatestEventInfo(NotificationTestList.this, "Persistent #1",
+                            "This is a notification!!!", makeIntent());
+                mNM.notify(1, n);
+            }
+        },
+
+        new Test("Persistent #1 in 3 sec") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                            public void run() {
+                                Notification n = new Notification(R.drawable.icon1,
+                                        "            "
+                                        + "tick tock tick tock\n\nSometimes notifications can "
+                                        + "be really long and wrap to more than one line.\n"
+                                        + "Sometimes."
+                                        + "Ohandwhathappensifwehaveonereallylongstringarewesure"
+                                        + "thatwesegmentitcorrectly?\n",
+                                        System.currentTimeMillis());
+                                n.setLatestEventInfo(NotificationTestList.this,
+                                        "Still Persistent #1",
+                                        "This is still a notification!!!",
+                                        makeIntent());
+                                mNM.notify(1, n);
+                            }
+                        }, 3000);
+            }
+        },
+
+        new Test("Persistent #2") {
+            public void run() {
+                Notification n = new Notification(R.drawable.icon2, "tock tock tock",
+                        System.currentTimeMillis());
+                n.setLatestEventInfo(NotificationTestList.this, "Persistent #2",
+                            "Notify me!!!", makeIntent());
+                mNM.notify(2, n);
+            }
+        },
+
+        new Test("Persistent #2 Vibrate") {
+            public void run() {
+                Notification n = new Notification(R.drawable.icon2, "tock tock tock",
+                        System.currentTimeMillis());
+                n.setLatestEventInfo(NotificationTestList.this, "Persistent #2",
+                            "Notify me!!!", makeIntent());
+                n.defaults = Notification.DEFAULT_VIBRATE;
+                mNM.notify(2, n);
+            }
+        },
+
+        new Test("Chronometer Start") {
+            public void run() {
+                Notification n = new Notification(R.drawable.icon2, "me me me me",
+                                                    System.currentTimeMillis());
+                n.contentView = new RemoteViews(getPackageName(), R.layout.chrono_notification);
+                mChronometerBase = SystemClock.elapsedRealtime();
+                n.contentView.setChronometer(R.id.time, mChronometerBase, "Yay! (%s)", true);
+                n.flags |= Notification.FLAG_ONGOING_EVENT;
+                n.contentIntent = makeIntent();
+                mNM.notify(2, n);
+            }
+        },
+
+        new Test("Chronometer Stop") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            Log.d(TAG, "Chronometer Stop");
+                            Notification n = new Notification();
+                            n.icon = R.drawable.icon1;
+                            n.contentView = new RemoteViews(getPackageName(),
+                                                             R.layout.chrono_notification);
+                            n.contentView.setChronometer(R.id.time, mChronometerBase, null, false);
+                            n.contentIntent = makeIntent();
+                            mNM.notify(2, n);
+                        }
+                    }, 3000);
+            }
+        },
+
+        new Test("Sequential Persistent") {
+            public void run() {
+                mNM.notify(1, notificationWithNumbers(1));
+                mNM.notify(2, notificationWithNumbers(2));
+            }
+        },
+
+        new Test("Replace Persistent") {
+            public void run() {
+                mNM.notify(1, notificationWithNumbers(1));
+                mNM.notify(1, notificationWithNumbers(1));
+            }
+        },
+
+        new Test("Run and Cancel (n=1)") {
+            public void run() {
+                mNM.notify(1, notificationWithNumbers(1));
+                mNM.cancel(1);
+            }
+        },
+
+        new Test("Run an Cancel (n=2)") {
+            public void run() {
+                mNM.notify(1, notificationWithNumbers(1));
+                mNM.notify(2, notificationWithNumbers(2));
+                mNM.cancel(2);
+            }
+        },
+
+        // Repeatedly notify and cancel -- triggers bug #670627
+        new Test("Bug 670627") {
+            public void run() {
+                for (int i = 0; i < 10; i++) {
+                  Log.d(TAG, "Add two notifications");
+                  mNM.notify(1, notificationWithNumbers(1));
+                  mNM.notify(2, notificationWithNumbers(2));
+                  Log.d(TAG, "Cancel two notifications");
+                  mNM.cancel(1);
+                  mNM.cancel(2);
+                }
+            }
+        },
+
+        new Test("Ten Notifications") {
+            public void run() {
+                for (int i = 0; i < 2; i++) {
+                    Notification n = new Notification(NotificationTestList.this, R.drawable.icon2,
+                            null, System.currentTimeMillis(), "Persistent #" + i,
+                            "Notify me!!!" + i, null);
+                    n.flags |= Notification.FLAG_ONGOING_EVENT;
+                    n.number = i;
+                    mNM.notify((i+1)*10, n);
+                }
+                for (int i = 2; i < 10; i++) {
+                    Notification n = new Notification(NotificationTestList.this, R.drawable.icon2,
+                            null, System.currentTimeMillis(), "Persistent #" + i,
+                            "Notify me!!!" + i, null);
+                    n.number = i;
+                    mNM.notify((i+1)*10, n);
+                }
+            }
+        },
+        
+        new Test("Cancel eight notifications") {
+            public void run() {
+                for (int i = 1; i < 9; i++) {
+                    mNM.cancel((i+1)*10);
+                }
+            }
+        },
+        
+        new Test("Persistent with numbers 1") {
+            public void run() {
+                mNM.notify(1, notificationWithNumbers(1));
+            }
+        },
+
+        new Test("Persistent with numbers 222") {
+            public void run() {
+                mNM.notify(1, notificationWithNumbers(22));
+            }
+        },
+
+        new Test("Persistent with numbers 333") {
+            public void run() {
+                mNM.notify(1, notificationWithNumbers(333));
+            }
+        },
+
+        new Test("Persistent with numbers 4444") {
+            public void run() {
+                mNM.notify(1, notificationWithNumbers(4444));
+            }
+        },
+
+    };
+
+    private Notification notificationWithNumbers(int num) {
+        Notification n = new Notification(this, R.drawable.icon2, null, System.currentTimeMillis(),
+                "Persistent #2", "Notify me!!!", null);
+        n.number = num;
+        return n;
+    }
+
+    private PendingIntent makeIntent() {
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setComponent(new android.content.ComponentName(
+                    "com.android.contacts",
+                    "com.android.contacts.ContactsActivity"));
+        return PendingIntent.getActivity(this, 0, intent, 0);
+    }
+
+    class StateStress extends Test {
+        StateStress(String name, int pause, int iterations, Runnable[] tasks) {
+            super(name);
+            mPause = pause;
+            mTasks = tasks;
+            mIteration = iterations;
+        }
+        Runnable[] mTasks;
+        int mNext;
+        int mIteration;
+        long mPause;
+        Runnable mRunnable = new Runnable() {
+            public void run() {
+                mTasks[mNext].run();
+                mNext++;
+                if (mNext >= mTasks.length) {
+                    mNext = 0;
+                    mIteration--;
+                    if (mIteration <= 0) {
+                        return;
+                    }
+                }
+                mHandler.postDelayed(mRunnable, mPause);
+            }
+        };
+        public void run() {
+            mNext = 0;
+            mHandler.postDelayed(mRunnable, mPause);
+        }
+    }
+}
+
diff --git a/tests/StatusBar/src/com/android/statusbartest/PowerTest.java b/tests/StatusBar/src/com/android/statusbartest/PowerTest.java
new file mode 100644
index 0000000..f236a4b
--- /dev/null
+++ b/tests/StatusBar/src/com/android/statusbartest/PowerTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.statusbartest;
+
+import android.app.ListActivity;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.widget.ArrayAdapter;
+import android.view.View;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.IPowerManager;
+import android.widget.ListView;
+import android.content.Intent;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.StatusBarManager;
+import android.os.RemoteException;
+import android.os.Vibrator;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.LocalPowerManager;
+import android.os.ServiceManager;
+import android.util.Log;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.widget.RemoteViews;
+import android.widget.Toast;
+import android.os.PowerManager;
+
+public class PowerTest extends TestActivity
+{
+    private final static String TAG = "PowerTest";
+    IPowerManager mPowerManager;
+    int mPokeState = 0;
+    IBinder mPokeToken = new Binder();
+    Handler mHandler = new Handler();
+
+    @Override
+    protected String tag() {
+        return TAG;
+    }
+
+    @Override
+    protected Test[] tests() {
+        mPowerManager = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
+        
+        return mTests;
+    }
+    private Test[] mTests = new Test[] {
+        new Test("Touch events don't poke") {
+            public void run() {
+                mPokeState |= LocalPowerManager.POKE_LOCK_IGNORE_CHEEK_EVENTS;
+                try {
+                    mPowerManager.setPokeLock(mPokeState, mPokeToken, TAG);
+                } catch (RemoteException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        },
+        new Test("Touch events poke") {
+            public void run() {
+                mPokeState &= ~LocalPowerManager.POKE_LOCK_IGNORE_CHEEK_EVENTS;
+                try {
+                    mPowerManager.setPokeLock(mPokeState, mPokeToken, TAG);
+                } catch (RemoteException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        },
+        new Test("Short timeout") {
+            public void run() {
+                mPokeState &= ~LocalPowerManager.POKE_LOCK_TIMEOUT_MASK;
+                mPokeState |= LocalPowerManager.POKE_LOCK_SHORT_TIMEOUT;
+                try {
+                    mPowerManager.setPokeLock(mPokeState, mPokeToken, TAG);
+                } catch (RemoteException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        },
+        new Test("Medium timeout") {
+            public void run() {
+                mPokeState &= ~LocalPowerManager.POKE_LOCK_TIMEOUT_MASK;
+                mPokeState |= LocalPowerManager.POKE_LOCK_MEDIUM_TIMEOUT;
+                try {
+                    mPowerManager.setPokeLock(mPokeState, mPokeToken, TAG);
+                } catch (RemoteException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        },
+        new Test("Normal timeout") {
+            public void run() {
+                mPokeState &= ~LocalPowerManager.POKE_LOCK_TIMEOUT_MASK;
+                try {
+                    mPowerManager.setPokeLock(mPokeState, mPokeToken, TAG);
+                } catch (RemoteException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        },
+        new Test("Illegal timeout") {
+            public void run() {
+                mPokeState |= LocalPowerManager.POKE_LOCK_SHORT_TIMEOUT
+                        | LocalPowerManager.POKE_LOCK_MEDIUM_TIMEOUT;
+                try {
+                    mPowerManager.setPokeLock(mPokeState, mPokeToken, TAG);
+                } catch (RemoteException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        },
+    };
+}
diff --git a/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java
new file mode 100644
index 0000000..275e5cb6
--- /dev/null
+++ b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java
@@ -0,0 +1,164 @@
+/*
+ * 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.statusbartest;
+
+import android.app.ListActivity;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.widget.ArrayAdapter;
+import android.view.View;
+import android.widget.ListView;
+import android.content.Intent;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.StatusBarManager;
+import android.os.Vibrator;
+import android.os.Bundle;
+import android.os.Handler;
+import android.util.Log;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.widget.RemoteViews;
+import android.widget.Toast;
+import android.os.PowerManager;
+
+public class StatusBarTest extends TestActivity
+{
+    private final static String TAG = "StatusBarTest";
+    StatusBarManager mStatusBarManager;
+    NotificationManager mNotificationManager;
+    Handler mHandler = new Handler();
+
+    @Override
+    protected String tag() {
+        return TAG;
+    }
+
+    @Override
+    protected Test[] tests() {
+        mStatusBarManager = (StatusBarManager)getSystemService(STATUS_BAR_SERVICE);
+        mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+        
+        return mTests;
+    }
+
+    private Test[] mTests = new Test[] {
+        new Test("Disable Alerts") {
+            public void run() {
+                mStatusBarManager.disable(StatusBarManager.DISABLE_NOTIFICATION_ALERTS);
+            }
+        },
+        new Test("Disable Expand in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND);
+                        }
+                    }, 3000);
+            }
+        },
+        new Test("Disable Notifications in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mStatusBarManager.disable(StatusBarManager.DISABLE_NOTIFICATION_ICONS);
+                        }
+                    }, 3000);
+            }
+        },
+        new Test("Disable Both in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND
+                                    | StatusBarManager.DISABLE_NOTIFICATION_ICONS);
+                        }
+                    }, 3000);
+            }
+        },
+        new Test("Disable None in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mStatusBarManager.disable(0);
+                        }
+                    }, 3000);
+            }
+        },
+        new Test("Notify in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mNotificationManager.notify(1,
+                                    new Notification(StatusBarTest.this,
+                                            R.drawable.ic_statusbar_missedcall,
+                                            "tick tick tick",
+                                            System.currentTimeMillis()-(1000*60*60*24),
+                                            "(453) 123-2328",
+                                            "", null
+                                            ));
+                        }
+                    }, 3000);
+            }
+        },
+        new Test("Cancel Notification in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mNotificationManager.cancel(1);
+                        }
+                    }, 3000);
+            }
+        },
+        new Test("Expand in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mStatusBarManager.expand();
+                        }
+                    }, 3000);
+            }
+        },
+        new Test("Expand in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mStatusBarManager.expand();
+                        }
+                    }, 3000);
+            }
+        },
+        new Test("Collapse in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mStatusBarManager.collapse();
+                        }
+                    }, 3000);
+            }
+        },
+        new Test("Toggle in 3 sec.") {
+            public void run() {
+                mHandler.postDelayed(new Runnable() {
+                        public void run() {
+                            mStatusBarManager.toggle();
+                        }
+                    }, 3000);
+            }
+        },
+    };
+}
diff --git a/tests/StatusBar/src/com/android/statusbartest/TestActivity.java b/tests/StatusBar/src/com/android/statusbartest/TestActivity.java
new file mode 100644
index 0000000..6a8c62e
--- /dev/null
+++ b/tests/StatusBar/src/com/android/statusbartest/TestActivity.java
@@ -0,0 +1,73 @@
+/*
+ * 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.statusbartest;
+
+import android.app.ListActivity;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.widget.ArrayAdapter;
+import android.view.View;
+import android.widget.ListView;
+import android.content.Intent;
+import android.os.Vibrator;
+import android.os.Bundle;
+import android.os.Handler;
+import android.util.Log;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.widget.RemoteViews;
+import android.widget.Toast;
+import android.os.PowerManager;
+
+public abstract class TestActivity extends ListActivity
+{
+    Test[] mTests;
+
+    protected abstract String tag();
+    protected abstract Test[] tests();
+
+    abstract class Test {
+        String name;
+        Test(String n) {
+            name = n;
+        }
+        abstract void run();
+    }
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        mTests = tests();
+
+        String[] labels = new String[mTests.length];
+        for (int i=0; i<mTests.length; i++) {
+            labels[i] = mTests[i].name;
+        }
+
+        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, labels));
+    }
+
+    @Override
+    public void onListItemClick(ListView l, View v, int position, long id)
+    {
+        Test t = mTests[position];
+        Log.d(tag(), "Test: " + t.name);
+        t.run();
+    }
+    
+}
diff --git a/tests/StatusBar/src/com/android/statusbartest/ToastTest.java b/tests/StatusBar/src/com/android/statusbartest/ToastTest.java
new file mode 100644
index 0000000..018c9f2
--- /dev/null
+++ b/tests/StatusBar/src/com/android/statusbartest/ToastTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.statusbartest;
+
+import android.app.ListActivity;
+import android.app.PendingIntent;
+import android.widget.ArrayAdapter;
+import android.view.View;
+import android.widget.ListView;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.util.Log;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.view.Gravity;
+import android.widget.RemoteViews;
+import android.widget.Toast;
+import android.widget.TextView;
+import android.os.PowerManager;
+
+public class ToastTest extends TestActivity
+{
+    private final static String TAG = "ToastTest";
+
+    Handler mHandler = new Handler();
+    Toast mToast1;
+    Toast mToast2;
+
+    @Override
+    protected String tag() {
+        return TAG;
+    }
+
+    @Override
+    protected Test[] tests() {
+        return mTests;
+    }
+
+    private Test[] mTests = new Test[] {
+        new Test("Make Toast #1") {
+            public void run()
+            {
+                mToast1 = Toast.makeText(ToastTest.this, "hi 1", Toast.LENGTH_SHORT);
+            }
+        },
+
+        new Test("Show Toast #1") {
+            public void run()
+            {
+                mToast1.show();
+            }
+        },
+
+        new Test("Update Toast #1") {
+            public void run()
+            {
+                TextView view = new TextView(ToastTest.this);
+                view.setText("replaced!");
+                mToast1.setView(view);
+                mToast1.show();
+            }
+        },
+
+        new Test("Make Toast #2") {
+            public void run()
+            {
+                mToast2 = Toast.makeText(ToastTest.this, "hi 2", Toast.LENGTH_SHORT);
+            }
+        },
+
+        new Test("Show Toast #2") {
+            public void run()
+            {
+                mToast2.show();
+            }
+        },
+
+        new Test("Gravity Toast LEFT") {
+            public void run()
+            {
+                Toast toast = Toast.makeText(ToastTest.this, "LEFT", Toast.LENGTH_SHORT);
+                toast.setGravity(Gravity.LEFT, 0, 0);
+                toast.show();
+            }
+        },
+
+        new Test("Gravity Toast FILL_HORIZONTAL") {
+            public void run()
+            {
+                Toast toast = Toast.makeText(ToastTest.this, "FILL_HORIZONTAL",
+                        Toast.LENGTH_SHORT);
+                toast.setGravity(Gravity.FILL_HORIZONTAL, 0, 0);
+                toast.show();
+            }
+        },
+
+    };
+}
+