Merge "[MR1] MMS: Fix Verizon IOT 2.6.1 fail [patch3]" into ics-mr1
diff --git a/src/com/android/mms/transaction/RetryScheduler.java b/src/com/android/mms/transaction/RetryScheduler.java
index e0bba5c..5c5cc5c 100644
--- a/src/com/android/mms/transaction/RetryScheduler.java
+++ b/src/com/android/mms/transaction/RetryScheduler.java
@@ -134,30 +134,42 @@
                     boolean retry = true;
                     int respStatus = getResponseStatus(msgId);
                     int errorString = 0;
-                    switch (respStatus) {
-                        case PduHeaders.RESPONSE_STATUS_ERROR_SENDING_ADDRESS_UNRESOLVED:
-                            errorString = R.string.invalid_destination;
-                            break;
-
-                        case PduHeaders.RESPONSE_STATUS_ERROR_SERVICE_DENIED:
-                        case PduHeaders.RESPONSE_STATUS_ERROR_PERMANENT_SERVICE_DENIED:
-                            errorString = R.string.service_not_activated;
-                            break;
-
-                        case PduHeaders.RESPONSE_STATUS_ERROR_NETWORK_PROBLEM:
-                            errorString = R.string.service_network_problem;
-                            break;
-
-                        case PduHeaders.RESPONSE_STATUS_ERROR_TRANSIENT_MESSAGE_NOT_FOUND:
-                        case PduHeaders.RESPONSE_STATUS_ERROR_PERMANENT_MESSAGE_NOT_FOUND:
-                            errorString = R.string.service_message_not_found;
-                            break;
+                    if (!isRetryDownloading) {
+                        // Send Transaction case
+                        switch (respStatus) {
+                            case PduHeaders.RESPONSE_STATUS_ERROR_SENDING_ADDRESS_UNRESOLVED:
+                                errorString = R.string.invalid_destination;
+                                break;
+                            case PduHeaders.RESPONSE_STATUS_ERROR_SERVICE_DENIED:
+                            case PduHeaders.RESPONSE_STATUS_ERROR_PERMANENT_SERVICE_DENIED:
+                                errorString = R.string.service_not_activated;
+                                break;
+                            case PduHeaders.RESPONSE_STATUS_ERROR_NETWORK_PROBLEM:
+                                errorString = R.string.service_network_problem;
+                                break;
+                            case PduHeaders.RESPONSE_STATUS_ERROR_TRANSIENT_MESSAGE_NOT_FOUND:
+                            case PduHeaders.RESPONSE_STATUS_ERROR_PERMANENT_MESSAGE_NOT_FOUND:
+                                errorString = R.string.service_message_not_found;
+                                break;
+                        }
+                        if (errorString != 0) {
+                            DownloadManager.getInstance().showErrorCodeToast(errorString);
+                            retry = false;
+                        }
+                    } else {
+                        // apply R880 IOT issue (Conformance 11.6 Retrieve Invalid Message)
+                        // Notification Transaction case
+                        respStatus = getRetrieveStatus(msgId);
+                        if (respStatus ==
+                                PduHeaders.RESPONSE_STATUS_ERROR_PERMANENT_MESSAGE_NOT_FOUND) {
+                            DownloadManager.getInstance().showErrorCodeToast(
+                                    R.string.service_message_not_found);
+                            SqliteWrapper.delete(mContext, mContext.getContentResolver(), uri,
+                                    null, null);
+                            retry = false;
+                            return;
+                        }
                     }
-                    if (errorString != 0) {
-                        DownloadManager.getInstance().showErrorCodeToast(errorString);
-                        retry = false;
-                    }
-
                     if ((retryIndex < scheme.getRetryLimit()) && retry) {
                         long retryAt = current + scheme.getWaitingInterval();
 
@@ -243,6 +255,27 @@
         return respStatus;
     }
 
+    // apply R880 IOT issue (Conformance 11.6 Retrieve Invalid Message)
+    private int getRetrieveStatus(long msgID) {
+        int retrieveStatus = 0;
+        Cursor cursor = SqliteWrapper.query(mContext, mContentResolver,
+                Mms.Inbox.CONTENT_URI, null, Mms._ID + "=" + msgID, null, null);
+        try {
+            if (cursor.moveToFirst()) {
+                retrieveStatus = cursor.getInt(cursor.getColumnIndexOrThrow(
+                            Mms.RESPONSE_STATUS));
+            }
+        } finally {
+            cursor.close();
+        }
+        if (retrieveStatus != 0) {
+            if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {
+                Log.v(TAG, "Retrieve status is: " + retrieveStatus);
+            }
+        }
+        return retrieveStatus;
+    }
+
     public static void setRetryAlarm(Context context) {
         Cursor cursor = PduPersister.getPduPersister(context).getPendingMessages(
                 Long.MAX_VALUE);