blob: 86c0ef68558f410ad6f5370deaaee1d18102d928 [file] [log] [blame]
/*
* 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.PendingIntent;
import android.net.Uri;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.telephony.Rlog;
import android.telephony.SubscriptionManager;
import com.android.internal.telephony.ISms;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.SmsRawData;
import java.util.ArrayList;
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<SmsRawData> getAllMessagesFromIccEf(String callingPackage)
throws android.os.RemoteException {
return getAllMessagesFromIccEfForSubscriber(getPreferredSmsSubscription(), callingPackage);
}
public List<SmsRawData> 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<String> parts, List<PendingIntent> sentIntents,
List<PendingIntent> 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<String> parts, List<PendingIntent> sentIntents,
List<PendingIntent> 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;
}
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<PendingIntent> sentIntents, List<PendingIntent> 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);
}
}
}