Process inactive msgs if Mms app is relaunched

Try to process all pending transations and queued smses
which maybe killed by user, OOM or Mms crashing and so on
after Mms app is (re)launched.

Since for Mms: Mms app only will retry failed transaction(
must be marked as failed) due to network issue or any known
reason, and for sms: Mms app only rely on SmsDispatcher to
retry to send at most 3 times.

Change-Id: Ifc46d1a86bf33342590313c29d6d4c0aff7c739f
Signed-off-by: Roger Chen <cxr514033970@gmail.com>
diff --git a/src/com/android/mms/MmsApp.java b/src/com/android/mms/MmsApp.java
index 74f4043..9092a29 100644
--- a/src/com/android/mms/MmsApp.java
+++ b/src/com/android/mms/MmsApp.java
@@ -19,6 +19,7 @@
 
 import android.app.Application;
 import android.content.Context;
+import android.content.Intent;
 import android.content.res.Configuration;
 import android.drm.DrmManagerClient;
 import android.location.Country;
@@ -34,6 +35,9 @@
 import com.android.mms.data.Conversation;
 import com.android.mms.layout.LayoutManager;
 import com.android.mms.transaction.MessagingNotification;
+import com.android.mms.transaction.MmsSystemEventReceiver;
+import com.android.mms.transaction.SmsReceiver;
+import com.android.mms.transaction.SmsReceiverService;
 import com.android.mms.util.DownloadManager;
 import com.android.mms.util.DraftCache;
 import com.android.mms.util.PduLoaderManager;
@@ -94,6 +98,23 @@
         LayoutManager.init(this);
         SmileyParser.init(this);
         MessagingNotification.init(this);
+
+        activePendingMessages();
+    }
+
+    /**
+     * Try to process all pending messages(which were interrupted by user, OOM, Mms crashing,
+     * etc...) when Mms app is (re)launched.
+     */
+    private void activePendingMessages() {
+        // For Mms: try to process all pending transactions if possible
+        MmsSystemEventReceiver.wakeUpService(this);
+
+        // For Sms: retry to send smses in outbox and queued box
+        sendBroadcast(new Intent(SmsReceiverService.ACTION_SEND_INACTIVE_MESSAGE,
+                null,
+                this,
+                SmsReceiver.class));
     }
 
     synchronized public static MmsApp getApplication() {
diff --git a/src/com/android/mms/transaction/MmsSystemEventReceiver.java b/src/com/android/mms/transaction/MmsSystemEventReceiver.java
index f5ed3ac..9b78ea0 100644
--- a/src/com/android/mms/transaction/MmsSystemEventReceiver.java
+++ b/src/com/android/mms/transaction/MmsSystemEventReceiver.java
@@ -44,7 +44,7 @@
     private static final String TAG = "MmsSystemEventReceiver";
     private static ConnectivityManager mConnMgr = null;
 
-    private static void wakeUpService(Context context) {
+    public static void wakeUpService(Context context) {
         if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {
             Log.v(TAG, "wakeUpService: start transaction service ...");
         }
diff --git a/src/com/android/mms/transaction/SmsReceiverService.java b/src/com/android/mms/transaction/SmsReceiverService.java
index 642b778..4985edf 100755
--- a/src/com/android/mms/transaction/SmsReceiverService.java
+++ b/src/com/android/mms/transaction/SmsReceiverService.java
@@ -81,7 +81,9 @@
     public static final String EXTRA_MESSAGE_SENT_SEND_NEXT ="SendNextMsg";
 
     public static final String ACTION_SEND_MESSAGE =
-        "com.android.mms.transaction.SEND_MESSAGE";
+            "com.android.mms.transaction.SEND_MESSAGE";
+    public static final String ACTION_SEND_INACTIVE_MESSAGE =
+            "com.android.mms.transaction.SEND_INACTIVE_MESSAGE";
 
     // This must match the column IDs below.
     private static final String[] SEND_PROJECTION = new String[] {
@@ -209,6 +211,8 @@
                     handleServiceStateChanged(intent);
                 } else if (ACTION_SEND_MESSAGE.endsWith(action)) {
                     handleSendMessage();
+                } else if (ACTION_SEND_INACTIVE_MESSAGE.equals(action)) {
+                    handleSendInactiveMessage();
                 }
             }
             // NOTE: We MUST not call stopSelf() directly, since we need to
@@ -231,6 +235,12 @@
         }
     }
 
+    private void handleSendInactiveMessage() {
+        // Inactive messages includes all messages in outbox and queued box.
+        moveOutboxMessagesToQueuedBox();
+        sendFirstQueuedMessage();
+    }
+
     public synchronized void sendFirstQueuedMessage() {
         boolean success = true;
         // get all the queued messages from the database
@@ -394,6 +404,24 @@
     }
 
     /**
+     * Move all messages that are in the outbox to the queued state
+     * @return The number of messages that were actually moved
+     */
+    private int moveOutboxMessagesToQueuedBox() {
+        ContentValues values = new ContentValues(1);
+
+        values.put(Sms.TYPE, Sms.MESSAGE_TYPE_QUEUED);
+
+        int messageCount = SqliteWrapper.update(
+                getApplicationContext(), getContentResolver(), Outbox.CONTENT_URI,
+                values, "type = " + Sms.MESSAGE_TYPE_OUTBOX, null);
+        if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE) || LogTag.DEBUG_SEND) {
+            Log.v(TAG, "moveOutboxMessagesToQueuedBox messageCount: " + messageCount);
+        }
+        return messageCount;
+    }
+
+    /**
      * Move all messages that are in the outbox to the failed state and set them to unread.
      * @return The number of messages that were actually moved
      */