Using current location to check satellite allowed state before enabling satellite
Bug: 364310437
Flag: com.android.internal.telephony.flags.oem_enabled_satellite_flag
Test: atest SatelliteAccessControllerTest (passed)
Test: Manually verified (b/364310437#comment2)
- if the location is used when `requestEnabled` is invoked
- if the cached value is used when `requestIsCommunicationAllowedForCurrentLocation` is invoked.
Test: Verified with testSatelliteApp (b/364310437#comment3)
- if the enableSatellite is invoked the enablingSatellite is true
- if the requestIsSatelliteCommunicationAllowedForCurrentLocation is invoked the enablingSatellite is false
Change-Id: I55d81a4e818a4038b030b6d11471a142cee75c4c
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index e48a57a..e77d652 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -13164,7 +13164,7 @@
}
};
mSatelliteAccessController.requestIsCommunicationAllowedForCurrentLocation(
- resultReceiver);
+ resultReceiver, true);
} else {
// No need to check if satellite is allowed at current location when disabling satellite
mSatelliteController.requestSatelliteEnabled(
@@ -13482,7 +13482,7 @@
public void requestIsCommunicationAllowedForCurrentLocation(int subId,
@NonNull ResultReceiver result) {
enforceSatelliteCommunicationPermission("requestIsCommunicationAllowedForCurrentLocation");
- mSatelliteAccessController.requestIsCommunicationAllowedForCurrentLocation(result);
+ mSatelliteAccessController.requestIsCommunicationAllowedForCurrentLocation(result, false);
}
/**
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index de3811a..7b244a1 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -286,6 +286,10 @@
}
};
+ private final Object mIsAllowedCheckBeforeEnablingSatelliteLock = new Object();
+ @GuardedBy("mIsAllowedCheckBeforeEnablingSatelliteLock")
+ private boolean mIsAllowedCheckBeforeEnablingSatellite;
+
/**
* Create a SatelliteAccessController instance.
*
@@ -361,7 +365,7 @@
protected void onReceiveResult(int resultCode, Bundle resultData) {
// do nothing
}
- });
+ }, false);
}
}
};
@@ -379,7 +383,7 @@
protected void onReceiveResult(int resultCode, Bundle resultData) {
// do nothing
}
- });
+ }, false);
}
}
@@ -462,12 +466,17 @@
* if the request failed.
*/
public void requestIsCommunicationAllowedForCurrentLocation(
- @NonNull ResultReceiver result) {
+ @NonNull ResultReceiver result, boolean enablingSatellite) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
plogd("oemEnabledSatelliteFlag is disabled");
result.send(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, null);
return;
}
+ plogd("requestIsCommunicationAllowedForCurrentLocation : "
+ + "enablingSatellite is " + enablingSatellite);
+ synchronized (mIsAllowedCheckBeforeEnablingSatelliteLock) {
+ mIsAllowedCheckBeforeEnablingSatellite = enablingSatellite;
+ }
mAccessControllerMetricsStats.setTriggeringEvent(TRIGGERING_EVENT_EXTERNAL_REQUEST);
sendRequestAsync(CMD_IS_SATELLITE_COMMUNICATION_ALLOWED,
new Pair<>(mSatelliteController.getSatellitePhone().getSubId(), result));
@@ -1054,6 +1063,9 @@
if (!shouldRetryValidatingPossibleChangeInAllowedRegion(resultCode)) {
setIsSatelliteAllowedRegionPossiblyChanged(false);
}
+ synchronized (mIsAllowedCheckBeforeEnablingSatelliteLock) {
+ mIsAllowedCheckBeforeEnablingSatellite = false;
+ }
reportMetrics(resultCode, allowed);
}
@@ -1130,7 +1142,7 @@
logd("handleSatelliteAllowedRegionPossiblyChanged");
setIsSatelliteAllowedRegionPossiblyChanged(true);
requestIsCommunicationAllowedForCurrentLocation(
- mHandlerForSatelliteAllowedResult);
+ mHandlerForSatelliteAllowedResult, false);
int triggeringEvent = TRIGGERING_EVENT_UNKNOWN;
if (handleEvent == EVENT_LOCATION_SETTINGS_ENABLED) {
triggeringEvent = TRIGGERING_EVENT_LOCATION_SETTINGS_ENABLED;
@@ -1181,28 +1193,32 @@
/**
* Telephony-internal logic to verify if satellite access is restricted from the location query.
*/
- private void checkSatelliteAccessRestrictionUsingGPS() {
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ public void checkSatelliteAccessRestrictionUsingGPS() {
logv("checkSatelliteAccessRestrictionUsingGPS:");
- if (isInEmergency()) {
- executeLocationQuery();
- } else {
- if (mLocationManager.isLocationEnabled()) {
- plogd("location query is allowed");
- if (allowLocationQueryForSatelliteAllowedCheck()) {
- executeLocationQuery();
- } else {
- Bundle bundle = new Bundle();
- bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED,
- mLatestSatelliteCommunicationAllowed);
- sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
- mLatestSatelliteCommunicationAllowed);
- }
+ synchronized (mIsAllowedCheckBeforeEnablingSatelliteLock) {
+ if (isInEmergency()) {
+ executeLocationQuery();
} else {
- plogv("location query is not allowed");
- Bundle bundle = new Bundle();
- bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
- sendSatelliteAllowResultToReceivers(
- SATELLITE_RESULT_LOCATION_DISABLED, bundle, false);
+ if (mLocationManager.isLocationEnabled()) {
+ plogd("location query is allowed");
+ if (allowLocationQueryForSatelliteAllowedCheck()
+ || mIsAllowedCheckBeforeEnablingSatellite) {
+ executeLocationQuery();
+ } else {
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED,
+ mLatestSatelliteCommunicationAllowed);
+ sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
+ mLatestSatelliteCommunicationAllowed);
+ }
+ } else {
+ plogv("location query is not allowed");
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
+ sendSatelliteAllowResultToReceivers(
+ SATELLITE_RESULT_LOCATION_DISABLED, bundle, false);
+ }
}
}
}
@@ -1298,8 +1314,7 @@
}
}
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- protected void queryCurrentLocation() {
+ private void queryCurrentLocation() {
synchronized (mLock) {
if (mLocationRequestCancellationSignal != null) {
plogd("queryCurrentLocation : "