From c049f9ad5b4f5bc32f368646e624aef7707b7252 Mon Sep 17 00:00:00 2001 From: John Wang Date: Fri, 10 Dec 2010 14:25:27 -0800 Subject: Block SMS service for non-sms-capable device. If device doesn't support sms service, SMSDispatcher will ignore incoming SMS in dispatching messge and return ERROR_NO_SERVICE in sending sms messgae. bug: 3250029 bug: 3038102 Change-Id: Ic72a9192aa128c43cf31da04907620bc680656c6 --- .../java/android/telephony/TelephonyManager.java | 16 +++++++++++++++ .../android/internal/telephony/SMSDispatcher.java | 24 ++++++++++++++++++++-- .../internal/telephony/cdma/CdmaSMSDispatcher.java | 7 +++++++ .../internal/telephony/gsm/GsmSMSDispatcher.java | 7 +++++++ 4 files changed, 52 insertions(+), 2 deletions(-) (limited to 'telephony/java') diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 38f57c9..4424e5b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -954,4 +954,20 @@ public class TelephonyManager { return mContext.getResources().getBoolean( com.android.internal.R.bool.config_voice_capable); } + + /** + * @return true if the current device supports sms service. + *

+ * If true, this means that the device supports both sending and + * receiving sms via the telephony network. + *

+ * Note: Voicemail waiting sms, cell broadcasting sms, and MMS are + * disabled when device doesn't support sms. + * + * @hide pending API review + */ + public boolean isSmsCapable() { + return mContext.getResources().getBoolean( + com.android.internal.R.bool.config_sms_capable); + } } diff --git a/telephony/java/com/android/internal/telephony/SMSDispatcher.java b/telephony/java/com/android/internal/telephony/SMSDispatcher.java index ec49a19..e7cfe75 100644 --- a/telephony/java/com/android/internal/telephony/SMSDispatcher.java +++ b/telephony/java/com/android/internal/telephony/SMSDispatcher.java @@ -156,6 +156,9 @@ public abstract class SMSDispatcher extends Handler { protected boolean mStorageAvailable = true; protected boolean mReportMemoryStatusPending = false; + /* Flag indicating whether the current device allows sms service */ + protected boolean mSmsCapable = true; + protected static int getNextConcatenatedRef() { sConcatenatedRef += 1; return sConcatenatedRef; @@ -249,6 +252,9 @@ public abstract class SMSDispatcher extends Handler { filter.addAction(Intent.ACTION_DEVICE_STORAGE_FULL); filter.addAction(Intent.ACTION_DEVICE_STORAGE_NOT_FULL); mContext.registerReceiver(mResultReceiver, filter); + + mSmsCapable = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_sms_capable); } public void dispose() { @@ -682,6 +688,7 @@ public abstract class SMSDispatcher extends Handler { * RESULT_ERROR_GENERIC_FAILURE
* RESULT_ERROR_RADIO_OFF
* RESULT_ERROR_NULL_PDU
+ * RESULT_ERROR_NO_SERVICE
. * For RESULT_ERROR_GENERIC_FAILURE the sentIntent may include * the extra "errorCode" containing a radio technology specific value, * generally only useful for troubleshooting.
@@ -709,6 +716,7 @@ public abstract class SMSDispatcher extends Handler { * RESULT_ERROR_GENERIC_FAILURE
* RESULT_ERROR_RADIO_OFF
* RESULT_ERROR_NULL_PDU
+ * RESULT_ERROR_NO_SERVICE
. * For RESULT_ERROR_GENERIC_FAILURE the sentIntent may include * the extra "errorCode" containing a radio technology specific value, * generally only useful for troubleshooting.
@@ -737,7 +745,8 @@ public abstract class SMSDispatcher extends Handler { * or one of these errors: * RESULT_ERROR_GENERIC_FAILURE * RESULT_ERROR_RADIO_OFF - * RESULT_ERROR_NULL_PDU. + * RESULT_ERROR_NULL_PDU + * RESULT_ERROR_NO_SERVICE. * The per-application based SMS control checks sentIntent. If sentIntent * is NULL the caller will be checked against all unknown applications, * which cause smaller number of SMS to be sent in checking period. @@ -763,7 +772,8 @@ public abstract class SMSDispatcher extends Handler { * or one of these errors: * RESULT_ERROR_GENERIC_FAILURE * RESULT_ERROR_RADIO_OFF - * RESULT_ERROR_NULL_PDU. + * RESULT_ERROR_NULL_PDU + * RESULT_ERROR_NO_SERVICE. * The per-application based SMS control checks sentIntent. If sentIntent * is NULL the caller will be checked against all unknown applications, * which cause smaller number of SMS to be sent in checking period. @@ -773,6 +783,16 @@ public abstract class SMSDispatcher extends Handler { */ protected void sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent, PendingIntent deliveryIntent) { + if (!mSmsCapable) { + if (sentIntent != null) { + try { + sentIntent.send(RESULT_ERROR_NO_SERVICE); + } catch (CanceledException ex) {} + } + Log.d(TAG, "Device does not support sms service."); + return; + } + if (pdu == null) { if (sentIntent != null) { try { diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java index 53555d8..01234b0 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java @@ -107,6 +107,13 @@ final class CdmaSMSDispatcher extends SMSDispatcher { return Activity.RESULT_OK; } + if (!mSmsCapable) { + // Device doesn't support SMS service, + Log.d(TAG, "Received short message on device which doesn't support " + + "SMS service. Ignored."); + return Intents.RESULT_SMS_HANDLED; + } + // See if we have a network duplicate SMS. SmsMessage sms = (SmsMessage) smsb; mLastDispatchedSmsFingerprint = sms.getIncomingSmsFingerprint(); diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java b/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java index 70f8f86..497c552 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java @@ -110,6 +110,13 @@ final class GsmSMSDispatcher extends SMSDispatcher { return Intents.RESULT_SMS_HANDLED; } + if (!mSmsCapable) { + // Device doesn't support SMS service, + Log.d(TAG, "Received short message on device which doesn't support " + + "SMS service. Ignored."); + return Intents.RESULT_SMS_HANDLED; + } + // Special case the message waiting indicator messages if (sms.isMWISetMessage()) { mGsmPhone.updateMessageWaitingIndicator(true); -- cgit v1.1