10d4bcdf379842af4b6304809156971e926f374f0Jake Hamby/* 20d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Copyright (C) 2013 The Android Open Source Project 30d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 40d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); 50d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * you may not use this file except in compliance with the License. 60d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * You may obtain a copy of the License at 70d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 80d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * http://www.apache.org/licenses/LICENSE-2.0 90d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 100d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Unless required by applicable law or agreed to in writing, software 110d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS, 120d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * See the License for the specific language governing permissions and 140d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * limitations under the License. 150d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 160d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 170d4bcdf379842af4b6304809156971e926f374f0Jake Hambypackage com.android.internal.telephony.gsm; 180d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 190d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.app.Activity; 200d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.content.Context; 210d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.os.Message; 220d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.provider.Telephony.Sms.Intents; 230d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 240d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.CommandsInterface; 250d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.InboundSmsHandler; 260d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.PhoneBase; 270d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.SmsConstants; 280d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.SmsMessageBase; 290d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.SmsStorageMonitor; 3026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowaimport com.android.internal.telephony.uicc.IccRecords; 3126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowaimport com.android.internal.telephony.uicc.UiccController; 320d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.uicc.UsimServiceTable; 330d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 340d4bcdf379842af4b6304809156971e926f374f0Jake Hamby/** 350d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * This class broadcasts incoming SMS messages to interested apps after storing them in 360d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * the SmsProvider "raw" table and ACKing them to the SMSC. After each message has been 370d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 380d4bcdf379842af4b6304809156971e926f374f0Jake Hambypublic class GsmInboundSmsHandler extends InboundSmsHandler { 390d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 400d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** Handler for SMS-PP data download messages to UICC. */ 410d4bcdf379842af4b6304809156971e926f374f0Jake Hamby private final UsimDataDownloadHandler mDataDownloadHandler; 420d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 430d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 440d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Create a new GSM inbound SMS handler. 450d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 460d4bcdf379842af4b6304809156971e926f374f0Jake Hamby private GsmInboundSmsHandler(Context context, SmsStorageMonitor storageMonitor, 470d4bcdf379842af4b6304809156971e926f374f0Jake Hamby PhoneBase phone) { 48d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville super("GsmInboundSmsHandler", context, storageMonitor, phone, 49d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville GsmCellBroadcastHandler.makeGsmCellBroadcastHandler(context, phone)); 500d4bcdf379842af4b6304809156971e926f374f0Jake Hamby phone.mCi.setOnNewGsmSms(getHandler(), EVENT_NEW_SMS, null); 510d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mDataDownloadHandler = new UsimDataDownloadHandler(phone.mCi); 520d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 530d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 540d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 550d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Unregister for GSM SMS. 560d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 570d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 580d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected void onQuitting() { 590d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mPhone.mCi.unSetOnNewGsmSms(getHandler()); 60d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville mCellBroadcastHandler.dispose(); 610d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 620d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (DBG) log("unregistered for 3GPP SMS"); 630d4bcdf379842af4b6304809156971e926f374f0Jake Hamby super.onQuitting(); // release wakelock 640d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 650d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 660d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 670d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Wait for state machine to enter startup state. We can't send any messages until then. 680d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 690d4bcdf379842af4b6304809156971e926f374f0Jake Hamby public static GsmInboundSmsHandler makeInboundSmsHandler(Context context, 700d4bcdf379842af4b6304809156971e926f374f0Jake Hamby SmsStorageMonitor storageMonitor, PhoneBase phone) { 710d4bcdf379842af4b6304809156971e926f374f0Jake Hamby GsmInboundSmsHandler handler = new GsmInboundSmsHandler(context, storageMonitor, phone); 720d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handler.start(); 730d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return handler; 740d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 750d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 760d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 770d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Return true if this handler is for 3GPP2 messages; false for 3GPP format. 780d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return false (3GPP) 790d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 800d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 810d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected boolean is3gpp2() { 820d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return false; 830d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 840d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 850d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 860d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Handle type zero, SMS-PP data download, and 3GPP/CPHS MWI type SMS. Normal SMS messages 870d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * are handled by {@link #dispatchNormalMessage} in parent class. 880d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 890d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param smsb the SmsMessageBase object from the RIL 900d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return a result code from {@link android.provider.Telephony.Sms.Intents}, 910d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * or {@link Activity#RESULT_OK} for delayed acknowledgment to SMSC 920d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 930d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 940d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected int dispatchMessageRadioSpecific(SmsMessageBase smsb) { 950d4bcdf379842af4b6304809156971e926f374f0Jake Hamby SmsMessage sms = (SmsMessage) smsb; 960d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 970d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (sms.isTypeZero()) { 980d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // As per 3GPP TS 23.040 9.2.3.9, Type Zero messages should not be 990d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // Displayed/Stored/Notified. They should only be acknowledged. 1000d4bcdf379842af4b6304809156971e926f374f0Jake Hamby log("Received short message type 0, Don't display or store it. Send Ack"); 1010d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return Intents.RESULT_SMS_HANDLED; 1020d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1030d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1040d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // Send SMS-PP data download messages to UICC. See 3GPP TS 31.111 section 7.1.1. 1050d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (sms.isUsimDataDownload()) { 1060d4bcdf379842af4b6304809156971e926f374f0Jake Hamby UsimServiceTable ust = mPhone.getUsimServiceTable(); 1070d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return mDataDownloadHandler.handleUsimDataDownload(ust, sms); 1080d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1090d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1100d4bcdf379842af4b6304809156971e926f374f0Jake Hamby boolean handled = false; 1110d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (sms.isMWISetMessage()) { 11226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa updateMessageWaitingIndicator(sms.getNumOfVoicemails()); 1130d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handled = sms.isMwiDontStore(); 1140d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (DBG) log("Received voice mail indicator set SMS shouldStore=" + !handled); 1150d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } else if (sms.isMWIClearMessage()) { 11626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa updateMessageWaitingIndicator(0); 1170d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handled = sms.isMwiDontStore(); 1180d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (DBG) log("Received voice mail indicator clear SMS shouldStore=" + !handled); 1190d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1200d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (handled) { 1210d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return Intents.RESULT_SMS_HANDLED; 1220d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1230d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1240d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (!mStorageMonitor.isStorageAvailable() && 1250d4bcdf379842af4b6304809156971e926f374f0Jake Hamby sms.getMessageClass() != SmsConstants.MessageClass.CLASS_0) { 1260d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // It's a storable message and there's no storage available. Bail. 1270d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // (See TS 23.038 for a description of class 0 messages.) 1280d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return Intents.RESULT_SMS_OUT_OF_MEMORY; 1290d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1300d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1310d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return dispatchNormalMessage(smsb); 1320d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1330d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 13426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa /* package */ void updateMessageWaitingIndicator(int voicemailCount) { 13526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // range check 13626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa if (voicemailCount < 0) { 13726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa voicemailCount = -1; 13826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } else if (voicemailCount > 0xff) { 13926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // TS 23.040 9.2.3.24.2 14026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // "The value 255 shall be taken to mean 255 or greater" 14126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa voicemailCount = 0xff; 14226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } 14326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // update voice mail count in GsmPhone 14426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa mPhone.setVoiceMessageCount(voicemailCount); 14526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // store voice mail count in SIM & shared preferences 14626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa IccRecords records = UiccController.getInstance().getIccRecords( 14726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa mPhone.getPhoneId(), UiccController.APP_FAM_3GPP); 14826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa if (records != null) { 14926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa log("updateMessageWaitingIndicator: updating SIM Records"); 15026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa records.setVoiceMessageWaiting(1, voicemailCount); 15126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } else { 15226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa log("updateMessageWaitingIndicator: SIM Records not found"); 15326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } 15426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa storeVoiceMailCount(); 15526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } 15626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa 1570d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 1580d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Send an acknowledge message. 1590d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param success indicates that last message was successfully received. 1600d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param result result code indicating any error 1610d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param response callback message sent when operation completes. 1620d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 1630d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 1640d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected void acknowledgeLastIncomingSms(boolean success, int result, Message response) { 1650d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mPhone.mCi.acknowledgeLastIncomingGsmSms(success, resultToCause(result), response); 1660d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1670d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1680d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 169d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * Called when the phone changes the default method updates mPhone 170d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * mStorageMonitor and mCellBroadcastHandler.updatePhoneObject. 171d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * Override if different or other behavior is desired. 172d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * 173d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * @param phone 174d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville */ 175d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville @Override 176d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville protected void onUpdatePhoneObject(PhoneBase phone) { 177d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville super.onUpdatePhoneObject(phone); 178d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville log("onUpdatePhoneObject: dispose of old CellBroadcastHandler and make a new one"); 179d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville mCellBroadcastHandler.dispose(); 180d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville mCellBroadcastHandler = GsmCellBroadcastHandler 181d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville .makeGsmCellBroadcastHandler(mContext, phone); 182d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville } 183d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville 184d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville /** 1850d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Convert Android result code to 3GPP SMS failure cause. 1860d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param rc the Android SMS intent result value 1870d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return 0 for success, or a 3GPP SMS failure cause value 1880d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 1890d4bcdf379842af4b6304809156971e926f374f0Jake Hamby private static int resultToCause(int rc) { 1900d4bcdf379842af4b6304809156971e926f374f0Jake Hamby switch (rc) { 1910d4bcdf379842af4b6304809156971e926f374f0Jake Hamby case Activity.RESULT_OK: 1920d4bcdf379842af4b6304809156971e926f374f0Jake Hamby case Intents.RESULT_SMS_HANDLED: 1930d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // Cause code is ignored on success. 1940d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return 0; 1950d4bcdf379842af4b6304809156971e926f374f0Jake Hamby case Intents.RESULT_SMS_OUT_OF_MEMORY: 1960d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return CommandsInterface.GSM_SMS_FAIL_CAUSE_MEMORY_CAPACITY_EXCEEDED; 1970d4bcdf379842af4b6304809156971e926f374f0Jake Hamby case Intents.RESULT_SMS_GENERIC_ERROR: 1980d4bcdf379842af4b6304809156971e926f374f0Jake Hamby default: 1990d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return CommandsInterface.GSM_SMS_FAIL_CAUSE_UNSPECIFIED_ERROR; 2000d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 2010d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 2020d4bcdf379842af4b6304809156971e926f374f0Jake Hamby} 203