TP - Message reference for SMS SUBMIT type

Addition of the TP - Message reference in pdu for SMS-SUBMIT type
Test: Build
Bug: 228299168

Merged-In: I3a64b79478d16d730c921fbfdd050fc014eec7b5
Change-Id: I3a64b79478d16d730c921fbfdd050fc014eec7b5
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index 5ff9263..ac46be7 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -4803,6 +4803,13 @@
                 "phone_number_source_ims";
 
         /**
+         * TelephonyProvider column name for last used TP - message Reference
+         *
+         * @hide
+         */
+        public static final String COLUMN_TP_MESSAGE_REF = "tp_message_ref";
+
+        /**
          * TelephonyProvider column name for the device's preferred usage setting.
          *
          * @hide
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 13550f0..f373f6e 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -478,6 +478,14 @@
     public static final String SUBSCRIPTION_TYPE = SimInfo.COLUMN_SUBSCRIPTION_TYPE;
 
     /**
+     * TelephonyProvider column name for last used TP - message Reference
+     * <P>Type: INTEGER (int)</P> with -1 as default value
+     * TP - Message Reference valid range [0 - 255]
+     * @hide
+     */
+    public static final String TP_MESSAGE_REF = SimInfo.COLUMN_TP_MESSAGE_REF;
+
+    /**
      * TelephonyProvider column name data_enabled_override_rules.
      * It's a list of rules for overriding data enabled settings. The syntax is
      * For example, "mms=nonDefault" indicates enabling data for mms in non-default subscription.
diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
index b51e8d3d..7a5bf06 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
@@ -249,7 +249,6 @@
                 ENCODING_UNKNOWN, 0, 0);
     }
 
-
     /**
      * Gets an SMS-SUBMIT PDU for a destination address and a message using the specified encoding.
      *
@@ -272,7 +271,7 @@
             boolean statusReportRequested, byte[] header, int encoding,
             int languageTable, int languageShiftTable) {
         return getSubmitPdu(scAddress, destinationAddress, message, statusReportRequested,
-            header, encoding, languageTable, languageShiftTable, -1);
+            header, encoding, languageTable, languageShiftTable, -1, 0);
     }
 
     /**
@@ -297,6 +296,32 @@
             String destinationAddress, String message,
             boolean statusReportRequested, byte[] header, int encoding,
             int languageTable, int languageShiftTable, int validityPeriod) {
+        return getSubmitPdu(scAddress, destinationAddress, message, statusReportRequested, header,
+                encoding, languageTable, languageShiftTable, validityPeriod, 0);
+    }
+
+    /**
+     * Gets an SMS-SUBMIT PDU for a destination address and a message using the specified encoding.
+     *
+     * @param scAddress Service Centre address. Null means use default.
+     * @param destinationAddress the address of the destination for the message.
+     * @param message string representation of the message payload.
+     * @param statusReportRequested indicates whether a report is reuested for this message.
+     * @param header a byte array containing the data for the User Data Header.
+     * @param encoding encoding defined by constants in
+     *                 com.android.internal.telephony.SmsConstants.ENCODING_*
+     * @param languageTable
+     * @param languageShiftTable
+     * @param validityPeriod Validity Period of the message in Minutes.
+     * @param messageRef TP Message Reference number
+     * @return a <code>SubmitPdu</code> containing the encoded SC address if applicable and the
+     *         encoded message. Returns null on encode error.
+     * @hide
+     */
+    public static SubmitPdu getSubmitPdu(String scAddress,
+            String destinationAddress, String message,
+            boolean statusReportRequested, byte[] header, int encoding,
+            int languageTable, int languageShiftTable, int validityPeriod, int messageRef) {
 
         // Perform null parameter checks.
         if (message == null || destinationAddress == null) {
@@ -350,7 +375,7 @@
 
         ByteArrayOutputStream bo = getSubmitPduHead(
                 scAddress, destinationAddress, mtiByte,
-                statusReportRequested, ret);
+                statusReportRequested, ret, messageRef);
 
         // Skip encoding pdu if error occurs when create pdu head and the error will be handled
         // properly later on encodedMessage correctness check.
@@ -496,7 +521,7 @@
             String destinationAddress, String message,
             boolean statusReportRequested, int validityPeriod) {
         return getSubmitPdu(scAddress, destinationAddress, message, statusReportRequested,
-                null, ENCODING_UNKNOWN, 0, 0, validityPeriod);
+                null, ENCODING_UNKNOWN, 0, 0, validityPeriod, 0);
     }
 
     /**
@@ -507,12 +532,13 @@
      * @param destinationPort the port to deliver the message to at the destination.
      * @param data the data for the message.
      * @param statusReportRequested indicates whether a report is reuested for this message.
+     * @param messageRef TP Message Reference number
      * @return a <code>SubmitPdu</code> containing the encoded SC address if applicable and the
      *         encoded message. Returns null on encode error.
      */
     public static SubmitPdu getSubmitPdu(String scAddress,
             String destinationAddress, int destinationPort, byte[] data,
-            boolean statusReportRequested) {
+            boolean statusReportRequested, int messageRef) {
 
         SmsHeader.PortAddrs portAddrs = new SmsHeader.PortAddrs();
         portAddrs.destPort = destinationPort;
@@ -533,7 +559,7 @@
         SubmitPdu ret = new SubmitPdu();
         ByteArrayOutputStream bo = getSubmitPduHead(
                 scAddress, destinationAddress, (byte) 0x41, /* TP-MTI=SMS-SUBMIT, TP-UDHI=true */
-                statusReportRequested, ret);
+                statusReportRequested, ret, messageRef);
         // Skip encoding pdu if error occurs when create pdu head and the error will be handled
         // properly later on encodedMessage correctness check.
         if (bo == null) return ret;
@@ -559,6 +585,24 @@
     }
 
     /**
+     * Gets an SMS-SUBMIT PDU for a data message to a destination address &amp; port.
+     *
+     * @param scAddress Service Centre address. Null means use default.
+     * @param destinationAddress the address of the destination for the message.
+     * @param destinationPort the port to deliver the message to at the destination.
+     * @param data the data for the message.
+     * @param statusReportRequested indicates whether a report is reuested for this message.
+     * @return a <code>SubmitPdu</code> containing the encoded SC address if applicable and the
+     *         encoded message. Returns null on encode error.
+     */
+    public static SubmitPdu getSubmitPdu(String scAddress,
+            String destinationAddress, int destinationPort, byte[] data,
+            boolean statusReportRequested) {
+        return getSubmitPdu(scAddress, destinationAddress, destinationPort, data,
+                statusReportRequested, 0);
+    }
+
+    /**
      * Creates the beginning of a SUBMIT PDU.
      *
      * This is the part of the SUBMIT PDU that is common to the two versions of
@@ -576,6 +620,28 @@
     private static ByteArrayOutputStream getSubmitPduHead(
             String scAddress, String destinationAddress, byte mtiByte,
             boolean statusReportRequested, SubmitPdu ret) {
+        return getSubmitPduHead(scAddress, destinationAddress, mtiByte, statusReportRequested, ret,
+                0);
+    }
+
+    /**
+     * Creates the beginning of a SUBMIT PDU.
+     *
+     * This is the part of the SUBMIT PDU that is common to the two versions of
+     * {@link #getSubmitPdu}, one of which takes a byte array and the other of which takes a
+     * <code>String</code>.
+     *
+     * @param scAddress Service Centre address. Null means use default.
+     * @param destinationAddress the address of the destination for the message.
+     * @param mtiByte
+     * @param statusReportRequested indicates whether a report is reuested for this message.
+     * @param ret <code>SubmitPdu</code>.
+     * @param messageRef TP Message Reference number
+     * @return a byte array of the beginning of a SUBMIT PDU. Null for invalid destinationAddress.
+     */
+    private static ByteArrayOutputStream getSubmitPduHead(
+            String scAddress, String destinationAddress, byte mtiByte,
+            boolean statusReportRequested, SubmitPdu ret, int messageRef) {
         ByteArrayOutputStream bo = new ByteArrayOutputStream(
                 MAX_USER_DATA_BYTES + 40);
 
@@ -596,7 +662,7 @@
         bo.write(mtiByte);
 
         // space for TP-Message-Reference
-        bo.write(0);
+        bo.write(messageRef);
 
         byte[] daBytes;