Home | History | Annotate | Download | only in telephony
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
      4  * Not a Contribution.
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 
     19 package com.android.internal.telephony;
     20 
     21 import android.app.PendingIntent;
     22 import android.net.Uri;
     23 import android.os.RemoteException;
     24 import android.os.ServiceManager;
     25 import android.telephony.Rlog;
     26 import android.telephony.SubscriptionManager;
     27 
     28 import com.android.internal.telephony.ISms;
     29 import com.android.internal.telephony.Phone;
     30 import com.android.internal.telephony.SmsRawData;
     31 
     32 import java.util.ArrayList;
     33 import java.util.List;
     34 
     35 /**
     36  * UiccSmsController to provide an inter-process communication to
     37  * access Sms in Icc.
     38  */
     39 public class UiccSmsController extends ISms.Stub {
     40     static final String LOG_TAG = "RIL_UiccSmsController";
     41 
     42     protected Phone[] mPhone;
     43 
     44     protected UiccSmsController(Phone[] phone){
     45         mPhone = phone;
     46 
     47         if (ServiceManager.getService("isms") == null) {
     48             ServiceManager.addService("isms", this);
     49         }
     50     }
     51 
     52     public boolean
     53     updateMessageOnIccEf(String callingPackage, int index, int status, byte[] pdu)
     54             throws android.os.RemoteException {
     55         return  updateMessageOnIccEfForSubscriber(getPreferredSmsSubscription(), callingPackage,
     56                 index, status, pdu);
     57     }
     58 
     59     public boolean
     60     updateMessageOnIccEfForSubscriber(long subId, String callingPackage, int index, int status,
     61                 byte[] pdu) throws android.os.RemoteException {
     62         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
     63         if (iccSmsIntMgr != null) {
     64             return iccSmsIntMgr.updateMessageOnIccEf(callingPackage, index, status, pdu);
     65         } else {
     66             Rlog.e(LOG_TAG,"updateMessageOnIccEf iccSmsIntMgr is null" +
     67                           " for Subscription: " + subId);
     68             return false;
     69         }
     70     }
     71 
     72     public boolean copyMessageToIccEf(String callingPackage, int status, byte[] pdu, byte[] smsc)
     73             throws android.os.RemoteException {
     74         return copyMessageToIccEfForSubscriber(getPreferredSmsSubscription(), callingPackage, status,
     75                 pdu, smsc);
     76     }
     77 
     78     public boolean copyMessageToIccEfForSubscriber(long subId, String callingPackage, int status,
     79             byte[] pdu, byte[] smsc) throws android.os.RemoteException {
     80         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
     81         if (iccSmsIntMgr != null) {
     82             return iccSmsIntMgr.copyMessageToIccEf(callingPackage, status, pdu, smsc);
     83         } else {
     84             Rlog.e(LOG_TAG,"copyMessageToIccEf iccSmsIntMgr is null" +
     85                           " for Subscription: " + subId);
     86             return false;
     87         }
     88     }
     89 
     90     public List<SmsRawData> getAllMessagesFromIccEf(String callingPackage)
     91             throws android.os.RemoteException {
     92         return getAllMessagesFromIccEfForSubscriber(getPreferredSmsSubscription(), callingPackage);
     93     }
     94 
     95     public List<SmsRawData> getAllMessagesFromIccEfForSubscriber(long subId, String callingPackage)
     96                 throws android.os.RemoteException {
     97         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
     98         if (iccSmsIntMgr != null) {
     99             return iccSmsIntMgr.getAllMessagesFromIccEf(callingPackage);
    100         } else {
    101             Rlog.e(LOG_TAG,"getAllMessagesFromIccEf iccSmsIntMgr is" +
    102                           " null for Subscription: " + subId);
    103             return null;
    104         }
    105     }
    106 
    107     public void sendData(String callingPackage, String destAddr, String scAddr, int destPort,
    108             byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
    109          sendDataForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr, scAddr,
    110                  destPort, data, sentIntent, deliveryIntent);
    111     }
    112 
    113     public void sendDataForSubscriber(long subId, String callingPackage, String destAddr,
    114             String scAddr, int destPort, byte[] data, PendingIntent sentIntent,
    115             PendingIntent deliveryIntent) {
    116         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    117         if (iccSmsIntMgr != null) {
    118             iccSmsIntMgr.sendData(callingPackage, destAddr, scAddr, destPort, data,
    119                     sentIntent, deliveryIntent);
    120         } else {
    121             Rlog.e(LOG_TAG,"sendText iccSmsIntMgr is null for" +
    122                           " Subscription: " + subId);
    123         }
    124     }
    125 
    126     public void sendText(String callingPackage, String destAddr, String scAddr,
    127             String text, PendingIntent sentIntent, PendingIntent deliveryIntent) {
    128         sendTextForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr, scAddr,
    129             text, sentIntent, deliveryIntent);
    130     }
    131 
    132     public void sendTextForSubscriber(long subId, String callingPackage, String destAddr,
    133             String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) {
    134         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    135         if (iccSmsIntMgr != null) {
    136             iccSmsIntMgr.sendText(callingPackage, destAddr, scAddr, text, sentIntent,
    137                     deliveryIntent);
    138         } else {
    139             Rlog.e(LOG_TAG,"sendText iccSmsIntMgr is null for" +
    140                           " Subscription: " + subId);
    141         }
    142     }
    143 
    144     public void sendMultipartText(String callingPackage, String destAddr, String scAddr,
    145             List<String> parts, List<PendingIntent> sentIntents,
    146             List<PendingIntent> deliveryIntents) throws android.os.RemoteException {
    147          sendMultipartTextForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr,
    148                  scAddr, parts, sentIntents, deliveryIntents);
    149     }
    150 
    151     public void sendMultipartTextForSubscriber(long subId, String callingPackage, String destAddr,
    152             String scAddr, List<String> parts, List<PendingIntent> sentIntents,
    153             List<PendingIntent> deliveryIntents)
    154             throws android.os.RemoteException {
    155         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    156         if (iccSmsIntMgr != null ) {
    157             iccSmsIntMgr.sendMultipartText(callingPackage, destAddr, scAddr, parts, sentIntents,
    158                     deliveryIntents);
    159         } else {
    160             Rlog.e(LOG_TAG,"sendMultipartText iccSmsIntMgr is null for" +
    161                           " Subscription: " + subId);
    162         }
    163     }
    164 
    165     public boolean enableCellBroadcast(int messageIdentifier) throws android.os.RemoteException {
    166         return enableCellBroadcastForSubscriber(getPreferredSmsSubscription(), messageIdentifier);
    167     }
    168 
    169     public boolean enableCellBroadcastForSubscriber(long subId, int messageIdentifier)
    170                 throws android.os.RemoteException {
    171         return enableCellBroadcastRangeForSubscriber(subId, messageIdentifier, messageIdentifier);
    172     }
    173 
    174     public boolean enableCellBroadcastRange(int startMessageId, int endMessageId)
    175             throws android.os.RemoteException {
    176         return enableCellBroadcastRangeForSubscriber(getPreferredSmsSubscription(), startMessageId,
    177                 endMessageId);
    178     }
    179 
    180     public boolean enableCellBroadcastRangeForSubscriber(long subId, int startMessageId,
    181             int endMessageId) throws android.os.RemoteException {
    182         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    183         if (iccSmsIntMgr != null ) {
    184             return iccSmsIntMgr.enableCellBroadcastRange(startMessageId, endMessageId);
    185         } else {
    186             Rlog.e(LOG_TAG,"enableCellBroadcast iccSmsIntMgr is null for" +
    187                           " Subscription: " + subId);
    188         }
    189         return false;
    190     }
    191 
    192     public boolean disableCellBroadcast(int messageIdentifier) throws android.os.RemoteException {
    193         return disableCellBroadcastForSubscriber(getPreferredSmsSubscription(), messageIdentifier);
    194     }
    195 
    196     public boolean disableCellBroadcastForSubscriber(long subId, int messageIdentifier)
    197                 throws android.os.RemoteException {
    198         return disableCellBroadcastRangeForSubscriber(subId, messageIdentifier, messageIdentifier);
    199     }
    200 
    201     public boolean disableCellBroadcastRange(int startMessageId, int endMessageId)
    202             throws android.os.RemoteException {
    203         return disableCellBroadcastRangeForSubscriber(getPreferredSmsSubscription(), startMessageId,
    204                 endMessageId);
    205     }
    206 
    207     public boolean disableCellBroadcastRangeForSubscriber(long subId, int startMessageId,
    208             int endMessageId) throws android.os.RemoteException {
    209         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    210         if (iccSmsIntMgr != null ) {
    211             return iccSmsIntMgr.disableCellBroadcastRange(startMessageId, endMessageId);
    212         } else {
    213             Rlog.e(LOG_TAG,"disableCellBroadcast iccSmsIntMgr is null for" +
    214                           " Subscription:"+subId);
    215         }
    216        return false;
    217     }
    218 
    219     public int getPremiumSmsPermission(String packageName) {
    220         return getPremiumSmsPermissionForSubscriber(getPreferredSmsSubscription(), packageName);
    221     }
    222 
    223     @Override
    224     public int getPremiumSmsPermissionForSubscriber(long subId, String packageName) {
    225         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    226         if (iccSmsIntMgr != null ) {
    227             return iccSmsIntMgr.getPremiumSmsPermission(packageName);
    228         } else {
    229             Rlog.e(LOG_TAG, "getPremiumSmsPermission iccSmsIntMgr is null");
    230         }
    231         //TODO Rakesh
    232         return 0;
    233     }
    234 
    235     public void setPremiumSmsPermission(String packageName, int permission) {
    236          setPremiumSmsPermissionForSubscriber(getPreferredSmsSubscription(), packageName, permission);
    237     }
    238 
    239     @Override
    240     public void setPremiumSmsPermissionForSubscriber(long subId, String packageName, int permission) {
    241         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    242         if (iccSmsIntMgr != null ) {
    243             iccSmsIntMgr.setPremiumSmsPermission(packageName, permission);
    244         } else {
    245             Rlog.e(LOG_TAG, "setPremiumSmsPermission iccSmsIntMgr is null");
    246         }
    247     }
    248 
    249     public boolean isImsSmsSupported() {
    250         return isImsSmsSupportedForSubscriber(getPreferredSmsSubscription());
    251     }
    252 
    253     @Override
    254     public boolean isImsSmsSupportedForSubscriber(long subId) {
    255         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    256         if (iccSmsIntMgr != null ) {
    257             return iccSmsIntMgr.isImsSmsSupported();
    258         } else {
    259             Rlog.e(LOG_TAG, "isImsSmsSupported iccSmsIntMgr is null");
    260         }
    261         return false;
    262     }
    263 
    264     public String getImsSmsFormat() {
    265         return getImsSmsFormatForSubscriber(getPreferredSmsSubscription());
    266     }
    267 
    268     @Override
    269     public String getImsSmsFormatForSubscriber(long subId) {
    270        IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    271         if (iccSmsIntMgr != null ) {
    272             return iccSmsIntMgr.getImsSmsFormat();
    273         } else {
    274             Rlog.e(LOG_TAG, "getImsSmsFormat iccSmsIntMgr is null");
    275         }
    276         return null;
    277     }
    278 
    279     @Override
    280     public void updateSmsSendStatus(int messageRef, boolean success) {
    281         getIccSmsInterfaceManager(SubscriptionManager.getDefaultSmsSubId())
    282             .updateSmsSendStatus(messageRef, success);
    283     }
    284 
    285     @Override
    286     public void injectSmsPdu(byte[] pdu, String format, PendingIntent receivedIntent) {
    287         injectSmsPdu(SubscriptionManager.getDefaultSmsSubId(), pdu, format, receivedIntent);
    288     }
    289 
    290     // FIXME: Add injectSmsPdu to ISms.aidl
    291     public void injectSmsPdu(long subId, byte[] pdu, String format, PendingIntent receivedIntent) {
    292         getIccSmsInterfaceManager(subId).injectSmsPdu(pdu, format, receivedIntent);
    293     }
    294 
    295     /**
    296      * get sms interface manager object based on subscription.
    297      **/
    298     private IccSmsInterfaceManager getIccSmsInterfaceManager(long subId) {
    299         int phoneId = SubscriptionController.getInstance().getPhoneId(subId) ;
    300         //Fixme: for multi-subscription case
    301         if (!SubscriptionManager.isValidPhoneId(phoneId)
    302                 || phoneId == SubscriptionManager.DEFAULT_PHONE_ID) {
    303             phoneId = 0;
    304         }
    305 
    306         try {
    307             return (IccSmsInterfaceManager)
    308                 ((PhoneProxy)mPhone[(int)phoneId]).getIccSmsInterfaceManager();
    309         } catch (NullPointerException e) {
    310             Rlog.e(LOG_TAG, "Exception is :"+e.toString()+" For subscription :"+subId );
    311             e.printStackTrace(); //This will print stact trace
    312             return null;
    313         } catch (ArrayIndexOutOfBoundsException e) {
    314             Rlog.e(LOG_TAG, "Exception is :"+e.toString()+" For subscription :"+subId );
    315             e.printStackTrace(); //This will print stack trace
    316             return null;
    317         }
    318     }
    319 
    320     /**
    321        Gets User preferred SMS subscription */
    322     public long getPreferredSmsSubscription() {
    323         return  SubscriptionManager.getDefaultSmsSubId();
    324     }
    325 
    326     /**
    327      * Get SMS prompt property,  enabled or not
    328      **/
    329     public boolean isSMSPromptEnabled() {
    330         return PhoneFactory.isSMSPromptEnabled();
    331     }
    332 
    333     @Override
    334     public void sendStoredText(long subId, String callingPkg, Uri messageUri, String scAddress,
    335             PendingIntent sentIntent, PendingIntent deliveryIntent) throws RemoteException {
    336         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    337         if (iccSmsIntMgr != null) {
    338             iccSmsIntMgr.sendStoredText(callingPkg, messageUri, scAddress, sentIntent,
    339                     deliveryIntent);
    340         } else {
    341             Rlog.e(LOG_TAG,"sendStoredText iccSmsIntMgr is null for subscription: " + subId);
    342         }
    343     }
    344 
    345     @Override
    346     public void sendStoredMultipartText(long subId, String callingPkg, Uri messageUri,
    347             String scAddress, List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents)
    348             throws RemoteException {
    349         IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
    350         if (iccSmsIntMgr != null ) {
    351             iccSmsIntMgr.sendStoredMultipartText(callingPkg, messageUri, scAddress, sentIntents,
    352                     deliveryIntents);
    353         } else {
    354             Rlog.e(LOG_TAG,"sendStoredMultipartText iccSmsIntMgr is null for subscription: "
    355                     + subId);
    356         }
    357     }
    358 
    359 }
    360