/* * Copyright (C) 2008 The Android Open Source Project * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * Not a Contribution. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import android.app.ActivityThread; import android.app.PendingIntent; import android.content.Context; import android.net.Uri; import android.os.Binder; import android.os.RemoteException; import android.os.ServiceManager; import android.telephony.Rlog; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import java.util.List; /** * UiccSmsController to provide an inter-process communication to * access Sms in Icc. */ public class UiccSmsController extends ISms.Stub { static final String LOG_TAG = "RIL_UiccSmsController"; protected Phone[] mPhone; protected UiccSmsController(Phone[] phone){ mPhone = phone; if (ServiceManager.getService("isms") == null) { ServiceManager.addService("isms", this); } } public boolean updateMessageOnIccEf(String callingPackage, int index, int status, byte[] pdu) throws android.os.RemoteException { return updateMessageOnIccEfForSubscriber(getPreferredSmsSubscription(), callingPackage, index, status, pdu); } public boolean updateMessageOnIccEfForSubscriber(int subId, String callingPackage, int index, int status, byte[] pdu) throws android.os.RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { return iccSmsIntMgr.updateMessageOnIccEf(callingPackage, index, status, pdu); } else { Rlog.e(LOG_TAG,"updateMessageOnIccEf iccSmsIntMgr is null" + " for Subscription: " + subId); return false; } } public boolean copyMessageToIccEf(String callingPackage, int status, byte[] pdu, byte[] smsc) throws android.os.RemoteException { return copyMessageToIccEfForSubscriber(getPreferredSmsSubscription(), callingPackage, status, pdu, smsc); } public boolean copyMessageToIccEfForSubscriber(int subId, String callingPackage, int status, byte[] pdu, byte[] smsc) throws android.os.RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { return iccSmsIntMgr.copyMessageToIccEf(callingPackage, status, pdu, smsc); } else { Rlog.e(LOG_TAG,"copyMessageToIccEf iccSmsIntMgr is null" + " for Subscription: " + subId); return false; } } public List getAllMessagesFromIccEf(String callingPackage) throws android.os.RemoteException { return getAllMessagesFromIccEfForSubscriber(getPreferredSmsSubscription(), callingPackage); } public List getAllMessagesFromIccEfForSubscriber(int subId, String callingPackage) throws android.os.RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { return iccSmsIntMgr.getAllMessagesFromIccEf(callingPackage); } else { Rlog.e(LOG_TAG,"getAllMessagesFromIccEf iccSmsIntMgr is" + " null for Subscription: " + subId); return null; } } public void sendData(String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendDataForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); } public void sendDataForSubscriber(int subId, String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { iccSmsIntMgr.sendData(callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); } else { Rlog.e(LOG_TAG,"sendText iccSmsIntMgr is null for" + " Subscription: " + subId); } } public void sendText(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendTextForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); } public void sendTextForSubscriber(int subId, String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { iccSmsIntMgr.sendText(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); } else { Rlog.e(LOG_TAG,"sendText iccSmsIntMgr is null for" + " Subscription: " + subId); } } public void sendMultipartText(String callingPackage, String destAddr, String scAddr, List parts, List sentIntents, List deliveryIntents) throws android.os.RemoteException { sendMultipartTextForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr, scAddr, parts, sentIntents, deliveryIntents); } public void sendMultipartTextForSubscriber(int subId, String callingPackage, String destAddr, String scAddr, List parts, List sentIntents, List deliveryIntents) throws android.os.RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { iccSmsIntMgr.sendMultipartText(callingPackage, destAddr, scAddr, parts, sentIntents, deliveryIntents); } else { Rlog.e(LOG_TAG,"sendMultipartText iccSmsIntMgr is null for" + " Subscription: " + subId); } } public boolean enableCellBroadcast(int messageIdentifier, int ranType) throws android.os.RemoteException { return enableCellBroadcastForSubscriber(getPreferredSmsSubscription(), messageIdentifier, ranType); } public boolean enableCellBroadcastForSubscriber(int subId, int messageIdentifier, int ranType) throws android.os.RemoteException { return enableCellBroadcastRangeForSubscriber(subId, messageIdentifier, messageIdentifier, ranType); } public boolean enableCellBroadcastRange(int startMessageId, int endMessageId, int ranType) throws android.os.RemoteException { return enableCellBroadcastRangeForSubscriber(getPreferredSmsSubscription(), startMessageId, endMessageId, ranType); } public boolean enableCellBroadcastRangeForSubscriber(int subId, int startMessageId, int endMessageId, int ranType) throws android.os.RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { return iccSmsIntMgr.enableCellBroadcastRange(startMessageId, endMessageId, ranType); } else { Rlog.e(LOG_TAG,"enableCellBroadcast iccSmsIntMgr is null for" + " Subscription: " + subId); } return false; } public boolean disableCellBroadcast(int messageIdentifier, int ranType) throws android.os.RemoteException { return disableCellBroadcastForSubscriber(getPreferredSmsSubscription(), messageIdentifier, ranType); } public boolean disableCellBroadcastForSubscriber(int subId, int messageIdentifier, int ranType) throws android.os.RemoteException { return disableCellBroadcastRangeForSubscriber(subId, messageIdentifier, messageIdentifier, ranType); } public boolean disableCellBroadcastRange(int startMessageId, int endMessageId, int ranType) throws android.os.RemoteException { return disableCellBroadcastRangeForSubscriber(getPreferredSmsSubscription(), startMessageId, endMessageId, ranType); } public boolean disableCellBroadcastRangeForSubscriber(int subId, int startMessageId, int endMessageId, int ranType) throws android.os.RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { return iccSmsIntMgr.disableCellBroadcastRange(startMessageId, endMessageId, ranType); } else { Rlog.e(LOG_TAG,"disableCellBroadcast iccSmsIntMgr is null for" + " Subscription:"+subId); } return false; } public int getPremiumSmsPermission(String packageName) { return getPremiumSmsPermissionForSubscriber(getPreferredSmsSubscription(), packageName); } @Override public int getPremiumSmsPermissionForSubscriber(int subId, String packageName) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { return iccSmsIntMgr.getPremiumSmsPermission(packageName); } else { Rlog.e(LOG_TAG, "getPremiumSmsPermission iccSmsIntMgr is null"); } //TODO Rakesh return 0; } public void setPremiumSmsPermission(String packageName, int permission) { setPremiumSmsPermissionForSubscriber(getPreferredSmsSubscription(), packageName, permission); } @Override public void setPremiumSmsPermissionForSubscriber(int subId, String packageName, int permission) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { iccSmsIntMgr.setPremiumSmsPermission(packageName, permission); } else { Rlog.e(LOG_TAG, "setPremiumSmsPermission iccSmsIntMgr is null"); } } public boolean isImsSmsSupported() { return isImsSmsSupportedForSubscriber(getPreferredSmsSubscription()); } @Override public boolean isImsSmsSupportedForSubscriber(int subId) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { return iccSmsIntMgr.isImsSmsSupported(); } else { Rlog.e(LOG_TAG, "isImsSmsSupported iccSmsIntMgr is null"); } return false; } @Override public boolean isSmsSimPickActivityNeeded(int subId) { final Context context = ActivityThread.currentApplication().getApplicationContext(); TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); List subInfoList; final long identity = Binder.clearCallingIdentity(); try { subInfoList = SubscriptionManager.from(context).getActiveSubscriptionInfoList(); } finally { Binder.restoreCallingIdentity(identity); } if (subInfoList != null) { final int subInfoLength = subInfoList.size(); for (int i = 0; i < subInfoLength; ++i) { final SubscriptionInfo sir = subInfoList.get(i); if (sir != null && sir.getSubscriptionId() == subId) { // The subscription id is valid, sms sim pick activity not needed return false; } } // If reached here and multiple SIMs and subs present, sms sim pick activity is needed if (subInfoLength > 0 && telephonyManager.getSimCount() > 1) { return true; } } return false; } public String getImsSmsFormat() { return getImsSmsFormatForSubscriber(getPreferredSmsSubscription()); } @Override public String getImsSmsFormatForSubscriber(int subId) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { return iccSmsIntMgr.getImsSmsFormat(); } else { Rlog.e(LOG_TAG, "getImsSmsFormat iccSmsIntMgr is null"); } return null; } @Override public void injectSmsPdu(byte[] pdu, String format, PendingIntent receivedIntent) { injectSmsPdu(SubscriptionManager.getDefaultSmsSubId(), pdu, format, receivedIntent); } // FIXME: Add injectSmsPdu to ISms.aidl public void injectSmsPdu(int subId, byte[] pdu, String format, PendingIntent receivedIntent) { getIccSmsInterfaceManager(subId).injectSmsPdu(pdu, format, receivedIntent); } /** * get sms interface manager object based on subscription. **/ private IccSmsInterfaceManager getIccSmsInterfaceManager(int subId) { int phoneId = SubscriptionController.getInstance().getPhoneId(subId) ; //Fixme: for multi-subscription case if (!SubscriptionManager.isValidPhoneId(phoneId) || phoneId == SubscriptionManager.DEFAULT_PHONE_INDEX) { phoneId = 0; } try { return (IccSmsInterfaceManager) ((PhoneProxy)mPhone[(int)phoneId]).getIccSmsInterfaceManager(); } catch (NullPointerException e) { Rlog.e(LOG_TAG, "Exception is :"+e.toString()+" For subscription :"+subId ); e.printStackTrace(); //This will print stact trace return null; } catch (ArrayIndexOutOfBoundsException e) { Rlog.e(LOG_TAG, "Exception is :"+e.toString()+" For subscription :"+subId ); e.printStackTrace(); //This will print stack trace return null; } } /** Gets User preferred SMS subscription */ public int getPreferredSmsSubscription() { return SubscriptionController.getInstance().getDefaultSmsSubId(); } /** * Get SMS prompt property, enabled or not **/ public boolean isSMSPromptEnabled() { return PhoneFactory.isSMSPromptEnabled(); } @Override public void sendStoredText(int subId, String callingPkg, Uri messageUri, String scAddress, PendingIntent sentIntent, PendingIntent deliveryIntent) throws RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { iccSmsIntMgr.sendStoredText(callingPkg, messageUri, scAddress, sentIntent, deliveryIntent); } else { Rlog.e(LOG_TAG,"sendStoredText iccSmsIntMgr is null for subscription: " + subId); } } @Override public void sendStoredMultipartText(int subId, String callingPkg, Uri messageUri, String scAddress, List sentIntents, List deliveryIntents) throws RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { iccSmsIntMgr.sendStoredMultipartText(callingPkg, messageUri, scAddress, sentIntents, deliveryIntents); } else { Rlog.e(LOG_TAG,"sendStoredMultipartText iccSmsIntMgr is null for subscription: " + subId); } } }