Merge "ClassZeroActivity: Queue messages instead of displaying them all at once"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a34ff9f..33ab25c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -181,6 +181,7 @@
         <activity android:name=".ui.ClassZeroActivity"
             android:label="@string/class_0_message_activity"
             android:theme="@android:style/Theme.Translucent"
+            android:launchMode="singleTop"
             android:excludeFromRecents="true">
         </activity>
 
diff --git a/src/com/android/mms/ui/ClassZeroActivity.java b/src/com/android/mms/ui/ClassZeroActivity.java
index 0abcdda..90d155d 100644
--- a/src/com/android/mms/ui/ClassZeroActivity.java
+++ b/src/com/android/mms/ui/ClassZeroActivity.java
@@ -24,6 +24,7 @@
 import android.content.ContentValues;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
 import android.database.Cursor;
 import android.database.sqlite.SqliteWrapper;
 import android.net.Uri;
@@ -41,6 +42,8 @@
 import com.android.mms.R;
 import com.android.mms.transaction.MessagingNotification;
 
+import java.util.ArrayList;
+
 /**
  * Display a class-zero SMS message to the user. Wait for the user to dismiss
  * it.
@@ -69,6 +72,8 @@
     private long mTimerSet = 0;
     private AlertDialog mDialog = null;
 
+    private ArrayList<SmsMessage> mMessageQueue = null;
+
     private Handler mHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
@@ -77,11 +82,35 @@
                 mRead = false;
                 mDialog.dismiss();
                 saveMessage();
-                finish();
+                processNextMessage();
             }
         }
     };
 
+    private boolean queueMsgFromIntent(Intent msgIntent) {
+        byte[] pdu = msgIntent.getByteArrayExtra("pdu");
+        String format = msgIntent.getStringExtra("format");
+        SmsMessage rawMessage = SmsMessage.createFromPdu(pdu, format);
+        String message = rawMessage.getMessageBody();
+        if (TextUtils.isEmpty(message)) {
+            if (mMessageQueue.size() == 0) {
+                finish();
+            }
+            return false;
+        }
+        mMessageQueue.add(rawMessage);
+        return true;
+    }
+
+    private void processNextMessage() {
+        mMessageQueue.remove(0);
+        if (mMessageQueue.size() == 0) {
+            finish();
+        } else {
+            displayZeroMessage(mMessageQueue.get(0));
+        }
+    }
+
     private void saveMessage() {
         Uri messageUri = null;
         if (mMessage.isReplace()) {
@@ -98,35 +127,53 @@
     }
 
     @Override
+    protected void onNewIntent(Intent msgIntent) {
+        /* Running with another visible message, queue this one */
+        queueMsgFromIntent(msgIntent);
+    }
+
+    @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         requestWindowFeature(Window.FEATURE_NO_TITLE);
         getWindow().setBackgroundDrawableResource(
                 R.drawable.class_zero_background);
 
-        byte[] pdu = getIntent().getByteArrayExtra("pdu");
-        String format = getIntent().getStringExtra("format");
-        mMessage = SmsMessage.createFromPdu(pdu, format);
-        CharSequence messageChars = mMessage.getMessageBody();
-        String message = messageChars.toString();
-        if (TextUtils.isEmpty(message)) {
-            finish();
+        if (mMessageQueue == null) {
+            mMessageQueue = new ArrayList<SmsMessage>();
+        }
+
+        if (!queueMsgFromIntent(getIntent())) {
             return;
         }
+
+        if (mMessageQueue.size() == 1) {
+            displayZeroMessage(mMessageQueue.get(0));
+        }
+
+        if (icicle != null) {
+            mTimerSet = icicle.getLong(TIMER_FIRE, mTimerSet);
+        }
+    }
+
+    private void displayZeroMessage(SmsMessage rawMessage) {
+        CharSequence messageChars = rawMessage.getMessageBody();
+        /* This'll be used by the save action */
+        mMessage = rawMessage;
+        String message = messageChars.toString();
+
         // TODO: The following line adds an emptry string before and after a message.
         // This is not the correct way to layout a message. This is more of a hack
         // to work-around a bug in AlertDialog. This needs to be fixed later when
         // Android fixes the bug in AlertDialog.
         if (message.length() < BUFFER_OFFSET) messageChars = BUFFER + message + BUFFER;
-        long now = SystemClock.uptimeMillis();
-        mDialog = new AlertDialog.Builder(this).setMessage(messageChars)
+
+        mDialog = new AlertDialog.Builder(this, AlertDialog.THEME_HOLO_DARK).setMessage(message)
                 .setPositiveButton(R.string.save, mSaveListener)
                 .setNegativeButton(android.R.string.cancel, mCancelListener)
                 .setCancelable(false).show();
+        long now = SystemClock.uptimeMillis();
         mTimerSet = now + DEFAULT_TIMER;
-        if (icicle != null) {
-            mTimerSet = icicle.getLong(TIMER_FIRE, mTimerSet);
-        }
     }
 
     @Override
@@ -168,7 +215,7 @@
     private final OnClickListener mCancelListener = new OnClickListener() {
         public void onClick(DialogInterface dialog, int whichButton) {
             dialog.dismiss();
-            finish();
+            processNextMessage();
         }
     };
 
@@ -177,7 +224,7 @@
             mRead = true;
             saveMessage();
             dialog.dismiss();
-            finish();
+            processNextMessage();
         }
     };