diff options
Diffstat (limited to 'src/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java')
-rw-r--r-- | src/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java | 86 |
1 files changed, 82 insertions, 4 deletions
diff --git a/src/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java b/src/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java index f80aa67..44882ef 100644 --- a/src/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java +++ b/src/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java @@ -16,26 +16,86 @@ package com.android.internal.telephony; +import java.util.Hashtable; +import java.util.List; + +import android.app.Activity; import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.PowerManager; +import android.os.RemoteException; import android.os.ServiceManager; - -import java.util.List; +import android.os.SystemProperties; +import android.provider.Telephony.Sms.Intents; +import android.telephony.SmsMessage; public class IccSmsInterfaceManagerProxy extends ISms.Stub { private IccSmsInterfaceManager mIccSmsInterfaceManager; + private Hashtable<String, ISmsMiddleware> mMiddleware = new Hashtable<String, ISmsMiddleware>(); - public IccSmsInterfaceManagerProxy(IccSmsInterfaceManager - iccSmsInterfaceManager) { + public IccSmsInterfaceManagerProxy(Context context, + IccSmsInterfaceManager iccSmsInterfaceManager) { + this.mContext = context; this.mIccSmsInterfaceManager = iccSmsInterfaceManager; if(ServiceManager.getService("isms") == null) { ServiceManager.addService("isms", this); } + + createWakelock(); } public void setmIccSmsInterfaceManager(IccSmsInterfaceManager iccSmsInterfaceManager) { this.mIccSmsInterfaceManager = iccSmsInterfaceManager; } + private void createWakelock() { + PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE); + mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "SMSDispatcher"); + mWakeLock.setReferenceCounted(true); + } + + @Override + public void registerSmsMiddleware(String name, ISmsMiddleware middleware) throws android.os.RemoteException { + if (!"1".equals(SystemProperties.get("persist.sys.sms_debug", "0"))) { + mContext.enforceCallingPermission( + "android.permission.INTERCEPT_SMS", ""); + } + mMiddleware.put(name, middleware); + } + + private Context mContext; + private PowerManager.WakeLock mWakeLock; + private static final int WAKE_LOCK_TIMEOUT = 5000; + private void dispatchPdus(byte[][] pdus) { + Intent intent = new Intent(Intents.SMS_RECEIVED_ACTION); + intent.putExtra("pdus", pdus); + intent.putExtra("format", SmsMessage.FORMAT_SYNTHETIC); + dispatch(intent, SMSDispatcher.RECEIVE_SMS_PERMISSION); + } + + private void dispatch(Intent intent, String permission) { + // Hold a wake lock for WAKE_LOCK_TIMEOUT seconds, enough to give any + // receivers time to take their own wake locks. + mWakeLock.acquire(WAKE_LOCK_TIMEOUT); + mContext.sendOrderedBroadcast(intent, permission); + } + + @Override + public void synthesizeMessages(String originatingAddress, String scAddress, List<String> messages, long timestampMillis) throws RemoteException { + // if not running in debug mode + if (!"1".equals(SystemProperties.get("persist.sys.sms_debug", "0"))) { + mContext.enforceCallingPermission( + "android.permission.BROADCAST_SMS", ""); + } + byte[][] pdus = new byte[messages.size()][]; + for (int i = 0; i < messages.size(); i++) { + SyntheticSmsMessage message = new SyntheticSmsMessage(originatingAddress, scAddress, messages.get(i), timestampMillis); + pdus[i] = message.getPdu(); + } + dispatchPdus(pdus); + } + public boolean updateMessageOnIccEf(int index, int status, byte[] pdu) throws android.os.RemoteException { return mIccSmsInterfaceManager.updateMessageOnIccEf(index, status, pdu); @@ -58,12 +118,30 @@ public class IccSmsInterfaceManagerProxy extends ISms.Stub { public void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { + for (ISmsMiddleware middleware: mMiddleware.values()) { + try { + if (middleware.onSendText(destAddr, scAddr, text, sentIntent, deliveryIntent)) + return; + } + catch (Exception e) { + // TOOD: remove the busted middleware? + } + } mIccSmsInterfaceManager.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent); } public void sendMultipartText(String destAddr, String scAddr, List<String> parts, List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) throws android.os.RemoteException { + for (ISmsMiddleware middleware: mMiddleware.values()) { + try { + if (middleware.onSendMultipartText(destAddr, scAddr, parts, sentIntents, deliveryIntents)) + return; + } + catch (Exception e) { + // TOOD: remove the busted middleware? + } + } mIccSmsInterfaceManager.sendMultipartText(destAddr, scAddr, parts, sentIntents, deliveryIntents); } |