Merge "Allow port and originating number to be specified for VVM SMS" into oc-dev
TreeHugger Robot [Thu, 30 Mar 2017 01:39:19 +0000 (01:39 +0000)]
1  2 
src/java/com/android/internal/telephony/VisualVoicemailSmsFilter.java

@@@ -29,11 -29,9 +29,12 @@@ import android.telephony.VisualVoicemai
  import android.util.ArrayMap;
  import android.util.Log;
  
+ import com.android.internal.annotations.VisibleForTesting;
  import com.android.internal.telephony.VisualVoicemailSmsParser.WrappedMessageData;
  
 +import java.nio.ByteBuffer;
 +import java.nio.charset.CharacterCodingException;
 +import java.nio.charset.CharsetDecoder;
  import java.nio.charset.StandardCharsets;
  import java.util.ArrayList;
  import java.util.List;
@@@ -170,30 -251,19 +254,33 @@@ public class VisualVoicemailSmsFilter 
       * @return the message body of the SMS, or {@code null} if it can not be parsed.
       */
      @Nullable
-     private static String getFullMessage(byte[][] pdus, String format) {
+     private static FullMessage getFullMessage(byte[][] pdus, String format) {
+         FullMessage result = new FullMessage();
          StringBuilder builder = new StringBuilder();
 +        CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
          for (byte pdu[] : pdus) {
              SmsMessage message = SmsMessage.createFromPdu(pdu, format);
              if (message == null) {
                  // The PDU is not recognized by android
                  return null;
              }
+             if (result.firstMessage == null) {
+                 result.firstMessage = message;
+             }
              String body = message.getMessageBody();
 +            if (body == null && message.getUserData() != null) {
 +                // Attempt to interpret the user data as UTF-8. UTF-8 string over data SMS using
 +                // 8BIT data coding scheme is our recommended way to send VVM SMS and is used in CTS
 +                // Tests. The OMTP visual voicemail specification does not specify the SMS type and
 +                // encoding.
 +                ByteBuffer byteBuffer = ByteBuffer.wrap(message.getUserData());
 +                try {
 +                    body = decoder.decode(byteBuffer).toString();
 +                } catch (CharacterCodingException e) {
 +                    // User data is not decode-able as UTF-8. Ignoring.
 +                    return null;
 +                }
 +            }
              if (body != null) {
                  builder.append(body);
              }