Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc499d94 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "Telephony: Add 7bit Ascii support for long message"

parents 1612756a dab6f6a2
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.app.Activity;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.Intent;
import android.content.Context;
import android.os.Message;
import android.os.SystemProperties;
import android.provider.Telephony.Sms;
@@ -152,6 +153,13 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
        uData.userDataHeader = smsHeader;
        if (encoding == SmsConstants.ENCODING_7BIT) {
            uData.msgEncoding = UserData.ENCODING_GSM_7BIT_ALPHABET;
            Context context = mPhone.getContext();
            boolean ascii7bitForLongMsg = context.getResources().
                getBoolean(com.android.internal.R.bool.config_ascii_7bit_support_for_long_message);
            if (ascii7bitForLongMsg) {
                Rlog.d(TAG, "ascii7bitForLongMsg = " + ascii7bitForLongMsg);
                uData.msgEncoding = UserData.ENCODING_7BIT_ASCII;
            }
        } else { // assume UTF-16
            uData.msgEncoding = UserData.ENCODING_UNICODE_16;
        }
+9 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

package com.android.internal.telephony.cdma;

import android.content.Context;
import android.os.Parcel;
import android.os.SystemProperties;
import android.telephony.PhoneNumberUtils;
@@ -28,6 +29,7 @@ import android.telephony.Rlog;
import android.util.Log;

import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SmsConstants;
import com.android.internal.telephony.SmsHeader;
import com.android.internal.telephony.SmsMessageBase;
@@ -922,6 +924,13 @@ public class SmsMessage extends SmsMessageBase {
        int teleservice = bearerData.hasUserDataHeader ?
                SmsEnvelope.TELESERVICE_WEMT : SmsEnvelope.TELESERVICE_WMT;

        Context context = PhoneFactory.getContext();
        boolean ascii7bitForLongMsg = context.getResources().
            getBoolean(com.android.internal.R.bool.config_ascii_7bit_support_for_long_message);
        if (ascii7bitForLongMsg) {
            Rlog.d(LOG_TAG, "ascii7bitForLongMsg = " + ascii7bitForLongMsg);
            teleservice = SmsEnvelope.TELESERVICE_WMT;
        }
        SmsEnvelope envelope = new SmsEnvelope();
        envelope.messageType = SmsEnvelope.MESSAGE_TYPE_POINT_TO_POINT;
        envelope.teleService = teleservice;
+41 −0
Original line number Diff line number Diff line
@@ -604,6 +604,45 @@ public final class BearerData {
        System.arraycopy(payload, 0, uData.payload, udhBytes, payload.length);
    }

    private static void encode7bitAsciiEms(UserData uData, byte[] udhData, boolean force)
            throws CodingException
    {
        try {
            Rlog.d(LOG_TAG, "encode7bitAsciiEms");
            int udhBytes = udhData.length + 1;  // Add length octet.
            int udhSeptets = ((udhBytes * 8) + 6) / 7;
            int paddingBits = (udhSeptets * 7) - (udhBytes * 8);
            String msg = uData.payloadStr;
            byte[] payload ;
            int msgLen = msg.length();
            BitwiseOutputStream outStream = new BitwiseOutputStream(msgLen +
                    (paddingBits > 0 ? 1 : 0));
            outStream.write(paddingBits, 0);
            for (int i = 0; i < msgLen; i++) {
                int charCode = UserData.charToAscii.get(msg.charAt(i), -1);
                if (charCode == -1) {
                    if (force) {
                        outStream.write(7, UserData.UNENCODABLE_7_BIT_CHAR);
                    } else {
                        throw new CodingException("cannot ASCII encode (" + msg.charAt(i) + ")");
                    }
                } else {
                    outStream.write(7, charCode);
                }
            }
            payload = outStream.toByteArray();
            uData.msgEncoding = UserData.ENCODING_7BIT_ASCII;
            uData.msgEncodingSet = true;
            uData.numFields = udhSeptets + uData.payloadStr.length();
            uData.payload = new byte[udhBytes + payload.length];
            uData.payload[0] = (byte)udhData.length;
            System.arraycopy(udhData, 0, uData.payload, 1, udhData.length);
            System.arraycopy(payload, 0, uData.payload, udhBytes, payload.length);
        } catch (BitwiseOutputStream.AccessException ex) {
            throw new CodingException("7bit ASCII encode failed: " + ex);
        }
    }

    private static void encodeEmsUserDataPayload(UserData uData)
        throws CodingException
    {
@@ -613,6 +652,8 @@ public final class BearerData {
                encode7bitEms(uData, headerData, true);
            } else if (uData.msgEncoding == UserData.ENCODING_UNICODE_16) {
                encode16bitEms(uData, headerData);
            } else if (uData.msgEncoding == UserData.ENCODING_7BIT_ASCII) {
                encode7bitAsciiEms(uData, headerData, true);
            } else {
                throw new CodingException("unsupported EMS user data encoding (" +
                                          uData.msgEncoding + ")");