Allow GsmSMSDispatcher to send MtSmsPollingMessage while not in service.
The CL includes:
- Remove the state in-service check for MT SMS poll messages GsmSMSDispatcher.
- Fix the logic for mShouldPollMtSms to allow retry sending check message if sending fails.
Bug: 385011293
Test: atest GsmSmsDispatcherTest, DatagramDispatcherTest
FLAG: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:99126fdf5fd8623287f0d9b381b5f78355b8a8e4)
Merged-In: I6f685138fd15db486ac6341b39be457949e6305d
Change-Id: I6f685138fd15db486ac6341b39be457949e6305d
diff --git a/src/java/com/android/internal/telephony/SMSDispatcher.java b/src/java/com/android/internal/telephony/SMSDispatcher.java
index 88b9958..fac4358 100644
--- a/src/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/src/java/com/android/internal/telephony/SMSDispatcher.java
@@ -2626,7 +2626,7 @@
}
@VisibleForTesting
- public SmsTracker(String destAddr, long messageId) {
+ public SmsTracker(String destAddr, long messageId, String messageText) {
mData = null;
mSentIntent = null;
mDeliveryIntent = null;
@@ -2643,6 +2643,7 @@
mSkipShortCodeDestAddrCheck = false;
mUniqueMessageId = 0;
mResultCodeFromCarrierMessagingService = CarrierMessagingService.SEND_STATUS_OK;
+ mFullMessageText = messageText;
}
public HashMap<String, Object> getData() {
@@ -2683,6 +2684,22 @@
}
/**
+ * Check if the message is a MT SMS polling message.
+ *
+ * @param context The Context
+ * @return true if the message is a MT SMS polling message, false otherwise.
+ */
+ public boolean isMtSmsPollingMessage(Context context) {
+ if (mFullMessageText == null) {
+ return false;
+ }
+
+ String mtSmsPollingText =
+ context.getResources().getString(R.string.config_mt_sms_polling_text);
+ return mFullMessageText.equals(mtSmsPollingText);
+ }
+
+ /**
* Update the status of this message if we persisted it
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
diff --git a/src/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java b/src/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
index e5afbeb..25a83bd 100644
--- a/src/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
+++ b/src/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
@@ -24,6 +24,7 @@
import android.os.Message;
import android.telephony.ServiceState;
+import com.android.internal.R;
import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails;
import com.android.internal.telephony.InboundSmsHandler;
import com.android.internal.telephony.Phone;
@@ -165,8 +166,13 @@
+ " SS=" + ss
+ " " + SmsController.formatCrossStackMessageId(tracker.mMessageId));
+ boolean allowCheckMessageInNotConnected =
+ mContext.getResources()
+ .getBoolean(R.bool.config_satellite_allow_check_message_in_not_connected);
+ boolean mtPollingMessageThatsAllowedInOOS =
+ tracker.isMtSmsPollingMessage(mContext) && allowCheckMessageInNotConnected;
// if sms over IMS is not supported on data and voice is not available...
- if (!isIms() && ss != ServiceState.STATE_IN_SERVICE) {
+ if (!isIms() && ss != ServiceState.STATE_IN_SERVICE && !mtPollingMessageThatsAllowedInOOS) {
//In 5G case only Data Rat is reported.
if(mPhone.getServiceState().getRilDataRadioTechnology()
!= ServiceState.RIL_RADIO_TECHNOLOGY_NR) {
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
index 5c3bcb0..7c2851a 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
@@ -1254,6 +1254,7 @@
getPendingMessagesCount(), SATELLITE_RESULT_SUCCESS);
if (datagramType == DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS) {
startMtSmsPollingThrottle();
+ mShouldPollMtSms = false;
}
} else {
// Update send status
@@ -1295,7 +1296,9 @@
}
plogd("sendMtSmsPollingMessage");
- mShouldPollMtSms = false;
+ if (!allowCheckMessageInNotConnected()) {
+ mShouldPollMtSms = false;
+ }
for (Entry<Long, PendingRequest> entry : mPendingSmsMap.entrySet()) {
PendingRequest pendingRequest = entry.getValue();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SmsDispatchersControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/SmsDispatchersControllerTest.java
index b8316cb..15e6ee2 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SmsDispatchersControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SmsDispatchersControllerTest.java
@@ -132,7 +132,7 @@
}
private SMSDispatcher.SmsTracker getSmsTracker(String destAddr, long messageId) {
- return new SMSDispatcher.SmsTracker(destAddr, messageId);
+ return new SMSDispatcher.SmsTracker(destAddr, messageId, "testMessage");
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmSmsDispatcherTest.java b/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmSmsDispatcherTest.java
index a29de0f..a31be59 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmSmsDispatcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmSmsDispatcherTest.java
@@ -23,6 +23,7 @@
import static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
@@ -45,6 +46,7 @@
import android.content.pm.ServiceInfo;
import android.location.Country;
import android.location.CountryDetector;
+import android.net.Uri;
import android.os.Binder;
import android.os.HandlerThread;
import android.os.Message;
@@ -54,6 +56,7 @@
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.ICarrierMessagingCallback;
import android.service.carrier.ICarrierMessagingService;
+import android.telephony.ServiceState;
import android.telephony.SmsManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -63,6 +66,7 @@
import androidx.test.filters.MediumTest;
import androidx.test.filters.SmallTest;
+import com.android.internal.R;
import com.android.internal.telephony.ContextFixture;
import com.android.internal.telephony.ISub;
import com.android.internal.telephony.SMSDispatcher;
@@ -643,4 +647,53 @@
byte[] pdu = IccUtils.hexStringToBytes(pduCaptor.getValue());
assertEquals(0, pdu[1]);
}
+
+ @Test
+ public void testSendRawPdu_isMtSmsPollingMessage_doesNotCallOnFailed() throws Exception {
+ setupMockPackagePermissionChecks();
+ mContextFixture.addCallingOrSelfPermission(ContextFixture.PERMISSION_ENABLE_ALL);
+ // return a fake value to pass getData()
+ HashMap data = new HashMap<String, String>();
+ data.put("pdu", new byte[1]);
+ when(mSmsTracker.getData()).thenReturn(data);
+ when(mSmsTracker.getAppPackageName()).thenReturn("");
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 1);
+ // Set isIms() false
+ doReturn(false).when(mSmsDispatchersController).isIms();
+ mContextFixture.putBooleanResource(
+ R.bool.config_satellite_allow_check_message_in_not_connected, true);
+ // Set ServiceState to OOS
+ doReturn(new ServiceState()).when(mPhone).getServiceState();
+ // Set isMtSmsPollingMessage to true
+ when(mSmsTracker.isMtSmsPollingMessage(any())).thenReturn(true);
+
+ mGsmSmsDispatcher.sendRawPdu(new SMSDispatcher.SmsTracker[] {mSmsTracker});
+ processAllMessages();
+
+ verify(mSmsTracker, times(0)).onFailed(any(), anyInt(), anyInt());
+ }
+
+ @Test
+ public void testSmsTracker_isMtSmsPollingMessage_returnsTrue() throws Exception {
+ String mtSmsPollingText = "mt_sms_polling_text";
+ mContextFixture.putResource(R.string.config_mt_sms_polling_text, mtSmsPollingText);
+ SMSDispatcher.SmsTracker tracker =
+ new SMSDispatcher.SmsTracker("destAddr", 0L, mtSmsPollingText);
+
+ boolean isMtSmsPollingMessage = tracker.isMtSmsPollingMessage(mContext);
+
+ assertTrue(isMtSmsPollingMessage);
+ }
+
+ @Test
+ public void testSmsTracker_isMtSmsPollingMessage_returnsFalse() throws Exception {
+ mContextFixture.putResource(R.string.config_mt_sms_polling_text, "mt_sms_polling_text");
+ SMSDispatcher.SmsTracker tracker =
+ new SMSDispatcher.SmsTracker("destAddr", 0L, "wrong_text");
+
+ boolean isMtSmsPollingMessage = tracker.isMtSmsPollingMessage(mContext);
+
+ assertFalse(isMtSmsPollingMessage);
+ }
}