Added datagramId in satellite datagram apis.
The following changes are made in this CL:
- Added datagramId paramater in sendSatelliteDatagram()
- Added datagramId, datagramReceiverAck callback in onSatelliteDatagram()
Bug: 260896985
Test: atest SatelliteManagerTest
Change-Id: Ibe5cd94e886e91bd04a8130f779d0b4df0f9772f
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 29c9dc2..93810fe 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -146,6 +146,7 @@
import android.telephony.ims.stub.ImsConfigImplBase;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.telephony.satellite.ISatelliteDatagramCallback;
+import android.telephony.satellite.ISatelliteDatagramReceiverAck;
import android.telephony.satellite.ISatellitePositionUpdateCallback;
import android.telephony.satellite.ISatelliteProvisionStateCallback;
import android.telephony.satellite.ISatelliteStateCallback;
@@ -591,15 +592,19 @@
}
private static final class SendSatelliteDatagramArgument {
+ public long datagramId;
+
public @SatelliteManager.DatagramType int datagramType;
public @NonNull SatelliteDatagram datagram;
- public @NonNull Consumer<Integer> callback;
+ public @NonNull ResultReceiver result;
- SendSatelliteDatagramArgument(@SatelliteManager.DatagramType int datagramType,
- SatelliteDatagram datagram, Consumer<Integer> callback) {
+ SendSatelliteDatagramArgument(long datagramId,
+ @SatelliteManager.DatagramType int datagramType,
+ SatelliteDatagram datagram, ResultReceiver result) {
+ this.datagramId = datagramId;
this.datagramType = datagramType;
this.datagram = datagram;
- this.callback = callback;
+ this.result = result;
}
}
@@ -792,6 +797,27 @@
}
}
+ /** Callback used by datagram receiver app to send ack back to Telephony. */
+ private static final ISatelliteDatagramReceiverAck.Stub mDatagramReceiverAck =
+ new ISatelliteDatagramReceiverAck.Stub() {
+ /**
+ * This callback will be used by datagram receiver app to send ack back to
+ * Telephony. If the callback is not received within five minutes,
+ * then Telephony will resend the datagram again.
+ *
+ * @param datagramId An id that uniquely identifies datagram
+ * received by satellite datagram receiver app.
+ * This should match with datagramId passed in
+ * {@link SatelliteDatagramCallback#onSatelliteDatagramReceived(
+ * long, SatelliteDatagram, int, ISatelliteDatagramReceiverAck)}.
+ * Upon receiving the ack, Telephony will remove the datagram from
+ * the persistent memory.
+ */
+ public void acknowledgeSatelliteDatagramReceived(long datagramId) {
+
+ }
+ };
+
private static final class SatelliteDatagramListenerHandler extends Handler {
public static final int EVENT_SATELLITE_DATAGRAMS_RECEIVED = 1;
@@ -828,7 +854,11 @@
log("Received EVENT_SATELLITE_DATAGRAMS_RECEIVED for subId=" + mSubId);
mListeners.values().forEach(listener -> {
try {
- listener.onSatelliteDatagrams(satelliteDatagramArray);
+ for(SatelliteDatagram datagram : satelliteDatagramArray) {
+ // TODO (b/269637555): wait for ack and retry after 5mins
+ listener.onSatelliteDatagramReceived(0, datagram, 0,
+ mDatagramReceiverAck);
+ }
} catch (RemoteException e) {
log("EVENT_SATELLITE_DATAGRAMS_RECEIVED RemoteException: " + e);
}
@@ -2926,8 +2956,8 @@
phone.sendSatelliteDatagram(onCompleted, argument.datagram);
} else {
loge("sendSatelliteDatagram: No phone object");
- argument.callback.accept(
- SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE);
+ argument.result.send(
+ SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE, null);
}
break;
}
@@ -2938,7 +2968,12 @@
int error = getSatelliteError(ar, "sendSatelliteDatagram", false);
SendSatelliteDatagramArgument argument =
(SendSatelliteDatagramArgument) request.argument;
- argument.callback.accept(error);
+ Bundle bundle = new Bundle();
+ if (error == SatelliteManager.SATELLITE_ERROR_NONE) {
+ bundle.putLong(SatelliteManager.KEY_SEND_SATELLITE_DATAGRAM,
+ argument.datagramId);
+ }
+ argument.result.send(error, bundle);
break;
}
@@ -13088,19 +13123,19 @@
}
/**
- * Request to get the maximum number of characters per text message on satellite.
+ * Request to get the maximum number of bytes per datagram that can be sent to satellite.
*
* @param subId The subId of the subscription to get the maximum number of characters for.
- * @param result The result receiver that returns the maximum number of characters per text
+ * @param result The result receiver that returns the maximum number of bytes per datagram
* message on satellite 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 requestMaxCharactersPerSatelliteTextMessage(int subId,
+ public void requestMaxSizePerSendingDatagram(int subId,
@NonNull ResultReceiver result) {
- enforceSatelliteCommunicationPermission("requestMaxCharactersPerSatelliteTextMessage");
+ enforceSatelliteCommunicationPermission("requestMaxSizePerSendingDatagram");
if (!isSatelliteSupported()) {
result.send(SatelliteManager.SATELLITE_NOT_SUPPORTED, null);
return;
@@ -13112,7 +13147,7 @@
return;
}
- Phone phone = getPhoneOrDefault(validSubId, "requestMaxCharactersPerSatelliteTextMessage");
+ Phone phone = getPhoneOrDefault(validSubId, "requestMaxSizePerSendingDatagram");
if (phone == null) {
result.send(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE, null);
return;
@@ -13430,7 +13465,8 @@
*
* This method requests modem to check if there are any pending datagrams to be received over
* satellite. If there are any incoming datagrams, they will be received via
- * {@link SatelliteDatagramCallback#onSatelliteDatagrams(SatelliteDatagram[])}
+ * {@link SatelliteDatagramCallback#onSatelliteDatagramReceived(long, SatelliteDatagram, int,
+ * ISatelliteDatagramReceiverAck)}
*
* @param subId The subId of the subscription used for receiving datagrams.
* @param callback The callback to get {@link SatelliteManager.SatelliteError} of the request.
@@ -13460,11 +13496,12 @@
/**
* Send datagram over satellite.
*
- * Gateway encodes SOS SMS or location sharing message into a datagram and passes it as input to
- * this method. Datagram received here will be passed down to modem without any encoding or
- * encryption.
+ * Gateway encodes SOS message or location sharing message into a datagram and passes it as
+ * input to this method. Datagram received here will be passed down to modem without any
+ * encoding or encryption.
*
* @param subId The subId of the subscription to send satellite datagrams for.
+ * @param datagramId An id that uniquely identifies datagram requested to be sent.
* @param datagramType datagram type indicating whether the datagram is of type
* SOS_SMS or LOCATION_SHARING.
* @param datagram encoded gateway datagram which is encrypted by the caller.
@@ -13474,27 +13511,27 @@
* @throws SecurityException if the caller doesn't have required permission.
*/
@Override
- public void sendSatelliteDatagram(int subId, @SatelliteManager.DatagramType int datagramType,
- SatelliteDatagram datagram, IIntegerConsumer callback) {
+ public void sendSatelliteDatagram(int subId, long datagramId,
+ @SatelliteManager.DatagramType int datagramType, SatelliteDatagram datagram,
+ @NonNull ResultReceiver result) {
enforceSatelliteCommunicationPermission("sendSatelliteDatagram");
- Consumer<Integer> result = FunctionalUtils.ignoreRemoteException(callback::accept);
final int validSubId = getValidSatelliteSubId(subId);
if (!isSatelliteProvisioned(validSubId)) {
- result.accept(SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED);
+ result.send(SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED, null);
return;
}
Phone phone = getPhoneOrDefault(validSubId, "sendSatelliteDatagram");
if (phone == null) {
- result.accept(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE);
+ result.send(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE, null);
return;
}
// check if we need to start PointingUI.
sendRequestAsync(CMD_SEND_SATELLITE_DATAGRAM,
- new SendSatelliteDatagramArgument(datagramType, datagram, result),
+ new SendSatelliteDatagramArgument(datagramId, datagramType, datagram, result),
phone, null);
}