summaryrefslogtreecommitdiffstats
path: root/telephony/java
diff options
context:
space:
mode:
Diffstat (limited to 'telephony/java')
-rw-r--r--telephony/java/android/telephony/SmsManager.java2
-rw-r--r--telephony/java/com/android/internal/telephony/SMSDispatcher.java61
2 files changed, 53 insertions, 10 deletions
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index 598f945..14b1563 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -421,4 +421,6 @@ public final class SmsManager {
static public final int RESULT_ERROR_NULL_PDU = 3;
/** Failed because service is currently unavailable */
static public final int RESULT_ERROR_NO_SERVICE = 4;
+ /** Failed because we reached the sending queue limit. {@hide} */
+ static public final int RESULT_ERROR_LIMIT_EXCEEDED = 5;
}
diff --git a/telephony/java/com/android/internal/telephony/SMSDispatcher.java b/telephony/java/com/android/internal/telephony/SMSDispatcher.java
index d66c20b..bbfc6c9 100644
--- a/telephony/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/SMSDispatcher.java
@@ -61,6 +61,7 @@ import static android.telephony.SmsManager.RESULT_ERROR_GENERIC_FAILURE;
import static android.telephony.SmsManager.RESULT_ERROR_NO_SERVICE;
import static android.telephony.SmsManager.RESULT_ERROR_NULL_PDU;
import static android.telephony.SmsManager.RESULT_ERROR_RADIO_OFF;
+import static android.telephony.SmsManager.RESULT_ERROR_LIMIT_EXCEEDED;
public abstract class SMSDispatcher extends Handler {
@@ -105,6 +106,9 @@ public abstract class SMSDispatcher extends Handler {
/** Alert is timeout */
static final protected int EVENT_ALERT_TIMEOUT = 9;
+ /** Stop the sending */
+ static final protected int EVENT_STOP_SENDING = 10;
+
protected Phone mPhone;
protected Context mContext;
protected ContentResolver mResolver;
@@ -120,6 +124,8 @@ public abstract class SMSDispatcher extends Handler {
private static final int SEND_RETRY_DELAY = 2000;
/** single part SMS */
private static final int SINGLE_PART_SMS = 1;
+ /** Message sending queue limit */
+ private static final int MO_MSG_QUEUE_LIMIT = 5;
/**
* Message reference for a CONCATENATED_8_BIT_REFERENCE or
@@ -130,7 +136,7 @@ public abstract class SMSDispatcher extends Handler {
private SmsCounter mCounter;
- private SmsTracker mSTracker;
+ private ArrayList mSTrackers = new ArrayList(MO_MSG_QUEUE_LIMIT);
/** Wake lock to ensure device stays awake while dispatching the SMS intent. */
private PowerManager.WakeLock mWakeLock;
@@ -214,7 +220,6 @@ public abstract class SMSDispatcher extends Handler {
mContext = phone.getContext();
mResolver = mContext.getContentResolver();
mCm = phone.mCM;
- mSTracker = null;
createWakelock();
@@ -330,17 +335,41 @@ public abstract class SMSDispatcher extends Handler {
case EVENT_ALERT_TIMEOUT:
((AlertDialog)(msg.obj)).dismiss();
msg.obj = null;
- mSTracker = null;
+ if (mSTrackers.isEmpty() == false) {
+ try {
+ SmsTracker sTracker = (SmsTracker)mSTrackers.remove(0);
+ sTracker.mSentIntent.send(RESULT_ERROR_LIMIT_EXCEEDED);
+ } catch (CanceledException ex) {
+ Log.e(TAG, "failed to send back RESULT_ERROR_LIMIT_EXCEEDED");
+ }
+ }
+ if (Config.LOGD) {
+ Log.d(TAG, "EVENT_ALERT_TIMEOUT, message stop sending");
+ }
break;
case EVENT_SEND_CONFIRMED_SMS:
- if (mSTracker!=null) {
- if (isMultipartTracker(mSTracker)) {
- sendMultipartSms(mSTracker);
+ if (mSTrackers.isEmpty() == false) {
+ SmsTracker sTracker = (SmsTracker)mSTrackers.remove(mSTrackers.size() - 1);
+ if (isMultipartTracker(sTracker)) {
+ sendMultipartSms(sTracker);
} else {
- sendSms(mSTracker);
+ sendSms(sTracker);
}
- mSTracker = null;
+ removeMessages(EVENT_ALERT_TIMEOUT, msg.obj);
+ }
+ break;
+
+ case EVENT_STOP_SENDING:
+ if (mSTrackers.isEmpty() == false) {
+ // Remove the latest one.
+ try {
+ SmsTracker sTracker = (SmsTracker)mSTrackers.remove(mSTrackers.size() - 1);
+ sTracker.mSentIntent.send(RESULT_ERROR_LIMIT_EXCEEDED);
+ } catch (CanceledException ex) {
+ Log.e(TAG, "failed to send back RESULT_ERROR_LIMIT_EXCEEDED");
+ }
+ removeMessages(EVENT_ALERT_TIMEOUT, msg.obj);
}
break;
}
@@ -693,6 +722,15 @@ public abstract class SMSDispatcher extends Handler {
* An SmsTracker for the current message.
*/
protected void handleReachSentLimit(SmsTracker tracker) {
+ if (mSTrackers.size() >= MO_MSG_QUEUE_LIMIT) {
+ // Deny the sending when the queue limit is reached.
+ try {
+ tracker.mSentIntent.send(RESULT_ERROR_LIMIT_EXCEEDED);
+ } catch (CanceledException ex) {
+ Log.e(TAG, "failed to send back RESULT_ERROR_LIMIT_EXCEEDED");
+ }
+ return;
+ }
Resources r = Resources.getSystem();
@@ -702,13 +740,13 @@ public abstract class SMSDispatcher extends Handler {
.setTitle(r.getString(R.string.sms_control_title))
.setMessage(appName + " " + r.getString(R.string.sms_control_message))
.setPositiveButton(r.getString(R.string.sms_control_yes), mListener)
- .setNegativeButton(r.getString(R.string.sms_control_no), null)
+ .setNegativeButton(r.getString(R.string.sms_control_no), mListener)
.create();
d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
d.show();
- mSTracker = tracker;
+ mSTrackers.add(tracker);
sendMessageDelayed ( obtainMessage(EVENT_ALERT_TIMEOUT, d),
DEFAULT_SMS_TIMOUEOUT);
}
@@ -819,6 +857,9 @@ public abstract class SMSDispatcher extends Handler {
if (which == DialogInterface.BUTTON_POSITIVE) {
Log.d(TAG, "click YES to send out sms");
sendMessage(obtainMessage(EVENT_SEND_CONFIRMED_SMS));
+ } else if (which == DialogInterface.BUTTON_NEGATIVE) {
+ Log.d(TAG, "click NO to stop sending");
+ sendMessage(obtainMessage(EVENT_STOP_SENDING));
}
}
};