Evaluate satellite allowed region when location is enabled
Bug: 361773595
Flag: com.android.internal.telephony.flags.oem_enabled_satellite_flag
Test: atest SatelliteAccessControllerTest
(http://ab/I51800010308951754-passed)
Test: Manually verified if evalution of allowed region is triggered, when location service setting is eanbled.(detainls in b/361773595#comment2)
Change-Id: Ica2a040d6fc0e4d8571b0c61ac272341a164e386
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index 1e3aa2f..ecf2292 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -28,7 +28,10 @@
import android.annotation.ArrayRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.location.Location;
@@ -133,7 +136,8 @@
protected static final int EVENT_WAIT_FOR_CURRENT_LOCATION_TIMEOUT = 2;
protected static final int EVENT_KEEP_ON_DEVICE_ACCESS_CONTROLLER_RESOURCES_TIMEOUT = 3;
protected static final int EVENT_CONFIG_DATA_UPDATED = 4;
- protected static final int CMD_HANDLE_COUNTRY_CODE_CHANGED = 5;
+ protected static final int EVENT_COUNTRY_CODE_CHANGED = 5;
+ protected static final int EVENT_LOCATION_SETTINGS_ENABLED = 6;
private static SatelliteAccessController sInstance;
@@ -263,6 +267,19 @@
private long mOnDeviceLookupStartTimeMillis;
private long mTotalCheckingStartTimeMillis;
+ protected BroadcastReceiver mLocationModeChangedBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(LocationManager.MODE_CHANGED_ACTION)) {
+ plogd("LocationManager mode is changed");
+ if (mLocationManager.isLocationEnabled()) {
+ plogd("Location settings is just enabled");
+ sendRequestAsync(EVENT_LOCATION_SETTINGS_ENABLED, null);
+ }
+ }
+ }
+ };
+
/**
* Create a SatelliteAccessController instance.
*
@@ -295,7 +312,7 @@
mCountryDetector = TelephonyCountryDetector.getInstance(context, mFeatureFlags);
mCountryDetector.registerForCountryCodeChanged(this,
- CMD_HANDLE_COUNTRY_CODE_CHANGED, null);
+ EVENT_COUNTRY_CODE_CHANGED, null);
initializeHandlerForSatelliteAllowedResult();
setIsSatelliteAllowedRegionPossiblyChanged(false);
@@ -374,6 +391,7 @@
// Init the SatelliteOnDeviceAccessController so that the S2 level can be cached
initSatelliteOnDeviceAccessController();
+ registerLocationModeChangedBroadcastReceiver(context);
}
private void updateCurrentSatelliteAllowedState(boolean isAllowed) {
@@ -420,7 +438,9 @@
AsyncResult ar = (AsyncResult) msg.obj;
updateSatelliteConfigData((Context) ar.userObj);
break;
- case CMD_HANDLE_COUNTRY_CODE_CHANGED:
+ case EVENT_LOCATION_SETTINGS_ENABLED:
+ // Fall through
+ case EVENT_COUNTRY_CODE_CHANGED:
handleSatelliteAllowedRegionPossiblyChanged();
break;
default:
@@ -912,6 +932,17 @@
}
}
+ private void registerLocationModeChangedBroadcastReceiver(Context context) {
+ if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+ plogd("registerLocationModeChangedBroadcastReceiver: Flag "
+ + "oemEnabledSatellite is disabled");
+ return;
+ }
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(LocationManager.MODE_CHANGED_ACTION);
+ context.registerReceiver(mLocationModeChangedBroadcastReceiver, intentFilter);
+ }
+
/**
* At country borders, a multi-SIM device might connect to multiple cellular base
* stations and thus might have multiple different MCCs.
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index 87c73ac..250a6a9 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -16,6 +16,7 @@
package com.android.phone.satellite.accesscontrol;
+import static android.location.LocationManager.MODE_CHANGED_ACTION;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_LOCATION_NOT_AVAILABLE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_MODEM_ERROR;
@@ -23,7 +24,7 @@
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.CMD_HANDLE_COUNTRY_CODE_CHANGED;
+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_THROTTLE_INTERVAL_FOR_LOCATION_QUERY_MINUTES;
@@ -55,7 +56,10 @@
import static org.mockito.Mockito.when;
import android.annotation.Nullable;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.location.Location;
@@ -171,6 +175,8 @@
@Mock
private Map<SatelliteOnDeviceAccessController.LocationToken, Boolean>
mMockCachedAccessRestrictionMap;
+ @Mock
+ private Intent mMockLocationIntent;
private Looper mLooper;
private TestableLooper mTestableLooper;
@@ -193,6 +199,10 @@
private ArgumentCaptor<Integer> mCountryDetectorIntCaptor;
@Captor
private ArgumentCaptor<Object> mCountryDetectorObjCaptor;
+ @Captor
+ private ArgumentCaptor<BroadcastReceiver> mLocationBroadcastReceiverCaptor;
+ @Captor
+ private ArgumentCaptor<IntentFilter> mIntentFilterCaptor;
private boolean mQueriedSatelliteAllowed = false;
private int mQueriedSatelliteAllowedResultCode = SATELLITE_RESULT_SUCCESS;
@@ -307,6 +317,7 @@
when(mMockFeatureFlags.satellitePersistentLogging()).thenReturn(true);
when(mMockFeatureFlags.geofenceEnhancementForBetterUx()).thenReturn(true);
+ when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
mSatelliteAccessControllerUT = new TestSatelliteAccessController(mMockContext,
mMockFeatureFlags, mLooper, mMockLocationManager, mMockTelecomManager,
@@ -812,7 +823,7 @@
mCountryDetectorObjCaptor.capture());
assertSame(mCountryDetectorHandlerCaptor.getValue(), mSatelliteAccessControllerUT);
- assertSame(mCountryDetectorIntCaptor.getValue(), CMD_HANDLE_COUNTRY_CODE_CHANGED);
+ assertSame(mCountryDetectorIntCaptor.getValue(), EVENT_COUNTRY_CODE_CHANGED);
assertNull(mCountryDetectorObjCaptor.getValue());
// Normal case that invokes
@@ -865,7 +876,7 @@
mCountryDetectorObjCaptor.capture());
assertSame(mCountryDetectorHandlerCaptor.getValue(), mSatelliteAccessControllerUT);
- assertSame(mCountryDetectorIntCaptor.getValue(), CMD_HANDLE_COUNTRY_CODE_CHANGED);
+ assertSame(mCountryDetectorIntCaptor.getValue(), EVENT_COUNTRY_CODE_CHANGED);
assertNull(mCountryDetectorObjCaptor.getValue());
assertTrue(mSatelliteAccessControllerUT
@@ -962,6 +973,62 @@
verify(mMockCachedAccessRestrictionMap, times(1)).clear();
}
+ @Test
+ public void testLocationModeChanged() throws Exception {
+ // setup for querying GPS not to reset mIsSatelliteAllowedRegionPossiblyChanged false.
+ when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
+ 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);
+ when(mMockSatelliteOnDeviceAccessController.isSatCommunicationAllowedAtLocation(
+ any(SatelliteOnDeviceAccessController.LocationToken.class))).thenReturn(true);
+ replaceInstance(SatelliteAccessController.class, "mCachedAccessRestrictionMap",
+ mSatelliteAccessControllerUT, mMockCachedAccessRestrictionMap);
+ doReturn(false).when(mMockCachedAccessRestrictionMap).containsKey(any());
+ mSatelliteAccessControllerUT.elapsedRealtimeNanos = TEST_LOCATION_FRESH_DURATION_NANOS + 1;
+
+ // Captor and Verify if the mockReceiver and mocContext is registered well
+ verify(mMockContext).registerReceiver(mLocationBroadcastReceiverCaptor.capture(),
+ mIntentFilterCaptor.capture());
+ assertSame(mSatelliteAccessControllerUT.getLocationBroadcastReceiver(),
+ mLocationBroadcastReceiverCaptor.getValue());
+ assertSame(MODE_CHANGED_ACTION, mIntentFilterCaptor.getValue().getAction(0));
+
+ // When the intent action is not MODE_CHANGED_ACTION,
+ // verify if the location manager never invoke isLocationEnabled()
+ doReturn("").when(mMockLocationIntent).getAction();
+ mSatelliteAccessControllerUT.setIsSatelliteAllowedRegionPossiblyChanged(false);
+ mSatelliteAccessControllerUT.getLocationBroadcastReceiver()
+ .onReceive(mMockContext, mMockLocationIntent);
+ verify(mMockLocationManager, never()).isLocationEnabled();
+
+ // When the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is true,
+ // verify if mIsSatelliteAllowedRegionPossiblyChanged is true
+ doReturn(MODE_CHANGED_ACTION).when(mMockLocationIntent).getAction();
+ doReturn(true).when(mMockLocationManager).isLocationEnabled();
+ clearInvocations(mMockLocationManager);
+ mSatelliteAccessControllerUT.setIsSatelliteAllowedRegionPossiblyChanged(false);
+ mSatelliteAccessControllerUT.getLocationBroadcastReceiver()
+ .onReceive(mMockContext, mMockLocationIntent);
+ verify(mMockLocationManager, times(1)).isLocationEnabled();
+ mTestableLooper.processAllMessages();
+ assertEquals(true, mSatelliteAccessControllerUT.isSatelliteAllowedRegionPossiblyChanged());
+
+ // When the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is false,
+ // verify if mIsSatelliteAllowedRegionPossiblyChanged is false
+ doReturn(false).when(mMockLocationManager).isLocationEnabled();
+ clearInvocations(mMockLocationManager);
+ mSatelliteAccessControllerUT.setIsSatelliteAllowedRegionPossiblyChanged(false);
+ mSatelliteAccessControllerUT.getLocationBroadcastReceiver()
+ .onReceive(mMockContext, mMockLocationIntent);
+ verify(mMockLocationManager, times(1)).isLocationEnabled();
+ mTestableLooper.processAllMessages();
+ assertEquals(false, mSatelliteAccessControllerUT.isSatelliteAllowedRegionPossiblyChanged());
+ }
+
private void sendSatelliteCommunicationAllowedEvent() {
Pair<Integer, ResultReceiver> requestPair =
new Pair<>(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
@@ -982,7 +1049,7 @@
}
private void sendCommandValidateCountryCodeChangeEvent(Context context) {
- Message msg = mSatelliteAccessControllerUT.obtainMessage(CMD_HANDLE_COUNTRY_CODE_CHANGED);
+ Message msg = mSatelliteAccessControllerUT.obtainMessage(EVENT_COUNTRY_CODE_CHANGED);
msg.obj = new AsyncResult(context, SATELLITE_RESULT_SUCCESS, null);
msg.sendToTarget();
mTestableLooper.processAllMessages();
@@ -1143,5 +1210,9 @@
public ResultReceiver getResultReceiverCurrentLocation() {
return mHandlerForSatelliteAllowedResult;
}
+
+ public BroadcastReceiver getLocationBroadcastReceiver() {
+ return mLocationModeChangedBroadcastReceiver;
+ }
}
}