Merge change 25535 into eclair

* changes:
  CDMA Check for network duplicate sms
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
index 386dc3d46..730dc49 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
@@ -48,6 +48,7 @@
 
 import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.lang.Boolean;
 
@@ -57,6 +58,9 @@
 
     private CDMAPhone mCdmaPhone;
 
+    private byte[] mLastDispatchedSmsFingerprint;
+    private byte[] mLastAcknowledgedSmsFingerprint;
+
     CdmaSMSDispatcher(CDMAPhone phone) {
         super(phone);
         mCdmaPhone = phone;
@@ -104,8 +108,14 @@
             return Intents.RESULT_SMS_GENERIC_ERROR;
         }
 
-        // Decode BD stream and set sms variables.
+        // See if we have a network duplicate SMS.
         SmsMessage sms = (SmsMessage) smsb;
+        mLastDispatchedSmsFingerprint = sms.getIncomingSmsFingerprint();
+        if (mLastAcknowledgedSmsFingerprint != null &&
+                Arrays.equals(mLastDispatchedSmsFingerprint, mLastAcknowledgedSmsFingerprint)) {
+            return Intents.RESULT_SMS_HANDLED;
+        }
+        // Decode BD stream and set sms variables.
         sms.parseSms();
         int teleService = sms.getTeleService();
         boolean handled = false;
@@ -433,7 +443,13 @@
         }
 
         if (mCm != null) {
-            mCm.acknowledgeLastIncomingCdmaSms(success, resultToCause(result), response);
+            int causeCode = resultToCause(result);
+            mCm.acknowledgeLastIncomingCdmaSms(success, causeCode, response);
+
+            if (causeCode == 0) {
+                mLastAcknowledgedSmsFingerprint = mLastDispatchedSmsFingerprint;
+            }
+            mLastDispatchedSmsFingerprint = null;
         }
     }
 
diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
index 266d127..3e491d1 100755
--- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
+++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
@@ -794,5 +794,20 @@
         return mBearerData.numberOfMessages;
     }
 
+    /**
+     * Returns a byte array that can be use to uniquely identify a received SMS message.
+     * C.S0015-B  4.3.1.6 Unique Message Identification.
+     *
+     * @return byte array uniquely identifying the message.
+     * @hide
+     */
+    /* package */ byte[] getIncomingSmsFingerprint() {
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
 
+        output.write(mEnvelope.teleService);
+        output.write(mEnvelope.origAddress.origBytes, 0, mEnvelope.origAddress.origBytes.length);
+        output.write(mEnvelope.bearerData, 0, mEnvelope.bearerData.length);
+
+        return output.toByteArray();
+    }
 }