From c84401fb8b3ed90039bd132b343852303ef88ce6 Mon Sep 17 00:00:00 2001 From: yong liu Date: Mon, 13 Jul 2009 14:08:16 -0500 Subject: [PATCH] CDMA Message Waiting Indication support Add support for Message Waiting Info Record defined in 3GPP2 C.S-0005 and used for voice mail count by some CDMA networks --- .../internal/telephony/cdma/CdmaSMSDispatcher.java | 7 ++++--- .../android/internal/telephony/cdma/SmsMessage.java | 13 +++++++++++++ .../internal/telephony/cdma/sms/SmsEnvelope.java | 8 ++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java index c4db6098fd07c..3ab1f7769facb 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java @@ -88,7 +88,7 @@ final class CdmaSMSDispatcher extends SMSDispatcher { int teleService = sms.getTeleService(); boolean handled = false; - if (sms.getUserData() == null) { + if ((sms.getUserData() == null) && (SmsEnvelope.TELESERVICE_MWI != teleService)) { if (Config.LOGD) { Log.d(TAG, "Received SMS without user data"); } @@ -99,10 +99,11 @@ final class CdmaSMSDispatcher extends SMSDispatcher { return Intents.RESULT_SMS_HANDLED; } - if (SmsEnvelope.TELESERVICE_WAP == teleService){ + if (SmsEnvelope.TELESERVICE_WAP == teleService) { return processCdmaWapPdu(sms.getUserData(), sms.messageRef, sms.getOriginatingAddress()); - } else if (SmsEnvelope.TELESERVICE_VMN == teleService) { + } else if ((SmsEnvelope.TELESERVICE_VMN == teleService) || + (SmsEnvelope.TELESERVICE_MWI == teleService)) { // handling Voicemail int voicemailCount = sms.getNumOfVoicemails(); Log.d(TAG, "Voicemail count=" + voicemailCount); diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java index 30adc524737ff..9c043057498cd 100755 --- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java @@ -527,6 +527,19 @@ public class SmsMessage extends SmsMessageBase { * Parses a SMS message from its BearerData stream. (mobile-terminated only) */ protected void parseSms() { + // Message Waiting Info Record defined in 3GPP2 C.S-0005, 3.7.5.6 + // It contains only an 8-bit number with the number of messages waiting + if (mEnvelope.teleService == SmsEnvelope.TELESERVICE_MWI) { + mBearerData = new BearerData(); + if (mEnvelope.bearerData != null) { + mBearerData.numberOfMessages = 0x000000FF & mEnvelope.bearerData[0]; + } + if (Config.DEBUG) { + Log.d(LOG_TAG, "parseSms: get MWI " + + Integer.toString(mBearerData.numberOfMessages)); + } + return; + } mBearerData = BearerData.decode(mEnvelope.bearerData); messageRef = mBearerData.messageId; if (mBearerData.userData != null) { diff --git a/telephony/java/com/android/internal/telephony/cdma/sms/SmsEnvelope.java b/telephony/java/com/android/internal/telephony/cdma/sms/SmsEnvelope.java index f80e8c091b7d1..0dcacc104070e 100644 --- a/telephony/java/com/android/internal/telephony/cdma/sms/SmsEnvelope.java +++ b/telephony/java/com/android/internal/telephony/cdma/sms/SmsEnvelope.java @@ -36,6 +36,14 @@ public final class SmsEnvelope{ static public final int TELESERVICE_WAP = 0x1004; static public final int TELESERVICE_WEMT = 0x1005; + /** + * The following are defined as extensions to the standard teleservices + */ + // Voice mail notification through Message Waiting Indication in CDMA mode or Analog mode. + // Defined in 3GPP2 C.S-0005, 3.7.5.6, an Info Record containing an 8-bit number with the + // number of messages waiting, it's used by some CDMA carriers for a voice mail count. + static public final int TELESERVICE_MWI = 0x40000; + // ServiceCategories for Cell Broadcast, see 3GPP2 C.R1001 table 9.3.1-1 //static public final int SERVICECATEGORY_EMERGENCY = 0x0010; //...