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; 300d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.uicc.UsimServiceTable; 310d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 320d4bcdf379842af4b6304809156971e926f374f0Jake Hamby/** 330d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * This class broadcasts incoming SMS messages to interested apps after storing them in 340d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * the SmsProvider "raw" table and ACKing them to the SMSC. After each message has been 350d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 360d4bcdf379842af4b6304809156971e926f374f0Jake Hambypublic class GsmInboundSmsHandler extends InboundSmsHandler { 370d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 380d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** Handler for SMS-PP data download messages to UICC. */ 390d4bcdf379842af4b6304809156971e926f374f0Jake Hamby private final UsimDataDownloadHandler mDataDownloadHandler; 400d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 410d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 420d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Create a new GSM inbound SMS handler. 430d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 440d4bcdf379842af4b6304809156971e926f374f0Jake Hamby private GsmInboundSmsHandler(Context context, SmsStorageMonitor storageMonitor, 450d4bcdf379842af4b6304809156971e926f374f0Jake Hamby PhoneBase phone) { 46d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville super("GsmInboundSmsHandler", context, storageMonitor, phone, 47d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville GsmCellBroadcastHandler.makeGsmCellBroadcastHandler(context, phone)); 480d4bcdf379842af4b6304809156971e926f374f0Jake Hamby phone.mCi.setOnNewGsmSms(getHandler(), EVENT_NEW_SMS, null); 490d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mDataDownloadHandler = new UsimDataDownloadHandler(phone.mCi); 500d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 510d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 520d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 530d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Unregister for GSM SMS. 540d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 550d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 560d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected void onQuitting() { 570d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mPhone.mCi.unSetOnNewGsmSms(getHandler()); 58d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville mCellBroadcastHandler.dispose(); 590d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 600d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (DBG) log("unregistered for 3GPP SMS"); 610d4bcdf379842af4b6304809156971e926f374f0Jake Hamby super.onQuitting(); // release wakelock 620d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 630d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 640d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 650d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Wait for state machine to enter startup state. We can't send any messages until then. 660d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 670d4bcdf379842af4b6304809156971e926f374f0Jake Hamby public static GsmInboundSmsHandler makeInboundSmsHandler(Context context, 680d4bcdf379842af4b6304809156971e926f374f0Jake Hamby SmsStorageMonitor storageMonitor, PhoneBase phone) { 690d4bcdf379842af4b6304809156971e926f374f0Jake Hamby GsmInboundSmsHandler handler = new GsmInboundSmsHandler(context, storageMonitor, phone); 700d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handler.start(); 710d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return handler; 720d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 730d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 740d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 750d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Return true if this handler is for 3GPP2 messages; false for 3GPP format. 760d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return false (3GPP) 770d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 780d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 790d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected boolean is3gpp2() { 800d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return false; 810d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 820d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 830d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 840d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Handle type zero, SMS-PP data download, and 3GPP/CPHS MWI type SMS. Normal SMS messages 850d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * are handled by {@link #dispatchNormalMessage} in parent class. 860d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * 870d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param smsb the SmsMessageBase object from the RIL 880d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return a result code from {@link android.provider.Telephony.Sms.Intents}, 890d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * or {@link Activity#RESULT_OK} for delayed acknowledgment to SMSC 900d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 910d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 920d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected int dispatchMessageRadioSpecific(SmsMessageBase smsb) { 930d4bcdf379842af4b6304809156971e926f374f0Jake Hamby SmsMessage sms = (SmsMessage) smsb; 940d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 950d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (sms.isTypeZero()) { 960d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // As per 3GPP TS 23.040 9.2.3.9, Type Zero messages should not be 970d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // Displayed/Stored/Notified. They should only be acknowledged. 980d4bcdf379842af4b6304809156971e926f374f0Jake Hamby log("Received short message type 0, Don't display or store it. Send Ack"); 990d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return Intents.RESULT_SMS_HANDLED; 1000d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1010d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1020d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // Send SMS-PP data download messages to UICC. See 3GPP TS 31.111 section 7.1.1. 1030d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (sms.isUsimDataDownload()) { 1040d4bcdf379842af4b6304809156971e926f374f0Jake Hamby UsimServiceTable ust = mPhone.getUsimServiceTable(); 1050d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return mDataDownloadHandler.handleUsimDataDownload(ust, sms); 1060d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1070d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1080d4bcdf379842af4b6304809156971e926f374f0Jake Hamby boolean handled = false; 1090d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (sms.isMWISetMessage()) { 1100d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mPhone.setVoiceMessageWaiting(1, -1); // line 1: unknown number of msgs waiting 1110d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handled = sms.isMwiDontStore(); 1120d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (DBG) log("Received voice mail indicator set SMS shouldStore=" + !handled); 1130d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } else if (sms.isMWIClearMessage()) { 1140d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mPhone.setVoiceMessageWaiting(1, 0); // line 1: no msgs waiting 1150d4bcdf379842af4b6304809156971e926f374f0Jake Hamby handled = sms.isMwiDontStore(); 1160d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (DBG) log("Received voice mail indicator clear SMS shouldStore=" + !handled); 1170d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1180d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (handled) { 1190d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return Intents.RESULT_SMS_HANDLED; 1200d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1210d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1220d4bcdf379842af4b6304809156971e926f374f0Jake Hamby if (!mStorageMonitor.isStorageAvailable() && 1230d4bcdf379842af4b6304809156971e926f374f0Jake Hamby sms.getMessageClass() != SmsConstants.MessageClass.CLASS_0) { 1240d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // It's a storable message and there's no storage available. Bail. 1250d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // (See TS 23.038 for a description of class 0 messages.) 1260d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return Intents.RESULT_SMS_OUT_OF_MEMORY; 1270d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1280d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1290d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return dispatchNormalMessage(smsb); 1300d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1310d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1320d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 1330d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Send an acknowledge message. 1340d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param success indicates that last message was successfully received. 1350d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param result result code indicating any error 1360d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param response callback message sent when operation completes. 1370d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 1380d4bcdf379842af4b6304809156971e926f374f0Jake Hamby @Override 1390d4bcdf379842af4b6304809156971e926f374f0Jake Hamby protected void acknowledgeLastIncomingSms(boolean success, int result, Message response) { 1400d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mPhone.mCi.acknowledgeLastIncomingGsmSms(success, resultToCause(result), response); 1410d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1420d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 1430d4bcdf379842af4b6304809156971e926f374f0Jake Hamby /** 144d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * Called when the phone changes the default method updates mPhone 145d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * mStorageMonitor and mCellBroadcastHandler.updatePhoneObject. 146d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * Override if different or other behavior is desired. 147d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * 148d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville * @param phone 149d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville */ 150d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville @Override 151d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville protected void onUpdatePhoneObject(PhoneBase phone) { 152d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville super.onUpdatePhoneObject(phone); 153d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville log("onUpdatePhoneObject: dispose of old CellBroadcastHandler and make a new one"); 154d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville mCellBroadcastHandler.dispose(); 155d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville mCellBroadcastHandler = GsmCellBroadcastHandler 156d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville .makeGsmCellBroadcastHandler(mContext, phone); 157d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville } 158d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville 159d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville /** 1600d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * Convert Android result code to 3GPP SMS failure cause. 1610d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @param rc the Android SMS intent result value 1620d4bcdf379842af4b6304809156971e926f374f0Jake Hamby * @return 0 for success, or a 3GPP SMS failure cause value 1630d4bcdf379842af4b6304809156971e926f374f0Jake Hamby */ 1640d4bcdf379842af4b6304809156971e926f374f0Jake Hamby private static int resultToCause(int rc) { 1650d4bcdf379842af4b6304809156971e926f374f0Jake Hamby switch (rc) { 1660d4bcdf379842af4b6304809156971e926f374f0Jake Hamby case Activity.RESULT_OK: 1670d4bcdf379842af4b6304809156971e926f374f0Jake Hamby case Intents.RESULT_SMS_HANDLED: 1680d4bcdf379842af4b6304809156971e926f374f0Jake Hamby // Cause code is ignored on success. 1690d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return 0; 1700d4bcdf379842af4b6304809156971e926f374f0Jake Hamby case Intents.RESULT_SMS_OUT_OF_MEMORY: 1710d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return CommandsInterface.GSM_SMS_FAIL_CAUSE_MEMORY_CAPACITY_EXCEEDED; 1720d4bcdf379842af4b6304809156971e926f374f0Jake Hamby case Intents.RESULT_SMS_GENERIC_ERROR: 1730d4bcdf379842af4b6304809156971e926f374f0Jake Hamby default: 1740d4bcdf379842af4b6304809156971e926f374f0Jake Hamby return CommandsInterface.GSM_SMS_FAIL_CAUSE_UNSPECIFIED_ERROR; 1750d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1760d4bcdf379842af4b6304809156971e926f374f0Jake Hamby } 1770d4bcdf379842af4b6304809156971e926f374f0Jake Hamby} 178