Update send sms status only after sending all parts of the SMS
Bug: 378982497
Test: Manually tested SMS/MMS/CALLS/DATA
FLAG: EXEMPT bugfix
Change-Id: Ic5390da1e273d64d26f2cbdb4f3bdbe6cc1d010d
diff --git a/src/java/com/android/internal/telephony/SmsDispatchersController.java b/src/java/com/android/internal/telephony/SmsDispatchersController.java
index 77fd1f6..58f3490 100644
--- a/src/java/com/android/internal/telephony/SmsDispatchersController.java
+++ b/src/java/com/android/internal/telephony/SmsDispatchersController.java
@@ -1234,7 +1234,7 @@
boolean isOverIms, boolean isLastSmsPart, boolean success) {
notifySmsSentToEmergencyStateTracker(tracker.mDestAddress,
tracker.mMessageId, isOverIms, isLastSmsPart, success);
- notifySmsSentToDatagramDispatcher(tracker.mUniqueMessageId, success);
+ notifySmsSentToDatagramDispatcher(tracker.mUniqueMessageId, isLastSmsPart, success);
}
/**
@@ -1254,9 +1254,11 @@
}
}
- private void notifySmsSentToDatagramDispatcher(long messageId, boolean success) {
+ private void notifySmsSentToDatagramDispatcher(
+ long messageId, boolean isLastSmsPart, boolean success) {
if (SatelliteController.getInstance().shouldSendSmsToDatagramDispatcher(mPhone)) {
- DatagramDispatcher.getInstance().onSendSmsDone(mPhone.getSubId(), messageId, success);
+ DatagramDispatcher.getInstance().onSendSmsDone(
+ mPhone.getSubId(), messageId, isLastSmsPart, success);
}
}
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
index 07530d2..d6b1a70 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
@@ -406,9 +406,10 @@
SomeArgs args = (SomeArgs) msg.obj;
int subId = (int) args.arg1;
long messageId = (long) args.arg2;
- boolean success = (boolean) args.arg3;
+ boolean isLastPartSms = (boolean) args.arg3;
+ boolean success = (boolean) args.arg4;
try {
- handleEventSendSmsDone(subId, messageId, success);
+ handleEventSendSmsDone(subId, messageId, isLastPartSms, success);
} finally {
args.recycle();
}
@@ -1181,13 +1182,15 @@
* Sending MO SMS is completed.
* @param subId subscription ID
* @param messageId message ID of MO SMS
+ * @param isLastSmsPart whether this is the last sms part of MO SMS
* @param success boolean specifying whether MO SMS is successfully sent or not.
*/
- public void onSendSmsDone(int subId, long messageId, boolean success) {
+ public void onSendSmsDone(int subId, long messageId, boolean isLastSmsPart, boolean success) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = subId;
args.arg2 = messageId;
- args.arg3 = success;
+ args.arg3 = isLastSmsPart;
+ args.arg4 = success;
sendMessage(obtainMessage(EVENT_SEND_SMS_DONE, args));
}
@@ -1228,7 +1231,8 @@
pendingSmsMap.clear();
}
- private void handleEventSendSmsDone(int subId, long messageId, boolean success) {
+ private void handleEventSendSmsDone(
+ int subId, long messageId, boolean isLastPartSms, boolean success) {
synchronized (mLock) {
mSendingInProgress = false;
PendingRequest pendingSms = mPendingSmsMap.remove(messageId);
@@ -1236,12 +1240,16 @@
? DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS : DATAGRAM_TYPE_SMS;
plogd("handleEventSendSmsDone subId=" + subId + " messageId=" + messageId
- + " success=" + success);
+ + " isLastPartSms=" + isLastPartSms + " success=" + success
+ + " datagramType=" + datagramType);
+
if (success) {
- // Update send status for current datagram
- mDatagramController.updateSendStatus(subId, datagramType,
- SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS,
- getPendingMessagesCount(), SATELLITE_RESULT_SUCCESS);
+ if (isLastPartSms) {
+ // Update send status only after all parts of the SMS are sent
+ mDatagramController.updateSendStatus(subId, datagramType,
+ SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS,
+ getPendingMessagesCount(), SATELLITE_RESULT_SUCCESS);
+ }
if (datagramType == DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS) {
startMtSmsPollingThrottle();
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
index d964d88..1941518 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
@@ -824,7 +824,8 @@
eq(SATELLITE_RESULT_SUCCESS));
verify(mMockSmsDispatchersController).sendCarrierRoamingNbIotNtnText(eq(mPendingSms));
- mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId, true);
+ mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId,
+ true, true);
processAllMessages();
mInOrder.verify(mMockDatagramController)
@@ -858,7 +859,8 @@
eq(SATELLITE_RESULT_SUCCESS));
verify(mMockSmsDispatchersController).sendCarrierRoamingNbIotNtnText(eq(mPendingSms));
- mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId, false);
+ mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId,
+ true, false);
processAllMessages();
mInOrder.verify(mMockDatagramController)
@@ -1056,7 +1058,8 @@
eq(SATELLITE_RESULT_SUCCESS));
verify(mMockSmsDispatchersController).sendCarrierRoamingNbIotNtnText(eq(mPendingSms));
- mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId, true);
+ mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId,
+ true, true);
processAllMessages();
mInOrder.verify(mMockDatagramController)
@@ -1107,7 +1110,8 @@
processAllMessages();
verifyZeroInteractions(mMockSatelliteModemInterface);
- mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId, true);
+ mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId,
+ true, true);
processAllMessages();
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID), eq(datagramTypeSms),