SatelliteController: check if the subscription is provisioned for non-IP datagram
This is to ensure that the provisioned state is consistent between the
SatelliteController and the SubscriptionManagerService.
Bug: 379338966
Flag: NONE bugfix
Change-Id: I215f6fbf7bfe9dce01972747bb280f4af66afa49
Test: verify using system test that phone number update is working fine
Test: atest SatelliteControllerTest --rerun-until-failure 100
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 27ceadf..65b4770 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -4580,14 +4580,31 @@
boolean provisionChanged = false;
synchronized (mSatelliteTokenProvisionedLock) {
for (SatelliteSubscriberInfo subscriberInfo : newList) {
+
+ int subId = subscriberInfo.getSubId();
Boolean currentProvisioned =
mProvisionedSubscriberId.get(subscriberInfo.getSubscriberId());
- if (currentProvisioned != null && currentProvisioned == provisioned) {
+ if (currentProvisioned == null) {
+ currentProvisioned = false;
+ }
+
+ Boolean isProvisionedInPersistentDb = false;
+ try {
+ isProvisionedInPersistentDb = mSubscriptionManagerService
+ .isSatelliteProvisionedForNonIpDatagram(subId);
+ if (isProvisionedInPersistentDb == null) {
+ isProvisionedInPersistentDb = false;
+ }
+ } catch (IllegalArgumentException | SecurityException ex) {
+ ploge("isSatelliteProvisionedForNonIpDatagram: subId=" + subId + ", ex="
+ + ex);
+ }
+ if (currentProvisioned == provisioned
+ && isProvisionedInPersistentDb == provisioned) {
continue;
}
provisionChanged = true;
mProvisionedSubscriberId.put(subscriberInfo.getSubscriberId(), provisioned);
- int subId = subscriberInfo.getSubId();
try {
mSubscriptionManagerService.setIsSatelliteProvisionedForNonIpDatagram(subId,
provisioned);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
index 876410c..c0c6f63 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -4569,6 +4569,18 @@
}
}
};
+
+ TestSubscriptionManager testSubscriptionManager = new TestSubscriptionManager();
+ doAnswer(invocation -> {
+ testSubscriptionManager.setIsSatelliteProvisionedForNonIpDatagram(
+ invocation.getArgument(0), invocation.getArgument(1));
+ return null;
+ }).when(mMockSubscriptionManagerService).setIsSatelliteProvisionedForNonIpDatagram(anyInt(),
+ anyBoolean());
+ doAnswer(invocation -> testSubscriptionManager.isSatelliteProvisionedForNonIpDatagram(
+ invocation.getArgument(0))).when(
+ mMockSubscriptionManagerService).isSatelliteProvisionedForNonIpDatagram(anyInt());
+
setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
verifySatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
int errorCode = mSatelliteControllerUT.registerForSatelliteProvisionStateChanged(callback);
@@ -6022,4 +6034,21 @@
assertTrue(mSharedPreferences.getBoolean(
SatelliteController.NTN_SMS_SUPPORTED_BY_MESSAGES_APP_KEY, false));
}
+
+ private static class TestSubscriptionManager {
+ public Map<Integer, Boolean> mSatelliteProvisionedForNonIpDatagram = new HashMap<>();
+
+ public void resetProvisionMapForNonIpDatagram() {
+ mSatelliteProvisionedForNonIpDatagram.clear();
+ }
+
+ public void setIsSatelliteProvisionedForNonIpDatagram(int subId, boolean provisioned) {
+ mSatelliteProvisionedForNonIpDatagram.put(subId, provisioned);
+ }
+
+ public boolean isSatelliteProvisionedForNonIpDatagram(int subId) {
+ Boolean isProvisioned = mSatelliteProvisionedForNonIpDatagram.get(subId);
+ return isProvisioned != null ? isProvisioned : false;
+ }
+ }
}