Add requestRegionalSatelliteConfigurationForCurrentLocation and onRegionalSatelliteConfigurationChanged
Bug: 371438277
Flag: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn
Test: atest
SatelliteAccessControllerTest(http://ab/I58000010332908616-pass)
Test: Manually verified satellite is working well in both demo and real(b/371438277#comment4)
Change-Id: Ic8363191ff9f5750916bbe33481c33b1ad914af2
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index bd90a9d..6c52af2 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -13723,6 +13723,29 @@
}
/**
+ * Request to get satellite access configuration for the current location.
+ *
+ * @param result The result receiver that returns the satellite access configuration
+ * for the current location if the request is successful or an error code
+ * if the request failed.
+ *
+ * @throws SecurityException if the caller doesn't have the required permission.
+ */
+ @Override
+ public void requestSatelliteAccessConfigurationForCurrentLocation(
+ @NonNull ResultReceiver result) {
+ enforceSatelliteCommunicationPermission(
+ "requestSatelliteAccessConfigurationForCurrentLocation");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mSatelliteAccessController
+ .requestSatelliteAccessConfigurationForCurrentLocation(result);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
* Request to get the time after which the satellite will be visible.
*
* @param result The result receiver that returns the time after which the satellite will
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index 49edf6a..2571bbc 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -16,6 +16,7 @@
package com.android.phone.satellite.accesscontrol;
+import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_ACCESS_CONFIGURATION;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_PROVISIONED;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_SUPPORTED;
@@ -24,6 +25,7 @@
import static android.telephony.satellite.SatelliteManager.SATELLITE_DISALLOWED_REASON_NOT_IN_ALLOWED_REGION;
import static android.telephony.satellite.SatelliteManager.SATELLITE_DISALLOWED_REASON_UNSUPPORTED_DEFAULT_MSG_APP;
import static android.telephony.satellite.SatelliteManager.SATELLITE_DISALLOWED_REASON_LOCATION_DISABLED;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_LOCATION_DISABLED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_LOCATION_NOT_AVAILABLE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED;
@@ -78,6 +80,7 @@
import android.telephony.satellite.ISatelliteDisallowedReasonsCallback;
import android.telephony.satellite.ISatelliteProvisionStateCallback;
import android.telephony.satellite.ISatelliteSupportedStateCallback;
+import android.telephony.satellite.SatelliteAccessConfiguration;
import android.telephony.satellite.SatelliteManager;
import android.telephony.satellite.SatelliteSubscriberProvisionStatus;
import android.text.TextUtils;
@@ -116,6 +119,7 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@@ -160,6 +164,8 @@
protected static final int EVENT_LOCATION_SETTINGS_ENABLED = 6;
public static final int DEFAULT_REGIONAL_SATELLITE_CONFIG_ID = 0;
+ public static final int UNKNOWN_REGIONAL_SATELLITE_CONFIG_ID = -1;
+
private static final String KEY_AVAILABLE_NOTIFICATION_SHOWN = "available_notification_shown";
private static final String KEY_UNAVAILABLE_NOTIFICATION_SHOWN =
@@ -260,11 +266,11 @@
private long mOverriddenLocationFreshDurationNanos;
@GuardedBy("mLock")
@NonNull
- private final Map<SatelliteOnDeviceAccessController.LocationToken, Boolean>
+ private final Map<SatelliteOnDeviceAccessController.LocationToken, Integer>
mCachedAccessRestrictionMap = new LinkedHashMap<>() {
@Override
protected boolean removeEldestEntry(
- Entry<SatelliteOnDeviceAccessController.LocationToken, Boolean> eldest) {
+ Entry<SatelliteOnDeviceAccessController.LocationToken, Integer> eldest) {
return size() > MAX_CACHE_SIZE;
}
};
@@ -277,7 +283,15 @@
private Location mFreshLastKnownLocation = null;
@GuardedBy("mLock")
@Nullable
- private Integer mRegionalConfigId = null;
+ protected Integer mRegionalConfigId = null;
+ @GuardedBy("mLock")
+ @Nullable
+ protected Integer mNewRegionalConfigId = null;
+
+ /** Key: Config ID; Value: SatelliteAccessConfiguration */
+ @NonNull
+ private HashMap<Integer, SatelliteAccessConfiguration> mSatelliteAccessConfigMap =
+ new HashMap<>();
/** These are used for CTS test */
private Path mCtsSatS2FilePath = null;
@@ -522,6 +536,13 @@
mCurrentSatelliteAllowedState = isAllowed;
notifySatelliteCommunicationAllowedStateChanged(isAllowed);
mControllerMetricsStats.reportAllowedStateChanged();
+ if (!isAllowed) {
+ synchronized (mLock) {
+ plogd("updateCurrentSatelliteAllowedState : set mNewRegionalConfigId null");
+ mNewRegionalConfigId = null;
+ }
+ }
+ updateRegionalConfigId();
}
}
}
@@ -594,6 +615,66 @@
}
/**
+ * Request to get satellite access configuration for the current location.
+ *
+ * @param result The result receiver that returns satellite access configuration
+ * for the current location if the request is successful or an error code
+ * if the request failed.
+ */
+ public void requestSatelliteAccessConfigurationForCurrentLocation(
+ @NonNull ResultReceiver result) {
+ if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
+ plogd("carrierRoamingNbIotNtnFlag is disabled");
+ result.send(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, null);
+ return;
+ }
+ plogd("requestSatelliteAccessConfigurationForCurrentLocation");
+ ResultReceiver internalResultReceiver = new ResultReceiver(this) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ plogd("requestSatelliteAccessConfigurationForCurrentLocation: resultCode="
+ + resultCode + ", resultData=" + resultData);
+ boolean isSatelliteCommunicationAllowed = false;
+ if (resultCode == SATELLITE_RESULT_SUCCESS) {
+ if (resultData.containsKey(KEY_SATELLITE_COMMUNICATION_ALLOWED)) {
+ isSatelliteCommunicationAllowed =
+ resultData.getBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED);
+ } else {
+ loge("KEY_SATELLITE_COMMUNICATION_ALLOWED does not exist.");
+ result.send(SATELLITE_RESULT_INVALID_TELEPHONY_STATE, null);
+ return;
+ }
+ } else {
+ loge("resultCode is not SATELLITE_RESULT_SUCCESS.");
+ result.send(resultCode, null);
+ return;
+ }
+
+ SatelliteAccessConfiguration satelliteAccessConfig = null;
+ synchronized (mLock) {
+ if (isSatelliteCommunicationAllowed && isRegionalConfigIdValid(
+ mRegionalConfigId)) {
+ plogd("requestSatelliteAccessConfigurationForCurrentLocation : "
+ + "mRegionalConfigId is " + mRegionalConfigId);
+ satelliteAccessConfig =
+ mSatelliteAccessConfigMap.get(mRegionalConfigId);
+ }
+ }
+ plogd("requestSatelliteAccessConfigurationForCurrentLocation : "
+ + "satelliteAccessConfig is " + satelliteAccessConfig);
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(KEY_SATELLITE_ACCESS_CONFIGURATION, satelliteAccessConfig);
+ result.send(resultCode, bundle);
+ }
+ };
+ requestIsCommunicationAllowedForCurrentLocation(internalResultReceiver, false);
+ }
+
+ private boolean isRegionalConfigIdValid(@Nullable Integer configId) {
+ return (configId != null && configId >= 0);
+ }
+
+ /**
* This API should be used by only CTS tests to override the overlay configs of satellite
* access controller.
*/
@@ -1125,8 +1206,8 @@
if (isRegionDisallowed(networkCountryIsoList)) {
Bundle bundle = new Bundle();
bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
- mAccessControllerMetricsStats.setAccessControlType(
- SatelliteConstants.ACCESS_CONTROL_TYPE_NETWORK_COUNTRY_CODE)
+ mAccessControllerMetricsStats.setAccessControlType(SatelliteConstants
+ .ACCESS_CONTROL_TYPE_NETWORK_COUNTRY_CODE)
.setCountryCodes(networkCountryIsoList);
sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
false);
@@ -1704,8 +1785,11 @@
location.getLatitude(),
location.getLongitude(), mS2Level);
boolean satelliteAllowed;
+
if (mCachedAccessRestrictionMap.containsKey(locationToken)) {
- satelliteAllowed = mCachedAccessRestrictionMap.get(locationToken);
+ mNewRegionalConfigId = mCachedAccessRestrictionMap.get(locationToken);
+ satelliteAllowed = (mNewRegionalConfigId != null);
+ plogd("mNewRegionalConfigId is " + mNewRegionalConfigId);
} else {
if (!initSatelliteOnDeviceAccessController()) {
ploge("Failed to init SatelliteOnDeviceAccessController");
@@ -1718,16 +1802,20 @@
if (mFeatureFlags.carrierRoamingNbIotNtn()) {
synchronized (mLock) {
- mRegionalConfigId = mSatelliteOnDeviceAccessController
+ mNewRegionalConfigId = mSatelliteOnDeviceAccessController
.getRegionalConfigIdForLocation(locationToken);
- plogd("mRegionalConfigId is " + mRegionalConfigId);
- satelliteAllowed = (mRegionalConfigId != null);
+ plogd("mNewRegionalConfigId is " + mNewRegionalConfigId);
+ satelliteAllowed = (mNewRegionalConfigId != null);
}
} else {
+ plogd("checkSatelliteAccessRestrictionForLocation: "
+ + "carrierRoamingNbIotNtn is disabled");
satelliteAllowed = mSatelliteOnDeviceAccessController
.isSatCommunicationAllowedAtLocation(locationToken);
+ mNewRegionalConfigId =
+ satelliteAllowed ? UNKNOWN_REGIONAL_SATELLITE_CONFIG_ID : null;
}
- updateCachedAccessRestrictionMap(locationToken, satelliteAllowed);
+ updateCachedAccessRestrictionMap(locationToken, mNewRegionalConfigId);
}
mAccessControllerMetricsStats.setOnDeviceLookupTime(mOnDeviceLookupStartTimeMillis);
Bundle bundle = new Bundle();
@@ -1756,11 +1844,23 @@
}
}
+ private void updateRegionalConfigId() {
+ synchronized (mLock) {
+ plogd("mNewRegionalConfigId: updatedValue = " + mNewRegionalConfigId
+ + " | mRegionalConfigId: beforeValue = " + mRegionalConfigId);
+ if (!Objects.equals(mRegionalConfigId, mNewRegionalConfigId)) {
+ mRegionalConfigId = mNewRegionalConfigId;
+ notifyRegionalSatelliteConfigurationChanged(
+ mSatelliteAccessConfigMap.get(mRegionalConfigId));
+ }
+ }
+ }
+
private void updateCachedAccessRestrictionMap(
@NonNull SatelliteOnDeviceAccessController.LocationToken locationToken,
- boolean satelliteAllowed) {
+ Integer regionalConfigId) {
synchronized (mLock) {
- mCachedAccessRestrictionMap.put(locationToken, satelliteAllowed);
+ mCachedAccessRestrictionMap.put(locationToken, regionalConfigId);
}
}
@@ -2199,6 +2299,14 @@
logd("registerForCommunicationAllowedStateChanged: "
+ "mCurrentSatelliteAllowedState " + mCurrentSatelliteAllowedState);
}
+ synchronized (mLock) {
+ SatelliteAccessConfiguration satelliteAccessConfig =
+ mSatelliteAccessConfigMap.get(mRegionalConfigId);
+ callback.onSatelliteAccessConfigurationChanged(satelliteAccessConfig);
+ logd("registerForCommunicationAllowedStateChanged: satelliteAccessConfig: "
+ + satelliteAccessConfig + " of mRegionalConfigId: "
+ + mRegionalConfigId);
+ }
} catch (RemoteException ex) {
ploge("registerForCommunicationAllowedStateChanged: RemoteException ex=" + ex);
}
@@ -2382,6 +2490,25 @@
});
}
+ protected void notifyRegionalSatelliteConfigurationChanged(
+ @Nullable SatelliteAccessConfiguration satelliteAccessConfig) {
+ plogd("notifyRegionalSatelliteConfigurationChanged : satelliteAccessConfig is "
+ + satelliteAccessConfig);
+
+ List<ISatelliteCommunicationAllowedStateCallback> deadCallersList = new ArrayList<>();
+ mSatelliteCommunicationAllowedStateChangedListeners.values().forEach(listener -> {
+ try {
+ listener.onSatelliteAccessConfigurationChanged(satelliteAccessConfig);
+ } catch (RemoteException e) {
+ plogd("handleEventNtnSignalStrengthChanged RemoteException: " + e);
+ deadCallersList.add(listener);
+ }
+ });
+ deadCallersList.forEach(listener -> {
+ mSatelliteCommunicationAllowedStateChangedListeners.remove(listener.asBinder());
+ });
+ }
+
private void reportMetrics(int resultCode, boolean allowed) {
if (resultCode == SATELLITE_RESULT_SUCCESS) {
mControllerMetricsStats.reportAllowedSatelliteAccessCount(allowed);
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index c2f5979..5c18cc5 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -17,6 +17,8 @@
package com.android.phone.satellite.accesscontrol;
import static android.location.LocationManager.MODE_CHANGED_ACTION;
+import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
+import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_ACCESS_CONFIGURATION;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_PROVISIONED;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_SUPPORTED;
@@ -29,15 +31,17 @@
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.ALLOWED_STATE_CACHE_VALID_DURATION_NANOS;
-import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.DEFAULT_REGIONAL_SATELLITE_CONFIG_ID;
-import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.EVENT_COUNTRY_CODE_CHANGED;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.CMD_IS_SATELLITE_COMMUNICATION_ALLOWED;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.DEFAULT_DELAY_MINUTES_BEFORE_VALIDATING_POSSIBLE_CHANGE_IN_ALLOWED_REGION;
+import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.DEFAULT_MAX_RETRY_COUNT_FOR_VALIDATING_POSSIBLE_CHANGE_IN_ALLOWED_REGION;
+import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.DEFAULT_REGIONAL_SATELLITE_CONFIG_ID;
+import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.DEFAULT_S2_LEVEL;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.DEFAULT_THROTTLE_INTERVAL_FOR_LOCATION_QUERY_MINUTES;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.EVENT_CONFIG_DATA_UPDATED;
+import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.EVENT_COUNTRY_CODE_CHANGED;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.EVENT_WAIT_FOR_CURRENT_LOCATION_TIMEOUT;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.GOOGLE_US_SAN_SAT_S2_FILE_NAME;
-import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.DEFAULT_MAX_RETRY_COUNT_FOR_VALIDATING_POSSIBLE_CHANGE_IN_ALLOWED_REGION;
+import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.UNKNOWN_REGIONAL_SATELLITE_CONFIG_ID;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -51,6 +55,7 @@
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
@@ -83,13 +88,18 @@
import android.os.DropBoxManager;
import android.os.Handler;
import android.os.HandlerThread;
+import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.Parcel;
import android.os.ResultReceiver;
import android.os.UserHandle;
import android.telecom.TelecomManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.telephony.satellite.ISatelliteCommunicationAllowedStateCallback;
+import android.telephony.satellite.SatelliteAccessConfiguration;
+import android.telephony.satellite.SatelliteInfo;
import android.telephony.satellite.SatelliteManager;
import android.testing.TestableLooper;
import android.util.Log;
@@ -124,6 +134,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -188,15 +199,16 @@
@Mock
private SharedPreferences.Editor mMockSharedPreferencesEditor;
@Mock
- private Map<SatelliteOnDeviceAccessController.LocationToken, Boolean>
+ private Map<SatelliteOnDeviceAccessController.LocationToken, Integer>
mMockCachedAccessRestrictionMap;
@Mock
+ HashMap<Integer, SatelliteAccessConfiguration> mMockSatelliteAccessConfigMap;
+
+ @Mock
private Intent mMockLocationIntent;
@Mock
private Set<ResultReceiver> mMockSatelliteAllowResultReceivers;
@Mock
- private ResultReceiver mMockSatelliteSupportedResultReceiver;
- @Mock
private TelephonyManager mMockTelephonyManager;
@Mock
private PackageManager mMockPackageManager;
@@ -206,7 +218,11 @@
private NotificationManager mMockNotificationManager;
@Mock
private ApplicationInfo mMockApplicationInfo;
-
+ @Mock
+ private ResultReceiver mMockResultReceiver;
+ @Mock
+ private ConcurrentHashMap<IBinder, ISatelliteCommunicationAllowedStateCallback>
+ mSatelliteCommunicationAllowedStateCallbackMap;
private Looper mLooper;
private TestableLooper mTestableLooper;
@@ -241,6 +257,8 @@
private ArgumentCaptor<Integer> mResultCodeIntCaptor;
@Captor
private ArgumentCaptor<Bundle> mResultDataBundleCaptor;
+ @Captor
+ private ArgumentCaptor<ISatelliteCommunicationAllowedStateCallback> mAllowedStateCallbackCaptor;
private boolean mQueriedSatelliteAllowed = false;
private int mQueriedSatelliteAllowedResultCode = SATELLITE_RESULT_SUCCESS;
@@ -304,6 +322,7 @@
mMockCountryDetector);
when(mMockSatelliteController.getSatellitePhone()).thenReturn(mMockPhone);
when(mMockPhone.getSubId()).thenReturn(SubscriptionManager.getDefaultSubscriptionId());
+
when(mMockContext.getResources()).thenReturn(mMockResources);
when(mMockResources.getStringArray(
com.android.internal.R.array.config_oem_enabled_satellite_country_codes))
@@ -430,11 +449,11 @@
// and allowedState is false when the location is null and the cache is expired
mSatelliteAccessControllerUT.elapsedRealtimeNanos =
ALLOWED_STATE_CACHE_VALID_DURATION_NANOS + 1;
- Iterator<ResultReceiver> mockIterator = mock(Iterator.class);
- doReturn(mockIterator).when(mMockSatelliteAllowResultReceivers).iterator();
- doReturn(true, false).when(mockIterator).hasNext();
+ Iterator<ResultReceiver> mockResultReceiverIterator = mock(Iterator.class);
+ doReturn(mockResultReceiverIterator).when(mMockSatelliteAllowResultReceivers).iterator();
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
doNothing().when(mMockSatelliteAllowResultReceivers).clear();
- doReturn(mMockSatelliteSupportedResultReceiver).when(mockIterator).next();
+ doReturn(mMockResultReceiver).when(mockResultReceiverIterator).next();
replaceInstance(SatelliteAccessController.class, "mSatelliteAllowResultReceivers",
mSatelliteAccessControllerUT, mMockSatelliteAllowResultReceivers);
mSatelliteAccessControllerUT.setIsSatelliteCommunicationAllowedForCurrentLocationCache(
@@ -442,7 +461,7 @@
mSatelliteAccessControllerUT.setLocationRequestCancellationSignalAsNull(false);
sendCurrentLocationTimeoutEvent();
- verify(mMockSatelliteSupportedResultReceiver)
+ verify(mMockResultReceiver)
.send(mResultCodeIntCaptor.capture(), any());
assertEquals(Integer.valueOf(SATELLITE_RESULT_LOCATION_NOT_AVAILABLE),
mResultCodeIntCaptor.getValue());
@@ -514,6 +533,314 @@
.isSatelliteAccessAllowedForLocation(List.of(TEST_SATELLITE_COUNTRY_CODE_US)));
}
+
+ private void setSatelliteCommunicationAllowed() throws Exception {
+ when(mMockContext.getResources()).thenReturn(mMockResources);
+ when(mMockResources.getBoolean(
+ com.android.internal.R.bool.config_oem_enabled_satellite_access_allow))
+ .thenReturn(TEST_SATELLITE_ALLOW);
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS);
+ doReturn(true).when(mMockLocationManager).isLocationEnabled();
+ when(mMockSatelliteOnDeviceAccessController.getRegionalConfigIdForLocation(
+ any(SatelliteOnDeviceAccessController.LocationToken.class)))
+ .thenReturn(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID);
+ replaceInstance(SatelliteAccessController.class, "mCachedAccessRestrictionMap",
+ mSatelliteAccessControllerUT, mMockCachedAccessRestrictionMap);
+ doReturn(true).when(mMockCachedAccessRestrictionMap).containsKey(any());
+ doReturn(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID)
+ .when(mMockCachedAccessRestrictionMap).get(any());
+ }
+
+ @Test
+ public void testRequestSatelliteAccessConfigurationForCurrentLocation() throws Exception {
+ // setup result receiver and satellite access configuration data
+ ResultReceiver mockResultReceiver = mock(ResultReceiver.class);
+ ArgumentCaptor<Integer> resultCodeCaptor = ArgumentCaptor.forClass(Integer.class);
+ ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
+ SatelliteAccessConfiguration satelliteAccessConfig = getSatelliteAccessConfiguration();
+
+ // setup satellite communication allwed state as true
+ setSatelliteCommunicationAllowed();
+
+ // setup map data of location and configId.
+ replaceInstance(SatelliteAccessController.class, "mSatelliteAccessConfigMap",
+ mSatelliteAccessControllerUT, mMockSatelliteAccessConfigMap);
+ doReturn(satelliteAccessConfig).when(mMockSatelliteAccessConfigMap).get(anyInt());
+ doReturn(null).when(mMockSatelliteAccessConfigMap).get(eq(null));
+ doReturn(null).when(mMockSatelliteAccessConfigMap)
+ .get(eq(UNKNOWN_REGIONAL_SATELLITE_CONFIG_ID));
+
+ // setup callback
+ ISatelliteCommunicationAllowedStateCallback mockSatelliteAllowedStateCallback = mock(
+ ISatelliteCommunicationAllowedStateCallback.class);
+ ArgumentCaptor<SatelliteAccessConfiguration> satelliteAccessConfigurationCaptor =
+ ArgumentCaptor.forClass(SatelliteAccessConfiguration.class);
+
+ when(mSatelliteCommunicationAllowedStateCallbackMap.values())
+ .thenReturn(List.of(mockSatelliteAllowedStateCallback));
+ replaceInstance(SatelliteAccessController.class,
+ "mSatelliteCommunicationAllowedStateChangedListeners", mSatelliteAccessControllerUT,
+ mSatelliteCommunicationAllowedStateCallbackMap);
+
+ // Test when the featureFlags.carrierRoamingNbIotNtn() is false
+ doReturn(false).when(mMockFeatureFlags).carrierRoamingNbIotNtn();
+
+ clearInvocations(mockResultReceiver);
+ mSatelliteAccessControllerUT
+ .requestSatelliteAccessConfigurationForCurrentLocation(mockResultReceiver);
+ mTestableLooper.processAllMessages();
+ verify(mockResultReceiver, times(1)).send(resultCodeCaptor.capture(),
+ bundleCaptor.capture());
+ assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, (int) resultCodeCaptor.getValue());
+ assertNull(bundleCaptor.getValue());
+ verify(mockSatelliteAllowedStateCallback, never())
+ .onSatelliteAccessConfigurationChanged(any());
+
+ doReturn(true).when(mMockFeatureFlags).carrierRoamingNbIotNtn();
+
+ // satellite communication allowed state is enabled and
+ // regional config id is DEFAULT_REGIONAL_SATELLITE_CONFIG_ID.
+ clearInvocations(mockResultReceiver);
+ clearInvocations(mockSatelliteAllowedStateCallback);
+ mSatelliteAccessControllerUT
+ .requestSatelliteAccessConfigurationForCurrentLocation(mockResultReceiver);
+ mTestableLooper.processAllMessages();
+ verify(mockResultReceiver, times(1)).send(resultCodeCaptor.capture(),
+ bundleCaptor.capture());
+ assertEquals(SatelliteManager.SATELLITE_RESULT_SUCCESS, (int) resultCodeCaptor.getValue());
+ assertTrue(bundleCaptor.getValue().containsKey(KEY_SATELLITE_ACCESS_CONFIGURATION));
+ assertSame(bundleCaptor.getValue().getParcelable(KEY_SATELLITE_ACCESS_CONFIGURATION,
+ SatelliteAccessConfiguration.class), satelliteAccessConfig);
+ verify(mockSatelliteAllowedStateCallback, times(1))
+ .onSatelliteAccessConfigurationChanged(
+ satelliteAccessConfigurationCaptor.capture());
+ assertEquals(satelliteAccessConfigurationCaptor.getValue(), satelliteAccessConfig);
+
+ // satellite communication allowed state is disabled and
+ // regional config id is null.
+ clearInvocations(mockResultReceiver);
+ clearInvocations(mockSatelliteAllowedStateCallback);
+ when(mMockCachedAccessRestrictionMap.get(any())).thenReturn(null);
+ mSatelliteAccessControllerUT
+ .requestSatelliteAccessConfigurationForCurrentLocation(mockResultReceiver);
+ mTestableLooper.processAllMessages();
+
+ verify(mockResultReceiver, times(1)).send(resultCodeCaptor.capture(),
+ bundleCaptor.capture());
+ assertEquals(SATELLITE_RESULT_SUCCESS, (int) resultCodeCaptor.getValue());
+ assertTrue(bundleCaptor.getValue().containsKey(KEY_SATELLITE_ACCESS_CONFIGURATION));
+ assertNull(bundleCaptor.getValue().getParcelable(KEY_SATELLITE_ACCESS_CONFIGURATION,
+ SatelliteAccessConfiguration.class));
+ verify(mockSatelliteAllowedStateCallback, times(1))
+ .onSatelliteAccessConfigurationChanged(
+ satelliteAccessConfigurationCaptor.capture());
+ assertNull(satelliteAccessConfigurationCaptor.getValue());
+ }
+
+ private SatelliteAccessConfiguration getSatelliteAccessConfiguration() {
+ Parcel satelliteAccessconfigParcel = Parcel.obtain();
+
+ List<SatelliteInfo> satelliteInfoList = new ArrayList<>();
+ satelliteInfoList.add(mock(SatelliteInfo.class));
+ satelliteAccessconfigParcel.writeTypedList(satelliteInfoList);
+
+ List<Integer> tagIds = new ArrayList<>(List.of(1, 2));
+ satelliteAccessconfigParcel.writeList(tagIds);
+
+ return new SatelliteAccessConfiguration(satelliteAccessconfigParcel);
+ }
+
+ @Test
+ public void testRegisterForCommunicationAllowedStateChanged() throws Exception {
+ ISatelliteCommunicationAllowedStateCallback mockSatelliteAllowedStateCallback = mock(
+ ISatelliteCommunicationAllowedStateCallback.class);
+ doReturn(true).when(mSatelliteCommunicationAllowedStateCallbackMap)
+ .put(any(IBinder.class), any(ISatelliteCommunicationAllowedStateCallback.class));
+ replaceInstance(SatelliteAccessController.class,
+ "mSatelliteCommunicationAllowedStateChangedListeners", mSatelliteAccessControllerUT,
+ mSatelliteCommunicationAllowedStateCallbackMap);
+
+ doReturn(false).when(mMockFeatureFlags).oemEnabledSatelliteFlag();
+ int result = mSatelliteAccessControllerUT.registerForCommunicationAllowedStateChanged(
+ DEFAULT_SUBSCRIPTION_ID, mockSatelliteAllowedStateCallback);
+ mTestableLooper.processAllMessages();
+ assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, result);
+ verify(mockSatelliteAllowedStateCallback, never())
+ .onSatelliteCommunicationAllowedStateChanged(anyBoolean());
+ verify(mockSatelliteAllowedStateCallback, never())
+ .onSatelliteAccessConfigurationChanged(any(SatelliteAccessConfiguration.class));
+
+ doReturn(true).when(mMockFeatureFlags).oemEnabledSatelliteFlag();
+ result = mSatelliteAccessControllerUT.registerForCommunicationAllowedStateChanged(
+ DEFAULT_SUBSCRIPTION_ID, mockSatelliteAllowedStateCallback);
+ mTestableLooper.processAllMessages();
+ assertEquals(SATELLITE_RESULT_SUCCESS, result);
+ verify(mockSatelliteAllowedStateCallback, times(1))
+ .onSatelliteCommunicationAllowedStateChanged(anyBoolean());
+ verify(mockSatelliteAllowedStateCallback, times(1))
+ .onSatelliteAccessConfigurationChanged(
+ nullable(SatelliteAccessConfiguration.class));
+ }
+
+ @Test
+ public void testNotifyRegionalSatelliteConfigurationChanged() throws Exception {
+ // setup test
+ ISatelliteCommunicationAllowedStateCallback mockSatelliteAllowedStateCallback = mock(
+ ISatelliteCommunicationAllowedStateCallback.class);
+ ArgumentCaptor<SatelliteAccessConfiguration> satelliteAccessConfigurationCaptor =
+ ArgumentCaptor.forClass(SatelliteAccessConfiguration.class);
+
+ when(mSatelliteCommunicationAllowedStateCallbackMap.values())
+ .thenReturn(List.of(mockSatelliteAllowedStateCallback));
+ replaceInstance(SatelliteAccessController.class,
+ "mSatelliteCommunicationAllowedStateChangedListeners", mSatelliteAccessControllerUT,
+ mSatelliteCommunicationAllowedStateCallbackMap);
+
+ // register callback
+ mSatelliteAccessControllerUT.registerForCommunicationAllowedStateChanged(
+ DEFAULT_SUBSCRIPTION_ID, mockSatelliteAllowedStateCallback);
+
+ // verify if the callback is
+ // the same instance from onmSatelliteCommunicationAllowedStateCallbackMap
+ verify(mSatelliteCommunicationAllowedStateCallbackMap).put(any(),
+ mAllowedStateCallbackCaptor.capture());
+ assertSame(mockSatelliteAllowedStateCallback, mAllowedStateCallbackCaptor.getValue());
+
+ // create SatelliteAccessConfiguration data for this test
+ SatelliteAccessConfiguration satelliteAccessConfig = getSatelliteAccessConfiguration();
+
+ // trigger notifyRegionalSatelliteConfigurationChanged
+ mSatelliteAccessControllerUT
+ .notifyRegionalSatelliteConfigurationChanged(satelliteAccessConfig);
+
+ // verify if the satelliteAccessConfig is the same instance with the captured one.
+ verify(mockSatelliteAllowedStateCallback).onSatelliteAccessConfigurationChanged(
+ satelliteAccessConfigurationCaptor.capture());
+ assertSame(satelliteAccessConfig, satelliteAccessConfigurationCaptor.getValue());
+ }
+
+ @Test
+ public void testCheckSatelliteAccessRestrictionForLocation() throws Exception {
+ // Setup
+ logd("testCheckSatelliteAccessRestrictionForLocation : setup");
+ ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
+ ArgumentCaptor<Integer> regionalConfigIdCaptor = ArgumentCaptor.forClass(Integer.class);
+ replaceInstance(SatelliteAccessController.class, "mS2Level",
+ mSatelliteAccessControllerUT, DEFAULT_S2_LEVEL);
+ Iterator<ResultReceiver> mockResultReceiverIterator = mock(Iterator.class);
+ mSatelliteAccessControllerUT.setRegionalConfigId(null);
+
+ doReturn(mockResultReceiverIterator).when(mMockSatelliteAllowResultReceivers).iterator();
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+ doNothing().when(mMockSatelliteAllowResultReceivers).clear();
+ doReturn(mMockResultReceiver).when(mockResultReceiverIterator).next();
+ replaceInstance(SatelliteAccessController.class, "mSatelliteAllowResultReceivers",
+ mSatelliteAccessControllerUT, mMockSatelliteAllowResultReceivers);
+ replaceInstance(SatelliteAccessController.class, "mCachedAccessRestrictionMap",
+ mSatelliteAccessControllerUT, mMockCachedAccessRestrictionMap);
+
+ // when mMockCachedAccessRestrictionMap is hit and has DEFAULT_REGIONAL_SATELLITE_CONFIG_ID,
+ // verify belows
+ // - the bundle data of KEY_SATELLITE_COMMUNICATION_ALLOWED is true
+ // - the newRegionalConfigId is the same as DEFAULT_REGIONAL_SATELLITE_CONFIG_ID
+ // - the regionalConfigId is the same as DEFAULT_REGIONAL_SATELLITE_CONFIG_ID
+ logd("testCheckSatelliteAccessRestrictionForLocation : case 1");
+ clearInvocations(mMockSatelliteOnDeviceAccessController);
+ clearInvocations(mMockCachedAccessRestrictionMap);
+
+ doReturn(true).when(mMockCachedAccessRestrictionMap)
+ .containsKey(any(SatelliteOnDeviceAccessController.LocationToken.class));
+ doReturn(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID).when(mMockCachedAccessRestrictionMap)
+ .get(any(SatelliteOnDeviceAccessController.LocationToken.class));
+
+ mSatelliteAccessControllerUT.checkSatelliteAccessRestrictionForLocation(mMockLocation0);
+ verify(mMockResultReceiver, times(1))
+ .send(mResultCodeIntCaptor.capture(), bundleCaptor.capture());
+ verify(mMockSatelliteOnDeviceAccessController, never()).getRegionalConfigIdForLocation(
+ any(SatelliteOnDeviceAccessController.LocationToken.class));
+ assertEquals(Integer.valueOf(SATELLITE_RESULT_SUCCESS), mResultCodeIntCaptor.getValue());
+ assertTrue(bundleCaptor.getValue().getBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED));
+ assertEquals(Integer.valueOf(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID),
+ mSatelliteAccessControllerUT.getNewRegionalConfigId());
+ assertEquals(Integer.valueOf(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID),
+ mSatelliteAccessControllerUT.getRegionalConfigId());
+
+ // when mMockCachedAccessRestrictionMap is not hit and regionalConfigId is null
+ // verify belows
+ // - the bundle data of KEY_SATELLITE_COMMUNICATION_ALLOWED is false
+ // - the regionalConfigId is null
+ logd("testCheckSatelliteAccessRestrictionForLocation : case 2");
+ clearInvocations(mMockCachedAccessRestrictionMap);
+ doReturn(false).when(mMockCachedAccessRestrictionMap)
+ .containsKey(any(SatelliteOnDeviceAccessController.LocationToken.class));
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+ when(mMockSatelliteOnDeviceAccessController.getRegionalConfigIdForLocation(
+ any(SatelliteOnDeviceAccessController.LocationToken.class)))
+ .thenReturn(null);
+
+ mSatelliteAccessControllerUT.checkSatelliteAccessRestrictionForLocation(mMockLocation0);
+ verify(mMockResultReceiver, times(2))
+ .send(mResultCodeIntCaptor.capture(), bundleCaptor.capture());
+ assertEquals(Integer.valueOf(SATELLITE_RESULT_SUCCESS), mResultCodeIntCaptor.getValue());
+ assertFalse(bundleCaptor.getValue().getBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED));
+ verify(mMockCachedAccessRestrictionMap, times(1))
+ .put(any(), regionalConfigIdCaptor.capture());
+ assertNull(regionalConfigIdCaptor.getValue());
+ assertNull(mSatelliteAccessControllerUT.getNewRegionalConfigId());
+ assertNull(mSatelliteAccessControllerUT.getRegionalConfigId());
+
+ // when mMockCachedAccessRestrictionMap is not hit and
+ // regionalConfigId is DEFAULT_REGIONAL_SATELLITE_CONFIG_ID
+ // verify belows
+ // - the bundle data of KEY_SATELLITE_COMMUNICATION_ALLOWED is true
+ // - the regionalConfigId is DEFAULT_REGIONAL_SATELLITE_CONFIG_ID
+ logd("testCheckSatelliteAccessRestrictionForLocation : case 3");
+ clearInvocations(mMockCachedAccessRestrictionMap);
+ when(mMockSatelliteOnDeviceAccessController.getRegionalConfigIdForLocation(
+ any(SatelliteOnDeviceAccessController.LocationToken.class)))
+ .thenReturn(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID);
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+
+ mSatelliteAccessControllerUT.checkSatelliteAccessRestrictionForLocation(mMockLocation0);
+ verify(mMockResultReceiver, times(3))
+ .send(mResultCodeIntCaptor.capture(), bundleCaptor.capture());
+ assertEquals(Integer.valueOf(SATELLITE_RESULT_SUCCESS), mResultCodeIntCaptor.getValue());
+ assertTrue(bundleCaptor.getValue().getBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED));
+ verify(mMockCachedAccessRestrictionMap, times(1))
+ .put(any(), regionalConfigIdCaptor.capture());
+
+ assertEquals(Integer.valueOf(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID),
+ regionalConfigIdCaptor.getValue());
+ assertEquals(Integer.valueOf(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID),
+ mSatelliteAccessControllerUT.getNewRegionalConfigId());
+ assertEquals(Integer.valueOf(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID),
+ mSatelliteAccessControllerUT.getRegionalConfigId());
+
+
+ // when mMockCachedAccessRestrictionMap is not hit and regionalConfigId is null
+ // verify belows
+ // - the bundle data of KEY_SATELLITE_COMMUNICATION_ALLOWED is false
+ // - the regionalConfigId is null
+ logd("testCheckSatelliteAccessRestrictionForLocation : case 4");
+ clearInvocations(mMockCachedAccessRestrictionMap);
+ when(mMockSatelliteOnDeviceAccessController.getRegionalConfigIdForLocation(
+ any(SatelliteOnDeviceAccessController.LocationToken.class)))
+ .thenReturn(null);
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+
+ mSatelliteAccessControllerUT.checkSatelliteAccessRestrictionForLocation(mMockLocation0);
+ verify(mMockResultReceiver, times(4))
+ .send(mResultCodeIntCaptor.capture(), bundleCaptor.capture());
+ assertEquals(Integer.valueOf(SATELLITE_RESULT_SUCCESS), mResultCodeIntCaptor.getValue());
+ assertFalse(bundleCaptor.getValue().getBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED));
+ verify(mMockCachedAccessRestrictionMap, times(1))
+ .put(any(), regionalConfigIdCaptor.capture());
+ assertNull(regionalConfigIdCaptor.getValue());
+ assertNull(mSatelliteAccessControllerUT.getNewRegionalConfigId());
+ assertNull(mSatelliteAccessControllerUT.getRegionalConfigId());
+ }
+
@Test
public void testIsRegionDisallowed() throws Exception {
// setup to make the return value of mQueriedSatelliteAllowed 'true'
@@ -531,7 +858,8 @@
replaceInstance(SatelliteAccessController.class, "mCachedAccessRestrictionMap",
mSatelliteAccessControllerUT, mMockCachedAccessRestrictionMap);
doReturn(true).when(mMockCachedAccessRestrictionMap).containsKey(any());
- doReturn(true).when(mMockCachedAccessRestrictionMap).get(any());
+ doReturn(DEFAULT_REGIONAL_SATELLITE_CONFIG_ID)
+ .when(mMockCachedAccessRestrictionMap).get(any());
// get allowed country codes EMPTY from resources
when(mMockResources.getStringArray(
@@ -946,7 +1274,6 @@
// current time is greater than the location query throttle interval
// verify mMockLocationManager.getCurrentLocation() is invoked
// verify time(mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos) is updated
- logd("youngcha 1");
clearInvocations(mMockLocationManager);
mSatelliteAccessControllerUT.setLocationRequestCancellationSignalAsNull(true);
mSatelliteAccessControllerUT.elapsedRealtimeNanos =
@@ -1254,10 +1581,10 @@
@Test
public void testHandleIsSatelliteSupportedResult() throws Exception {
// Setup for this test case
- Iterator<ResultReceiver> mockIterator = mock(Iterator.class);
- doReturn(mockIterator).when(mMockSatelliteAllowResultReceivers).iterator();
- doReturn(true, false).when(mockIterator).hasNext();
- doReturn(mMockSatelliteSupportedResultReceiver).when(mockIterator).next();
+ Iterator<ResultReceiver> mockResultReceiverIterator = mock(Iterator.class);
+ doReturn(mockResultReceiverIterator).when(mMockSatelliteAllowResultReceivers).iterator();
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+ doReturn(mMockResultReceiver).when(mockResultReceiverIterator).next();
replaceInstance(SatelliteAccessController.class, "mSatelliteAllowResultReceivers",
mSatelliteAccessControllerUT, mMockSatelliteAllowResultReceivers);
@@ -1266,10 +1593,10 @@
// case that resultCode is not SATELLITE_RESULT_SUCCESS
int resultCode = SATELLITE_RESULT_ERROR;
Bundle bundle = new Bundle();
- doReturn(true, false).when(mockIterator).hasNext();
- clearInvocations(mMockSatelliteSupportedResultReceiver);
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+ clearInvocations(mMockResultReceiver);
mSatelliteAccessControllerUT.handleIsSatelliteSupportedResult(resultCode, bundle);
- verify(mMockSatelliteSupportedResultReceiver)
+ verify(mMockResultReceiver)
.send(mResultCodeIntCaptor.capture(), any());
assertEquals(Integer.valueOf(SATELLITE_RESULT_ERROR), mResultCodeIntCaptor.getValue());
@@ -1277,20 +1604,19 @@
// verify that the resultCode is delivered as it were
resultCode = SATELLITE_RESULT_SUCCESS;
bundle.putBoolean(KEY_SATELLITE_PROVISIONED, false);
- doReturn(true, false).when(mockIterator).hasNext();
- clearInvocations(mMockSatelliteSupportedResultReceiver);
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+ clearInvocations(mMockResultReceiver);
mSatelliteAccessControllerUT.handleIsSatelliteSupportedResult(resultCode, bundle);
- verify(mMockSatelliteSupportedResultReceiver)
- .send(mResultCodeIntCaptor.capture(), any());
+ verify(mMockResultReceiver).send(mResultCodeIntCaptor.capture(), any());
assertEquals(Integer.valueOf(SATELLITE_RESULT_SUCCESS), mResultCodeIntCaptor.getValue());
// case KEY_SATELLITE_SUPPORTED is false
// verify SATELLITE_RESULT_NOT_SUPPORTED is captured
bundle.putBoolean(KEY_SATELLITE_SUPPORTED, false);
- doReturn(true, false).when(mockIterator).hasNext();
- clearInvocations(mMockSatelliteSupportedResultReceiver);
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+ clearInvocations(mMockResultReceiver);
mSatelliteAccessControllerUT.handleIsSatelliteSupportedResult(resultCode, bundle);
- verify(mMockSatelliteSupportedResultReceiver)
+ verify(mMockResultReceiver)
.send(mResultCodeIntCaptor.capture(), mResultDataBundleCaptor.capture());
assertEquals(Integer.valueOf(SATELLITE_RESULT_NOT_SUPPORTED),
mResultCodeIntCaptor.getValue());
@@ -1302,10 +1628,10 @@
bundle.putBoolean(KEY_SATELLITE_SUPPORTED, true);
when(mMockCountryDetector.getCurrentNetworkCountryIso())
.thenReturn(List.of(TEST_SATELLITE_COUNTRY_CODE_KR));
- doReturn(true, false).when(mockIterator).hasNext();
- clearInvocations(mMockSatelliteSupportedResultReceiver);
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+ clearInvocations(mMockResultReceiver);
mSatelliteAccessControllerUT.handleIsSatelliteSupportedResult(resultCode, bundle);
- verify(mMockSatelliteSupportedResultReceiver)
+ verify(mMockResultReceiver)
.send(mResultCodeIntCaptor.capture(), mResultDataBundleCaptor.capture());
assertEquals(Integer.valueOf(SATELLITE_RESULT_SUCCESS),
mResultCodeIntCaptor.getValue());
@@ -1317,10 +1643,10 @@
when(mMockCountryDetector.getCurrentNetworkCountryIso())
.thenReturn(List.of(TEST_SATELLITE_COUNTRY_CODE_US));
doReturn(false).when(mMockLocationManager).isLocationEnabled();
- doReturn(true, false).when(mockIterator).hasNext();
- clearInvocations(mMockSatelliteSupportedResultReceiver);
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+ clearInvocations(mMockResultReceiver);
mSatelliteAccessControllerUT.handleIsSatelliteSupportedResult(resultCode, bundle);
- verify(mMockSatelliteSupportedResultReceiver)
+ verify(mMockResultReceiver)
.send(mResultCodeIntCaptor.capture(), mResultDataBundleCaptor.capture());
assertEquals(Integer.valueOf(SATELLITE_RESULT_LOCATION_DISABLED),
mResultCodeIntCaptor.getValue());
@@ -1367,7 +1693,7 @@
private void sendSatelliteCommunicationAllowedEvent() {
Pair<Integer, ResultReceiver> requestPair =
- new Pair<>(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
+ new Pair<>(DEFAULT_SUBSCRIPTION_ID,
mSatelliteAccessControllerUT.getResultReceiverCurrentLocation());
Message msg = mSatelliteAccessControllerUT.obtainMessage(
CMD_IS_SATELLITE_COMMUNICATION_ALLOWED);
@@ -1567,5 +1893,25 @@
return mCurrentSatelliteAllowedState;
}
}
+
+ @Nullable
+ public Integer getRegionalConfigId() {
+ synchronized (mLock) {
+ return mRegionalConfigId;
+ }
+ }
+
+ @Nullable
+ public Integer getNewRegionalConfigId() {
+ synchronized (mLock) {
+ return mNewRegionalConfigId;
+ }
+ }
+
+ public void setRegionalConfigId(@Nullable Integer regionalConfigId) {
+ synchronized (mLock) {
+ mRegionalConfigId = regionalConfigId;
+ }
+ }
}
}