Updating the throttle time only after actual location query
Bug: 361781870
Flag: com.android.internal.telephony.flags.oem_enabled_satellite_flag
Test: Build
Test: atest SatelliteAccessControllerTest (http://ab/I52700010318082037-passed)
Change-Id: I43afc5b91e005705c392654574ce2b8d4c5ccbdf
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index f9bf0e8..f5b9560 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -1242,14 +1242,6 @@
private void executeLocationQuery() {
plogd("executeLocationQuery");
- synchronized (mPossibleChangeInSatelliteAllowedRegionLock) {
- if (isSatelliteAllowedRegionPossiblyChanged()) {
- mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos =
- getElapsedRealtimeNanos();
- plogd("mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos is set "
- + mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos);
- }
- }
synchronized (mLock) {
mFreshLastKnownLocation = getFreshLastKnownLocation();
checkSatelliteAccessRestrictionUsingOnDeviceData();
@@ -1321,6 +1313,16 @@
+ "Request for current location was already sent to LocationManager");
return;
}
+
+ synchronized (mPossibleChangeInSatelliteAllowedRegionLock) {
+ if (isSatelliteAllowedRegionPossiblyChanged()) {
+ mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos =
+ getElapsedRealtimeNanos();
+ plogd("mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos is set "
+ + mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos);
+ }
+ }
+
mLocationRequestCancellationSignal = new CancellationSignal();
mLocationQueryStartTimeMillis = System.currentTimeMillis();
mLocationManager.getCurrentLocation(LocationManager.FUSED_PROVIDER,
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index 3d2c953..5650703 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -442,7 +442,7 @@
assertFalse(mSatelliteAccessControllerUT
.isSatelliteAccessAllowedForLocation(List.of(TEST_SATELLITE_COUNTRY_CODE_US)));
assertFalse(mSatelliteAccessControllerUT.isSatelliteAccessAllowedForLocation(
- List.of(TEST_SATELLITE_COUNTRY_CODE_US, TEST_SATELLITE_COUNTRY_CODE_KR)));
+ List.of(TEST_SATELLITE_COUNTRY_CODE_US, TEST_SATELLITE_COUNTRY_CODE_KR)));
assertTrue(mSatelliteAccessControllerUT
.isSatelliteAccessAllowedForLocation(List.of(TEST_SATELLITE_COUNTRY_CODE_KR)));
@@ -837,6 +837,92 @@
}
@Test
+ public void testLocationQueryThrottleTimeUpdate() {
+ long firstMccChangedTime = 1;
+ long lastKnownLocationElapsedRealtime =
+ firstMccChangedTime + TEST_LOCATION_QUERY_THROTTLE_INTERVAL_NANOS;
+
+ // OEM-enabled satellite is supported
+ when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
+
+ verify(mMockCountryDetector).registerForCountryCodeChanged(
+ mCountryDetectorHandlerCaptor.capture(), mCountryDetectorIntCaptor.capture(),
+ mCountryDetectorObjCaptor.capture());
+
+ assertSame(mCountryDetectorHandlerCaptor.getValue(), mSatelliteAccessControllerUT);
+ assertSame(mCountryDetectorIntCaptor.getValue(), EVENT_COUNTRY_CODE_CHANGED);
+ assertNull(mCountryDetectorObjCaptor.getValue());
+
+ // Setup to invoke GPS query
+ clearInvocations(mMockSatelliteOnDeviceAccessController);
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS);
+ doReturn(true).when(mMockLocationManager).isLocationEnabled();
+ when(mMockLocationManager.getLastKnownLocation(LocationManager.FUSED_PROVIDER))
+ .thenReturn(null);
+ when(mMockLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER))
+ .thenReturn(null);
+
+ // When mcc changed first, so queried a location with GPS,
+ // verify if the mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos
+ // is the same with firstMccChangedTime.
+ // verify mMockLocationManager.getCurrentLocation() is invoked
+ // verify time(mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos) is
+ // firstMccChangedTime
+ clearInvocations(mMockLocationManager);
+ mSatelliteAccessControllerUT.elapsedRealtimeNanos = firstMccChangedTime;
+ sendCommandValidateCountryCodeChangeEvent(mMockContext);
+ verify(mMockLocationManager, times(1))
+ .getCurrentLocation(any(), any(), any(), any(), any());
+ assertEquals(firstMccChangedTime, mSatelliteAccessControllerUT
+ .mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos);
+
+ // set current time less than throttle_interval
+ // verify mMockLocationManager.getCurrentLocation() is not invoked
+ // verify time(mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos) is not updated
+ clearInvocations(mMockLocationManager);
+ doReturn(lastKnownLocationElapsedRealtime).when(mMockLocation1).getElapsedRealtimeNanos();
+ mSatelliteAccessControllerUT.elapsedRealtimeNanos =
+ (firstMccChangedTime + TEST_LOCATION_QUERY_THROTTLE_INTERVAL_NANOS - 1);
+ sendCommandValidateCountryCodeChangeEvent(mMockContext);
+ verify(mMockLocationManager, never())
+ .getCurrentLocation(any(), any(), any(), any(), any());
+ assertEquals(firstMccChangedTime, mSatelliteAccessControllerUT
+ .mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos);
+
+ // Test the scenario when last know location is fresh and
+ // current time is greater than the location query throttle interval
+ // verify mMockLocationManager.getCurrentLocation() is not invoked
+ // verify time(mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos) is not updated
+ clearInvocations(mMockLocationManager);
+ doReturn(lastKnownLocationElapsedRealtime).when(mMockLocation1).getElapsedRealtimeNanos();
+ mSatelliteAccessControllerUT.elapsedRealtimeNanos =
+ (lastKnownLocationElapsedRealtime + TEST_LOCATION_FRESH_DURATION_NANOS - 1);
+ sendCommandValidateCountryCodeChangeEvent(mMockContext);
+ verify(mMockLocationManager, never())
+ .getCurrentLocation(any(), any(), any(), any(), any());
+ assertEquals(firstMccChangedTime, mSatelliteAccessControllerUT
+ .mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos);
+
+ // Test the scenario when last know location is not fresh and
+ // 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 =
+ (lastKnownLocationElapsedRealtime + TEST_LOCATION_FRESH_DURATION_NANOS + 1);
+ sendCommandValidateCountryCodeChangeEvent(mMockContext);
+ verify(mMockLocationManager, times(1))
+ .getCurrentLocation(any(), any(), any(), any(), any());
+ assertEquals(lastKnownLocationElapsedRealtime + TEST_LOCATION_FRESH_DURATION_NANOS + 1,
+ mSatelliteAccessControllerUT
+ .mLastLocationQueryForPossibleChangeInAllowedRegionTimeNanos);
+ }
+
+
+ @Test
public void testAllowLocationQueryForSatelliteAllowedCheck() {
mSatelliteAccessControllerUT.mLatestSatelliteCommunicationAllowedSetTime = 1;