Loading src/java/com/android/internal/telephony/SmsHeader.java +26 −1 Original line number Diff line number Diff line Loading @@ -84,9 +84,14 @@ public class SmsHeader { public boolean isEightBits; } public static class SpecialSmsMsg { public int msgIndType; public int msgCount; } /** * A header element that is not explicitly parsed, meaning not * PortAddrs or ConcatRef. * PortAddrs or ConcatRef or SpecialSmsMsg. */ public static class MiscElt { public int id; Loading @@ -95,6 +100,7 @@ public class SmsHeader { public PortAddrs portAddrs; public ConcatRef concatRef; public ArrayList<SpecialSmsMsg> specialSmsMsgList = new ArrayList<SpecialSmsMsg>(); public ArrayList<MiscElt> miscEltList = new ArrayList<MiscElt>(); /** 7 bit national language locking shift table, or 0 for GSM default 7 bit alphabet. */ Loading Loading @@ -170,6 +176,12 @@ public class SmsHeader { case ELT_ID_NATIONAL_LANGUAGE_LOCKING_SHIFT: smsHeader.languageTable = inStream.read(); break; case ELT_ID_SPECIAL_SMS_MESSAGE_INDICATION: SpecialSmsMsg specialSmsMsg = new SpecialSmsMsg(); specialSmsMsg.msgIndType = inStream.read(); specialSmsMsg.msgCount = inStream.read(); smsHeader.specialSmsMsgList.add(specialSmsMsg); break; default: MiscElt miscElt = new MiscElt(); miscElt.id = id; Loading @@ -189,6 +201,7 @@ public class SmsHeader { public static byte[] toByteArray(SmsHeader smsHeader) { if ((smsHeader.portAddrs == null) && (smsHeader.concatRef == null) && (smsHeader.specialSmsMsgList.isEmpty()) && (smsHeader.miscEltList.isEmpty()) && (smsHeader.languageShiftTable == 0) && (smsHeader.languageTable == 0)) { Loading Loading @@ -238,6 +251,12 @@ public class SmsHeader { outStream.write(1); outStream.write(smsHeader.languageTable); } for (SpecialSmsMsg specialSmsMsg : smsHeader.specialSmsMsgList) { outStream.write(ELT_ID_SPECIAL_SMS_MESSAGE_INDICATION); outStream.write(2); outStream.write(specialSmsMsg.msgIndType & 0xFF); outStream.write(specialSmsMsg.msgCount & 0xFF); } for (MiscElt miscElt : smsHeader.miscEltList) { outStream.write(miscElt.id); outStream.write(miscElt.data.length); Loading Loading @@ -275,6 +294,12 @@ public class SmsHeader { if (languageTable != 0) { builder.append(", languageTable=" + languageTable); } for (SpecialSmsMsg specialSmsMsg : specialSmsMsgList) { builder.append(", SpecialSmsMsg "); builder.append("{ msgIndType=" + specialSmsMsg.msgIndType); builder.append(", msgCount=" + specialSmsMsg.msgCount); builder.append(" }"); } for (MiscElt miscElt : miscEltList) { builder.append(", MiscElt "); builder.append("{ id=" + miscElt.id); Loading src/java/com/android/internal/telephony/gsm/SmsMessage.java +87 −5 Original line number Diff line number Diff line Loading @@ -85,6 +85,8 @@ public class SmsMessage extends SmsMessageBase { */ private boolean mIsStatusReportMessage = false; private int mVoiceMailCount = 0; public static class SubmitPdu extends SubmitPduBase { } Loading Loading @@ -1164,17 +1166,28 @@ public class SmsMessage extends SmsMessageBase { userDataCompressed = false; boolean active = ((mDataCodingScheme & 0x08) == 0x08); // bit 0x04 reserved // VM - If TP-UDH is present, these values will be overwritten if ((mDataCodingScheme & 0x03) == 0x00) { mIsMwi = true; mMwiSense = active; mIsMwi = true; /* Indicates vmail */ mMwiSense = active;/* Indicates vmail notification set/clear */ mMwiDontStore = ((mDataCodingScheme & 0xF0) == 0xC0); /* Set voice mail count based on notification bit */ if (active == true) { mVoiceMailCount = -1; // unknown number of messages waiting } else { mIsMwi = false; mVoiceMailCount = 0; // no unread messages } Rlog.w(LOG_TAG, "MWI in DCS for Vmail. DCS = " + (mDataCodingScheme & 0xff) + " Dont store = " + mMwiDontStore + " vmail count = " + mVoiceMailCount); Rlog.w(LOG_TAG, "MWI for fax, email, or other " } else { mIsMwi = false; Rlog.w(LOG_TAG, "MWI in DCS for fax/email/other: " + (mDataCodingScheme & 0xff)); } } else if ((mDataCodingScheme & 0xC0) == 0x80) { Loading @@ -1198,6 +1211,75 @@ public class SmsMessage extends SmsMessageBase { this.mUserData = p.getUserData(); this.mUserDataHeader = p.getUserDataHeader(); /* * Look for voice mail indication in TP_UDH TS23.040 9.2.3.24 * ieid = 1 (0x1) (SPECIAL_SMS_MSG_IND) * ieidl =2 octets * ieda msg_ind_type = 0x00 (voice mail; discard sms )or * = 0x80 (voice mail; store sms) * msg_count = 0x00 ..0xFF */ if (hasUserDataHeader && (mUserDataHeader.specialSmsMsgList.size() != 0)) { for (SmsHeader.SpecialSmsMsg msg : mUserDataHeader.specialSmsMsgList) { int msgInd = msg.msgIndType & 0xff; /* * TS 23.040 V6.8.1 Sec 9.2.3.24.2 * bits 1 0 : basic message indication type * bits 4 3 2 : extended message indication type * bits 6 5 : Profile id bit 7 storage type */ if ((msgInd == 0) || (msgInd == 0x80)) { mIsMwi = true; if (msgInd == 0x80) { /* Store message because TP_UDH indicates so*/ mMwiDontStore = false; } else if (mMwiDontStore == false) { /* Storage bit is not set by TP_UDH * Check for conflict * between message storage bit in TP_UDH * & DCS. The message shall be stored if either of * the one indicates so. * TS 23.040 V6.8.1 Sec 9.2.3.24.2 */ if (!((((mDataCodingScheme & 0xF0) == 0xD0) || ((mDataCodingScheme & 0xF0) == 0xE0)) && ((mDataCodingScheme & 0x03) == 0x00))) { /* Even DCS did not have voice mail with Storage bit * 3GPP TS 23.038 V7.0.0 section 4 * So clear this flag*/ mMwiDontStore = true; } } mVoiceMailCount = msg.msgCount & 0xff; /* * In the event of a conflict between message count setting * and DCS then the Message Count in the TP-UDH shall * override the indication in the TP-DCS. Set voice mail * notification based on count in TP-UDH */ if (mVoiceMailCount > 0) mMwiSense = true; else mMwiSense = false; Rlog.w(LOG_TAG, "MWI in TP-UDH for Vmail. Msg Ind = " + msgInd + " Dont store = " + mMwiDontStore + " Vmail count = " + mVoiceMailCount); /* * There can be only one IE for each type of message * indication in TP_UDH. In the event they are duplicated * last occurence will be used. Hence the for loop */ } else { Rlog.w(LOG_TAG, "TP_UDH fax/email/" + "extended msg/multisubscriber profile. Msg Ind = " + msgInd); } } // end of for } // end of if UDH switch (encodingType) { case ENCODING_UNKNOWN: mMessageBody = null; Loading Loading
src/java/com/android/internal/telephony/SmsHeader.java +26 −1 Original line number Diff line number Diff line Loading @@ -84,9 +84,14 @@ public class SmsHeader { public boolean isEightBits; } public static class SpecialSmsMsg { public int msgIndType; public int msgCount; } /** * A header element that is not explicitly parsed, meaning not * PortAddrs or ConcatRef. * PortAddrs or ConcatRef or SpecialSmsMsg. */ public static class MiscElt { public int id; Loading @@ -95,6 +100,7 @@ public class SmsHeader { public PortAddrs portAddrs; public ConcatRef concatRef; public ArrayList<SpecialSmsMsg> specialSmsMsgList = new ArrayList<SpecialSmsMsg>(); public ArrayList<MiscElt> miscEltList = new ArrayList<MiscElt>(); /** 7 bit national language locking shift table, or 0 for GSM default 7 bit alphabet. */ Loading Loading @@ -170,6 +176,12 @@ public class SmsHeader { case ELT_ID_NATIONAL_LANGUAGE_LOCKING_SHIFT: smsHeader.languageTable = inStream.read(); break; case ELT_ID_SPECIAL_SMS_MESSAGE_INDICATION: SpecialSmsMsg specialSmsMsg = new SpecialSmsMsg(); specialSmsMsg.msgIndType = inStream.read(); specialSmsMsg.msgCount = inStream.read(); smsHeader.specialSmsMsgList.add(specialSmsMsg); break; default: MiscElt miscElt = new MiscElt(); miscElt.id = id; Loading @@ -189,6 +201,7 @@ public class SmsHeader { public static byte[] toByteArray(SmsHeader smsHeader) { if ((smsHeader.portAddrs == null) && (smsHeader.concatRef == null) && (smsHeader.specialSmsMsgList.isEmpty()) && (smsHeader.miscEltList.isEmpty()) && (smsHeader.languageShiftTable == 0) && (smsHeader.languageTable == 0)) { Loading Loading @@ -238,6 +251,12 @@ public class SmsHeader { outStream.write(1); outStream.write(smsHeader.languageTable); } for (SpecialSmsMsg specialSmsMsg : smsHeader.specialSmsMsgList) { outStream.write(ELT_ID_SPECIAL_SMS_MESSAGE_INDICATION); outStream.write(2); outStream.write(specialSmsMsg.msgIndType & 0xFF); outStream.write(specialSmsMsg.msgCount & 0xFF); } for (MiscElt miscElt : smsHeader.miscEltList) { outStream.write(miscElt.id); outStream.write(miscElt.data.length); Loading Loading @@ -275,6 +294,12 @@ public class SmsHeader { if (languageTable != 0) { builder.append(", languageTable=" + languageTable); } for (SpecialSmsMsg specialSmsMsg : specialSmsMsgList) { builder.append(", SpecialSmsMsg "); builder.append("{ msgIndType=" + specialSmsMsg.msgIndType); builder.append(", msgCount=" + specialSmsMsg.msgCount); builder.append(" }"); } for (MiscElt miscElt : miscEltList) { builder.append(", MiscElt "); builder.append("{ id=" + miscElt.id); Loading
src/java/com/android/internal/telephony/gsm/SmsMessage.java +87 −5 Original line number Diff line number Diff line Loading @@ -85,6 +85,8 @@ public class SmsMessage extends SmsMessageBase { */ private boolean mIsStatusReportMessage = false; private int mVoiceMailCount = 0; public static class SubmitPdu extends SubmitPduBase { } Loading Loading @@ -1164,17 +1166,28 @@ public class SmsMessage extends SmsMessageBase { userDataCompressed = false; boolean active = ((mDataCodingScheme & 0x08) == 0x08); // bit 0x04 reserved // VM - If TP-UDH is present, these values will be overwritten if ((mDataCodingScheme & 0x03) == 0x00) { mIsMwi = true; mMwiSense = active; mIsMwi = true; /* Indicates vmail */ mMwiSense = active;/* Indicates vmail notification set/clear */ mMwiDontStore = ((mDataCodingScheme & 0xF0) == 0xC0); /* Set voice mail count based on notification bit */ if (active == true) { mVoiceMailCount = -1; // unknown number of messages waiting } else { mIsMwi = false; mVoiceMailCount = 0; // no unread messages } Rlog.w(LOG_TAG, "MWI in DCS for Vmail. DCS = " + (mDataCodingScheme & 0xff) + " Dont store = " + mMwiDontStore + " vmail count = " + mVoiceMailCount); Rlog.w(LOG_TAG, "MWI for fax, email, or other " } else { mIsMwi = false; Rlog.w(LOG_TAG, "MWI in DCS for fax/email/other: " + (mDataCodingScheme & 0xff)); } } else if ((mDataCodingScheme & 0xC0) == 0x80) { Loading @@ -1198,6 +1211,75 @@ public class SmsMessage extends SmsMessageBase { this.mUserData = p.getUserData(); this.mUserDataHeader = p.getUserDataHeader(); /* * Look for voice mail indication in TP_UDH TS23.040 9.2.3.24 * ieid = 1 (0x1) (SPECIAL_SMS_MSG_IND) * ieidl =2 octets * ieda msg_ind_type = 0x00 (voice mail; discard sms )or * = 0x80 (voice mail; store sms) * msg_count = 0x00 ..0xFF */ if (hasUserDataHeader && (mUserDataHeader.specialSmsMsgList.size() != 0)) { for (SmsHeader.SpecialSmsMsg msg : mUserDataHeader.specialSmsMsgList) { int msgInd = msg.msgIndType & 0xff; /* * TS 23.040 V6.8.1 Sec 9.2.3.24.2 * bits 1 0 : basic message indication type * bits 4 3 2 : extended message indication type * bits 6 5 : Profile id bit 7 storage type */ if ((msgInd == 0) || (msgInd == 0x80)) { mIsMwi = true; if (msgInd == 0x80) { /* Store message because TP_UDH indicates so*/ mMwiDontStore = false; } else if (mMwiDontStore == false) { /* Storage bit is not set by TP_UDH * Check for conflict * between message storage bit in TP_UDH * & DCS. The message shall be stored if either of * the one indicates so. * TS 23.040 V6.8.1 Sec 9.2.3.24.2 */ if (!((((mDataCodingScheme & 0xF0) == 0xD0) || ((mDataCodingScheme & 0xF0) == 0xE0)) && ((mDataCodingScheme & 0x03) == 0x00))) { /* Even DCS did not have voice mail with Storage bit * 3GPP TS 23.038 V7.0.0 section 4 * So clear this flag*/ mMwiDontStore = true; } } mVoiceMailCount = msg.msgCount & 0xff; /* * In the event of a conflict between message count setting * and DCS then the Message Count in the TP-UDH shall * override the indication in the TP-DCS. Set voice mail * notification based on count in TP-UDH */ if (mVoiceMailCount > 0) mMwiSense = true; else mMwiSense = false; Rlog.w(LOG_TAG, "MWI in TP-UDH for Vmail. Msg Ind = " + msgInd + " Dont store = " + mMwiDontStore + " Vmail count = " + mVoiceMailCount); /* * There can be only one IE for each type of message * indication in TP_UDH. In the event they are duplicated * last occurence will be used. Hence the for loop */ } else { Rlog.w(LOG_TAG, "TP_UDH fax/email/" + "extended msg/multisubscriber profile. Msg Ind = " + msgInd); } } // end of for } // end of if UDH switch (encodingType) { case ENCODING_UNKNOWN: mMessageBody = null; Loading