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);
     }