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