Support satellite service indications
Test: atest SatelliteManagerTest
Bug: 261131816
Change-Id: I42a3be7860900dd354d134c1d4489c689e080cbf
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 93810fe..6447e4d 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -622,8 +622,8 @@
}
private static final class SatellitePositionUpdateHandler extends Handler {
- public static final int EVENT_POSITION_UPDATE = 1;
- public static final int EVENT_MESSAGE_TRANSFER_STATE_UPDATE = 2;
+ public static final int EVENT_POSITION_INFO_CHANGED = 1;
+ public static final int EVENT_DATAGRAM_TRANSFER_STATE_CHANGED = 2;
private final ConcurrentHashMap<IBinder, ISatellitePositionUpdateCallback> mListeners;
SatellitePositionUpdateHandler(Looper looper) {
@@ -646,27 +646,27 @@
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
- case EVENT_POSITION_UPDATE: {
+ case EVENT_POSITION_INFO_CHANGED: {
AsyncResult ar = (AsyncResult) msg.obj;
PointingInfo pointingInfo = (PointingInfo) ar.result;
mListeners.values().forEach(listener -> {
try {
- listener.onSatellitePositionUpdate(pointingInfo);
+ listener.onSatellitePositionChanged(pointingInfo);
} catch (RemoteException e) {
- log("EVENT_POSITION_UPDATE RemoteException: " + e);
+ log("EVENT_POSITION_INFO_CHANGED RemoteException: " + e);
}
});
break;
}
- case EVENT_MESSAGE_TRANSFER_STATE_UPDATE: {
+ case EVENT_DATAGRAM_TRANSFER_STATE_CHANGED: {
AsyncResult ar = (AsyncResult) msg.obj;
- int state = (int) ar.result;
+ int result = (int) ar.result;
mListeners.values().forEach(listener -> {
try {
- // TODO: get correct responses back from indication
- listener.onDatagramTransferStateUpdate(state, 0, 0, 0);
+ // TODO: process and return the rest of the values correctly
+ listener.onDatagramTransferStateChanged(result, 0, 0, 0);
} catch (RemoteException e) {
- log("EVENT_MESSAGE_TRANSFER_STATE_UPDATE RemoteException: " + e);
+ log("EVENT_DATAGRAM_TRANSFER_STATE_CHANGED RemoteException: " + e);
}
});
break;
@@ -770,7 +770,7 @@
+ ", state=" + state);
mListeners.values().forEach(listener -> {
try {
- listener.onSatelliteModemStateChange(state);
+ listener.onSatelliteModemStateChanged(state);
} catch (RemoteException e) {
log("EVENT_SATELLITE_MODEM_STATE_CHANGE RemoteException: " + e);
}
@@ -845,18 +845,22 @@
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
- case EVENT_SATELLITE_DATAGRAMS_RECEIVED : {
+ case EVENT_SATELLITE_DATAGRAMS_RECEIVED: {
AsyncResult ar = (AsyncResult) msg.obj;
- byte[][] datagrams = (byte[][]) ar.result;
- SatelliteDatagram[] satelliteDatagramArray =
- convertToSatelliteDatagramArray(datagrams);
+ Pair<SatelliteDatagram[], Integer> result =
+ (Pair<SatelliteDatagram[], Integer>) ar.result;
+ SatelliteDatagram[] satelliteDatagrams = result.first;
+ int pendingCount = result.second;
log("Received EVENT_SATELLITE_DATAGRAMS_RECEIVED for subId=" + mSubId);
mListeners.values().forEach(listener -> {
try {
- for(SatelliteDatagram datagram : satelliteDatagramArray) {
+ for (int i = 0; i < satelliteDatagrams.length; i++) {
// TODO (b/269637555): wait for ack and retry after 5mins
- listener.onSatelliteDatagramReceived(0, datagram, 0,
+ listener.onSatelliteDatagramReceived(
+ // TODO: create a new datagramId every time
+ i, satelliteDatagrams[i], pendingCount,
+ // TODO: create a new instance of ack that will resend
mDatagramReceiverAck);
}
} catch (RemoteException e) {
@@ -2865,7 +2869,7 @@
int error = getSatelliteError(ar, "isSatelliteSupported", true);
Bundle bundle = new Bundle();
if (error == SatelliteManager.SATELLITE_ERROR_NONE) {
- boolean supported = ((int[]) ar.result)[0] == 1;
+ boolean supported = (boolean) ar.result;
if (DBG) log("isSatelliteSupported: " + supported);
bundle.putBoolean(SatelliteManager.KEY_SATELLITE_SUPPORTED, supported);
synchronized (mIsSatelliteSupportedLock) {
@@ -2946,9 +2950,10 @@
(SendSatelliteDatagramArgument) request.argument;
onCompleted = obtainMessage(EVENT_SEND_SATELLITE_DATAGRAM_DONE, request);
if (mIsSatelliteServiceSupported) {
- // TODO: set isEmergency properly
- mSatelliteServiceController
- .sendSatelliteDatagram(argument.datagram, false, onCompleted);
+ mSatelliteServiceController.sendSatelliteDatagram(
+ argument.datagram,
+ argument.datagramType == SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
+ onCompleted);
break;
}
Phone phone = getPhoneFromRequest(request);
@@ -3005,7 +3010,7 @@
ar, "isSatelliteCommunicationAllowedForCurrentLocation", true);
Bundle bundle = new Bundle();
if (error == SatelliteManager.SATELLITE_ERROR_NONE) {
- boolean communicationAllowed = ((int[]) ar.result)[0] == 1;
+ boolean communicationAllowed = (boolean) ar.result;
if (DBG) {
log("isSatelliteCommunicationAllowedForCurrentLocation: "
+ communicationAllowed);
@@ -12952,6 +12957,89 @@
}
/**
+ * Request to enable or disable the satellite service demo mode.
+ *
+ * @param subId The subId of the subscription to set the satellite demo mode enabled for.
+ * @param enable {@code true} to enable the satellite demo mode and {@code false} to disable.
+ * @param callback The callback to get the error code of the request.
+ *
+ * @throws SecurityException if the caller doesn't have the required permission.
+ */
+ @Override
+ public void requestSatelliteDemoModeEnabled(
+ int subId, boolean enable, @NonNull IIntegerConsumer callback) {
+ enforceSatelliteCommunicationPermission("requestSatelliteDemoModeEnabled");
+ Consumer<Integer> result = FunctionalUtils.ignoreRemoteException(callback::accept);
+ if (!isSatelliteSupported()) {
+ result.accept(SatelliteManager.SATELLITE_NOT_SUPPORTED);
+ return;
+ }
+
+ final int validSubId = getValidSatelliteSubId(subId);
+ if (!isSatelliteProvisioned(validSubId)) {
+ result.accept(SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED);
+ return;
+ }
+
+ Phone phone = getPhoneOrDefault(validSubId, "requestSatelliteDemoModeEnabled");
+ if (phone == null) {
+ result.accept(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE);
+ return;
+ }
+
+ if (mIsSatelliteServiceSupported) {
+ result.accept(mSatelliteServiceController.requestSatelliteDemoModeEnabled(enable));
+ } else {
+ result.accept(SatelliteManager.SATELLITE_SERVICE_ERROR);
+ }
+ }
+
+ /**
+ * Request to get whether the satellite service demo mode is enabled.
+ *
+ * @param subId The subId of the subscription to check whether the satellite demo mode
+ * is enabled for.
+ * @param result The result receiver that returns whether the satellite demo mode is enabled
+ * 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 requestIsSatelliteDemoModeEnabled(int subId, @NonNull ResultReceiver result) {
+ enforceSatelliteCommunicationPermission("requestIsSatelliteDemoModeEnabled");
+ if (!isSatelliteSupported()) {
+ result.send(SatelliteManager.SATELLITE_NOT_SUPPORTED, null);
+ return;
+ }
+
+ final int validSubId = getValidSatelliteSubId(subId);
+ if (!isSatelliteProvisioned(validSubId)) {
+ result.send(SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED, null);
+ return;
+ }
+
+ Phone phone = getPhoneOrDefault(validSubId, "requestIsSatelliteDemoModeEnabled");
+ if (phone == null) {
+ result.send(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE, null);
+ return;
+ }
+
+ if (mIsSatelliteServiceSupported) {
+ final Bundle bundle = new Bundle();
+ int error = mSatelliteServiceController.requestIsSatelliteDemoModeEnabled(
+ new Consumer<Boolean>() {
+ @Override
+ public void accept(Boolean enabled) {
+ bundle.putBoolean(SatelliteManager.KEY_DEMO_MODE_ENABLED, enabled);
+ }
+ });
+ result.send(error, bundle);
+ } else {
+ result.send(SatelliteManager.SATELLITE_SERVICE_ERROR, null);
+ }
+ }
+
+ /**
* Request to get whether the satellite service is supported on the device.
*
* @param subId The subId of the subscription to check satellite service support for.
@@ -13040,8 +13128,7 @@
return;
}
- SatellitePositionUpdateHandler handler =
- mSatellitePositionUpdateHandlers.get(validSubId);
+ SatellitePositionUpdateHandler handler = mSatellitePositionUpdateHandlers.get(validSubId);
if (handler != null) {
handler.addListener(callback);
return;
@@ -13049,11 +13136,16 @@
handler = new SatellitePositionUpdateHandler(Looper.getMainLooper());
handler.addListener(callback);
mSatellitePositionUpdateHandlers.put(validSubId, handler);
- phone.registerForSatellitePointingInfoChanged(handler,
- SatellitePositionUpdateHandler.EVENT_POSITION_UPDATE, null);
- phone.registerForSatelliteDatagramsDelivered(handler,
- SatellitePositionUpdateHandler.EVENT_MESSAGE_TRANSFER_STATE_UPDATE,
- null);
+ if (mIsSatelliteServiceSupported) {
+ mSatelliteServiceController.registerForSatellitePositionInfoChanged(handler,
+ SatellitePositionUpdateHandler.EVENT_POSITION_INFO_CHANGED, null);
+ mSatelliteServiceController.registerForDatagramTransferStateChanged(handler,
+ SatellitePositionUpdateHandler.EVENT_DATAGRAM_TRANSFER_STATE_CHANGED, null);
+ } else {
+ phone.registerForSatellitePositionInfoChanged(handler,
+ SatellitePositionUpdateHandler.EVENT_POSITION_INFO_CHANGED, null);
+ // TODO: registerForDatagramTransferStateChanged through SatelliteController
+ }
}
sendRequestAsync(CMD_START_SATELLITE_POSITION_UPDATES,
@@ -13088,11 +13180,6 @@
}
Phone phone = getPhoneOrDefault(validSubId, "stopSatellitePositionUpdates");
- if (phone == null) {
- result.accept(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE);
- return;
- }
-
SatellitePositionUpdateHandler handler = mSatellitePositionUpdateHandlers.get(validSubId);
if (handler != null) {
handler.removeListener(callback);
@@ -13110,8 +13197,17 @@
}
mSatellitePositionUpdateHandlers.remove(validSubId);
- phone.unregisterForSatellitePointingInfoChanged(handler);
- phone.unregisterForSatelliteDatagramsDelivered(handler);
+ if (mIsSatelliteServiceSupported) {
+ mSatelliteServiceController.unregisterForSatellitePositionInfoChanged(handler);
+ mSatelliteServiceController.unregisterForDatagramTransferStateChanged(handler);
+ } else {
+ if (phone == null) {
+ result.accept(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE);
+ return;
+ }
+ phone.unregisterForSatellitePositionInfoChanged(handler);
+ // TODO: unregisterForDatagramTransferStateChanged through SatelliteController
+ }
}
/**
@@ -13248,9 +13344,9 @@
}
/**
- * Register for the satellite provision state change.
+ * Registers for the satellite provision state changed.
*
- * @param subId The subId of the subscription to register for provision state changes.
+ * @param subId The subId of the subscription to register for provision state changed.
* @param callback The callback to handle the satellite provision state changed event.
*
* @return The {@link SatelliteManager.SatelliteError} result of the operation.
@@ -13265,10 +13361,10 @@
}
/**
- * Unregister for the satellite provision state change.
+ * Unregisters for the satellite provision state changed.
* If callback was not registered before, the request will be ignored.
*
- * @param subId The subId of the subscription to unregister for provision state changes.
+ * @param subId The subId of the subscription to unregister for provision state changed.
* @param callback The callback that was passed to
* {@link #registerForSatelliteProvisionStateChanged(int, ISatelliteProvisionStateCallback)}.
*
@@ -13313,23 +13409,23 @@
}
/**
- * Register for listening to satellite modem state changes.
+ * Registers for modem state changed from satellite modem.
*
- * @param subId The subId of the subscription to register for satellite modem state changes.
- * @param callback The callback to handle the satellite modem state change event.
+ * @param subId The subId of the subscription to register for satellite modem state changed.
+ * @param callback The callback to handle the satellite modem state changed event.
*
* @return The {@link SatelliteManager.SatelliteError} result of the operation.
*
* @throws SecurityException if the caller doesn't have the required permission.
*/
@Override
- @SatelliteManager.SatelliteError public int registerForSatelliteModemStateChange(int subId,
+ @SatelliteManager.SatelliteError public int registerForSatelliteModemStateChanged(int subId,
@NonNull ISatelliteStateCallback callback) {
- enforceSatelliteCommunicationPermission("registerForSatelliteModemStateChange");
+ enforceSatelliteCommunicationPermission("registerForSatelliteModemStateChanged");
final int validSubId = getValidSatelliteSubId(subId);
Phone phone = getPhoneOrDefault(
- validSubId, "registerForSatelliteModemStateChange");
+ validSubId, "registerForSatelliteModemStateChanged");
if (phone == null) {
return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
}
@@ -13339,10 +13435,19 @@
if (satelliteStateListenerHandler == null) {
satelliteStateListenerHandler = new SatelliteStateListenerHandler(
Looper.getMainLooper(), validSubId);
- phone.registerForSatelliteModemStateChange(satelliteStateListenerHandler,
- SatelliteStateListenerHandler.EVENT_SATELLITE_MODEM_STATE_CHANGE, null);
- phone.registerForPendingDatagramCount(satelliteStateListenerHandler,
- SatelliteStateListenerHandler.EVENT_PENDING_DATAGRAM_COUNT, null);
+ if (mIsSatelliteServiceSupported) {
+ mSatelliteServiceController.registerForSatelliteModemStateChanged(
+ satelliteStateListenerHandler,
+ SatelliteStateListenerHandler.EVENT_SATELLITE_MODEM_STATE_CHANGE, null);
+ mSatelliteServiceController.registerForPendingDatagramCount(
+ satelliteStateListenerHandler,
+ SatelliteStateListenerHandler.EVENT_PENDING_DATAGRAM_COUNT, null);
+ } else {
+ phone.registerForSatelliteModemStateChanged(satelliteStateListenerHandler,
+ SatelliteStateListenerHandler.EVENT_SATELLITE_MODEM_STATE_CHANGE, null);
+ phone.registerForPendingDatagramCount(satelliteStateListenerHandler,
+ SatelliteStateListenerHandler.EVENT_PENDING_DATAGRAM_COUNT, null);
+ }
}
satelliteStateListenerHandler.addListener(callback);
@@ -13351,35 +13456,38 @@
}
/**
- * Unregister from listening to satellite modem state changes.
+ * Unregisters for modem state changed from satellite modem.
* If callback was not registered before, the request will be ignored.
*
- * @param subId The subId of the subscription to unregister for satellite modem state changes.
+ * @param subId The subId of the subscription to unregister for satellite modem state changed.
* @param callback The callback that was passed to
- * {@link #registerForSatelliteModemStateChange(int, ISatelliteStateCallback)}.
+ * {@link #registerForSatelliteModemStateChanged(int, ISatelliteStateCallback)}.
*
* @throws SecurityException if the caller doesn't have the required permission.
*/
@Override
- public void unregisterForSatelliteModemStateChange(int subId,
+ public void unregisterForSatelliteModemStateChanged(int subId,
@NonNull ISatelliteStateCallback callback) {
- enforceSatelliteCommunicationPermission("unregisterForSatelliteModemStateChange");
+ enforceSatelliteCommunicationPermission("unregisterForSatelliteModemStateChanged");
final int validSubId = getValidSatelliteSubId(subId);
- SatelliteStateListenerHandler satelliteStateListenerHandler =
- mSatelliteStateListenerHandlers.get(validSubId);
- if (satelliteStateListenerHandler != null) {
- satelliteStateListenerHandler.removeListener(callback);
- if (!satelliteStateListenerHandler.hasListeners()) {
+ SatelliteStateListenerHandler handler = mSatelliteStateListenerHandlers.get(validSubId);
+ if (handler != null) {
+ handler.removeListener(callback);
+ if (!handler.hasListeners()) {
mSatelliteStateListenerHandlers.remove(validSubId);
-
- Phone phone = getPhoneOrDefault(
- validSubId, "unregisterForSatelliteModemStateChange");
- if (phone == null) {
- loge("unregisterForSatelliteModemStateChange: phone is null");
+ if (mIsSatelliteServiceSupported) {
+ mSatelliteServiceController.unregisterForSatelliteModemStateChanged(handler);
+ mSatelliteServiceController.unregisterForPendingDatagramCount(handler);
} else {
- phone.unregisterForSatelliteModemStateChange(satelliteStateListenerHandler);
- phone.unregisterForPendingDatagramCount(satelliteStateListenerHandler);
+ Phone phone = getPhoneOrDefault(
+ validSubId, "unregisterForSatelliteModemStateChanged");
+ if (phone == null) {
+ loge("unregisterForSatelliteModemStateChanged: phone is null");
+ } else {
+ phone.unregisterForSatelliteModemStateChanged(handler);
+ phone.unregisterForPendingDatagramCount(handler);
+ }
}
}
}
@@ -13417,8 +13525,14 @@
if (satelliteDatagramListenerHandler == null) {
satelliteDatagramListenerHandler = new SatelliteDatagramListenerHandler(
Looper.getMainLooper(), validSubId);
- phone.registerForNewSatelliteDatagram(satelliteDatagramListenerHandler,
- SatelliteDatagramListenerHandler.EVENT_SATELLITE_DATAGRAMS_RECEIVED, null);
+ if (mIsSatelliteServiceSupported) {
+ mSatelliteServiceController.registerForSatelliteDatagramsReceived(
+ satelliteDatagramListenerHandler,
+ SatelliteDatagramListenerHandler.EVENT_SATELLITE_DATAGRAMS_RECEIVED, null);
+ } else {
+ phone.registerForSatelliteDatagramsReceived(satelliteDatagramListenerHandler,
+ SatelliteDatagramListenerHandler.EVENT_SATELLITE_DATAGRAMS_RECEIVED, null);
+ }
}
satelliteDatagramListenerHandler.addListener(callback);
@@ -13442,19 +13556,22 @@
enforceSatelliteCommunicationPermission("unregisterForSatelliteDatagram");
final int validSubId = getValidSatelliteSubId(subId);
- SatelliteDatagramListenerHandler satelliteDatagramListenerHandler =
+ SatelliteDatagramListenerHandler handler =
mSatelliteDatagramListenerHandlers.get(validSubId);
- if (satelliteDatagramListenerHandler != null) {
- satelliteDatagramListenerHandler.removeListener(callback);
+ if (handler != null) {
+ handler.removeListener(callback);
- if (!satelliteDatagramListenerHandler.hasListeners()) {
+ if (!handler.hasListeners()) {
mSatelliteDatagramListenerHandlers.remove(validSubId);
-
- Phone phone = getPhoneOrDefault(validSubId, "unregisterForSatelliteDatagram");
- if (phone == null) {
- loge("unregisterForSatelliteDatagram: phone is null");
+ if (mIsSatelliteServiceSupported) {
+ mSatelliteServiceController.unregisterForSatelliteDatagramsReceived(handler);
} else {
- phone.unregisterForNewSatelliteDatagram(satelliteDatagramListenerHandler);
+ Phone phone = getPhoneOrDefault(validSubId, "unregisterForSatelliteDatagram");
+ if (phone == null) {
+ loge("unregisterForSatelliteDatagram: phone is null");
+ } else {
+ phone.unregisterForSatelliteDatagramsReceived(handler);
+ }
}
}
}
@@ -13783,7 +13900,7 @@
}
/**
- * Register for the satellite provision state change.
+ * Registers for the satellite provision state changed.
*
* @param subId The subId of the subscription associated with the satellite service.
* @param callback The callback to handle the satellite provision state changed event.
@@ -13807,8 +13924,15 @@
if (satelliteProvisionStateChangedHandler == null) {
satelliteProvisionStateChangedHandler = new SatelliteProvisionStateChangedHandler(
Looper.getMainLooper(), validSubId);
- phone.registerForSatelliteProvisionStateChanged(satelliteProvisionStateChangedHandler,
- SatelliteProvisionStateChangedHandler.EVENT_PROVISION_STATE_CHANGED, null);
+ if (mIsSatelliteServiceSupported) {
+ mSatelliteServiceController.registerForSatelliteProvisionStateChanged(
+ satelliteProvisionStateChangedHandler,
+ SatelliteProvisionStateChangedHandler.EVENT_PROVISION_STATE_CHANGED, null);
+ } else {
+ phone.registerForSatelliteProvisionStateChanged(
+ satelliteProvisionStateChangedHandler,
+ SatelliteProvisionStateChangedHandler.EVENT_PROVISION_STATE_CHANGED, null);
+ }
}
if (callback != null) {
@@ -13840,12 +13964,20 @@
if (!handler.hasListeners()) {
mSatellitePositionUpdateHandlers.remove(arg.subId);
- Phone phone = getPhoneFromRequest(request);
- if (phone == null) {
- loge("handleStartSatellitePositionUpdatesDone: phone is null");
+ if (mIsSatelliteServiceSupported) {
+ mSatelliteServiceController.unregisterForSatellitePositionInfoChanged(
+ handler);
+ mSatelliteServiceController.unregisterForDatagramTransferStateChanged(
+ handler);
} else {
- phone.unregisterForSatellitePointingInfoChanged(handler);
- phone.unregisterForSatelliteDatagramsDelivered(handler);
+ Phone phone = getPhoneFromRequest(request);
+ if (phone == null) {
+ loge("handleStartSatellitePositionUpdatesDone: phone is null");
+ } else {
+ phone.unregisterForSatellitePositionInfoChanged(handler);
+ // TODO: unregisterForDatagramTransferStateChanged through
+ // SatelliteController
+ }
}
}
}
@@ -13903,14 +14035,4 @@
return mCarrierId;
}
}
-
- private static SatelliteDatagram[] convertToSatelliteDatagramArray(byte[][] datagrams) {
- // Convert 2D byte array into SatelliteDatagramArray.
- SatelliteDatagram[] satelliteDatagramArray =
- new SatelliteDatagram[datagrams.length];
- for (int i = 0; i < datagrams.length; i++) {
- satelliteDatagramArray[i] = new SatelliteDatagram(datagrams[i]);
- }
- return satelliteDatagramArray;
- }
}