Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74efadf7 authored by Aishwarya Mallampati's avatar Aishwarya Mallampati Committed by Android (Google) Code Review
Browse files

Merge "Added datagramId in satellite datagram apis." into udc-dev

parents c00fb6ad 37414923
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.telephony.satellite;

import android.telephony.satellite.ISatelliteDatagramReceiverAck;
import android.telephony.satellite.SatelliteDatagram;

/**
@@ -24,8 +25,15 @@ import android.telephony.satellite.SatelliteDatagram;
 */
oneway interface ISatelliteDatagramCallback {
    /**
     * Called when there are incoming datagrams to be received.
     * @param datagrams Array of datagrams to be received over satellite.
     * Called when datagrams are received from satellite.
     *
     * @param datagramId An id that uniquely identifies incoming datagram.
     * @param datagram datagram received from satellite.
     * @param pendingCount Number of datagrams yet to be received from satellite.
     * @param callback This callback will be used by datagram receiver app to send ack back to
     *                 Telephony. If the callback is not received within five minutes,
     *                 Telephony will resend the datagrams.
     */
    void onSatelliteDatagrams(in SatelliteDatagram[] datagrams);
    void onSatelliteDatagramReceived(long datagramId, in SatelliteDatagram datagram,
            int pendingCount, ISatelliteDatagramReceiverAck callback);
}
+41 −0
Original line number Diff line number Diff line
/*
 * Copyright 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.telephony.satellite;

import android.telephony.satellite.PointingInfo;
import android.telephony.satellite.SatelliteDatagram;

/**
 * Interface for satellite datagram receiver acknowledgement.
 * @hide
 */
oneway interface ISatelliteDatagramReceiverAck {
     /**
      * 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.
      */
    void acknowledgeSatelliteDatagramReceived(in long datagramId);
}
+11 −4
Original line number Diff line number Diff line
@@ -38,10 +38,12 @@ public class SatelliteDatagramCallback {
        }

        @Override
        public void onSatelliteDatagrams(SatelliteDatagram[] datagrams) {
        public void onSatelliteDatagramReceived(long datagramId, SatelliteDatagram datagram,
                int pendingCount, ISatelliteDatagramReceiverAck callback) {
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                mExecutor.execute(() -> mLocalCallback.onSatelliteDatagrams(datagrams));
                mExecutor.execute(() -> mLocalCallback.onSatelliteDatagramReceived(datagramId,
                        datagram, pendingCount, callback));
            } finally {
                restoreCallingIdentity(callingIdentity);
            }
@@ -54,9 +56,14 @@ public class SatelliteDatagramCallback {

    /**
     * Called when there are incoming datagrams to be received.
     * @param datagrams Datagrams to be received over satellite.
     * @param datagramId An id that uniquely identifies incoming datagram.
     * @param datagram datagram to be received over satellite.
     * @param pendingCount Number of datagrams yet to be received by the app.
     * @param callback This callback will be used by datagram receiver app to send ack back to
     *                 Telephony.
     */
    public void onSatelliteDatagrams(SatelliteDatagram[] datagrams) {
    public void onSatelliteDatagramReceived(long datagramId, SatelliteDatagram datagram,
            int pendingCount, ISatelliteDatagramReceiverAck callback) {
        // Base Implementation
    }

+51 −21
Original line number Diff line number Diff line
@@ -130,7 +130,7 @@ public class SatelliteManager {

    /**
     * Bundle key to get the response from
     * {@link #requestMaxCharactersPerSatelliteTextMessage(Executor, OutcomeReceiver)}.
     * {@link #requestMaxSizePerSendingDatagram(Executor, OutcomeReceiver)} .
     * @hide
     */
    public static final String KEY_MAX_CHARACTERS_PER_SATELLITE_TEXT =
@@ -158,6 +158,13 @@ public class SatelliteManager {
     */
    public static final String KEY_SATELLITE_NEXT_VISIBILITY = "satellite_next_visibility";

    /**
     * Bundle key to get the respoonse from
     * {@link #sendSatelliteDatagram(long, int, SatelliteDatagram, Executor, OutcomeReceiver)}.
     * @hide
     */
    public static final String KEY_SEND_SATELLITE_DATAGRAM = "send_satellite_datagram";

    /**
     * The request was successfully processed.
     */
@@ -541,8 +548,8 @@ public class SatelliteManager {
    @Retention(RetentionPolicy.SOURCE)
    public @interface SatelliteModemState {}

    /** Datagram type indicating that the datagram to be sent or received is of type SOS SMS. */
    public static final int DATAGRAM_TYPE_SOS_SMS = 0;
    /** Datagram type indicating that the datagram to be sent or received is of type SOS message. */
    public static final int DATAGRAM_TYPE_SOS_MESSAGE = 0;

    /** Datagram type indicating that the datagram to be sent or received is of type
     * location sharing. */
@@ -551,7 +558,7 @@ public class SatelliteManager {
    @IntDef(
            prefix = "DATAGRAM_TYPE_",
            value = {
                    DATAGRAM_TYPE_SOS_SMS,
                    DATAGRAM_TYPE_SOS_MESSAGE,
                    DATAGRAM_TYPE_LOCATION_SHARING,
            })
    @Retention(RetentionPolicy.SOURCE)
@@ -651,19 +658,20 @@ public class SatelliteManager {
    }

    /**
     * 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 executor The executor on which the callback will be called.
     * @param callback The callback object to which the result will be delivered.
     *                 If the request is successful, {@link OutcomeReceiver#onResult(Object)}
     *                 will return the maximum number of characters per text message on satellite.
     *                 will return the maximum number of bytes per datagram that can be sent to
     *                 satellite.
     *                 If the request is not successful, {@link OutcomeReceiver#onError(Throwable)}
     *
     * @throws SecurityException if the caller doesn't have required permission.
     * @throws IllegalStateException if the Telephony process is not currently available.
     */
    @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION)
    public void requestMaxCharactersPerSatelliteTextMessage(
    public void requestMaxSizePerSendingDatagram(
            @NonNull @CallbackExecutor Executor executor,
            @NonNull OutcomeReceiver<Integer, SatelliteException> callback) {
        Objects.requireNonNull(executor);
@@ -693,7 +701,7 @@ public class SatelliteManager {
                        }
                    }
                };
                telephony.requestMaxCharactersPerSatelliteTextMessage(mSubId, receiver);
                telephony.requestMaxSizePerSendingDatagram(mSubId, receiver);
            } else {
                throw new IllegalStateException("telephony service is null.");
            }
@@ -1039,7 +1047,8 @@ public class SatelliteManager {
     *
     * 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 executor The executor on which the result listener will be called.
     * @param resultListener Listener for the {@link SatelliteError} result of the operation.
@@ -1076,39 +1085,60 @@ public class SatelliteManager {
    /**
     * 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 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.
     *                 Datagram will be passed down to modem without any encoding or encryption.
     * @param executor The executor on which the result listener will be called.
     * @param resultListener Listener for the {@link SatelliteError} result of the operation.
     * @param callback The callback object to which the result will be returned.
     *                 If datagram is sent successfully, then
     *                 {@link OutcomeReceiver#onResult(Object)} will return datagramId.
     *                 If the request is not successful, {@link OutcomeReceiver#onError(Throwable)}
     *                 will return a {@link SatelliteException} with the {@link SatelliteError}.
     *
     * @throws SecurityException if the caller doesn't have required permission.
     * @throws IllegalStateException if the Telephony process is not currently available.
     */
    @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION)
    public void sendSatelliteDatagram(@DatagramType int datagramType,
    public void sendSatelliteDatagram(long datagramId, @DatagramType int datagramType,
            @NonNull SatelliteDatagram datagram, @NonNull @CallbackExecutor Executor executor,
            @SatelliteError @NonNull Consumer<Integer> resultListener) {
            @NonNull OutcomeReceiver<Long, SatelliteException> callback) {
        Objects.requireNonNull(datagram);
        Objects.requireNonNull(executor);
        Objects.requireNonNull(resultListener);
        Objects.requireNonNull(callback);

        try {
            ITelephony telephony = getITelephony();
            if (telephony != null) {
                IIntegerConsumer internalCallback = new IIntegerConsumer.Stub() {
                ResultReceiver receiver = new ResultReceiver(null) {
                    @Override
                    public void accept(int result) {
                        executor.execute(() -> Binder.withCleanCallingIdentity(
                                () -> resultListener.accept(result)));
                    protected void onReceiveResult(int resultCode, Bundle resultData) {
                        if (resultCode == SATELLITE_ERROR_NONE) {
                            if (resultData.containsKey(KEY_SEND_SATELLITE_DATAGRAM)) {
                                long resultDatagramId = resultData
                                        .getLong(KEY_SEND_SATELLITE_DATAGRAM);
                                executor.execute(() -> Binder.withCleanCallingIdentity(() ->
                                        callback.onResult(resultDatagramId)));
                            } else {
                                loge("KEY_SEND_SATELLITE_DATAGRAM does not exist.");
                                executor.execute(() -> Binder.withCleanCallingIdentity(() ->
                                        callback.onError(
                                                new SatelliteException(SATELLITE_REQUEST_FAILED))));
                            }

                        } else {
                            executor.execute(() -> Binder.withCleanCallingIdentity(() ->
                                    callback.onError(new SatelliteException(resultCode))));
                        }
                    }
                };
                telephony.sendSatelliteDatagram(mSubId, datagramType, datagram, internalCallback);
                telephony.sendSatelliteDatagram(mSubId, datagramId, datagramType, datagram,
                        receiver);
            } else {
                throw new IllegalStateException("telephony service is null.");
            }
+8 −6
Original line number Diff line number Diff line
@@ -2772,15 +2772,15 @@ interface ITelephony {
            in ISatellitePositionUpdateCallback callback);

    /**
     * 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 receiver Result receiver to get the error code of the request and the requested
     *                 maximum number of characters per text message on satellite.
     *                 maximum number of bytes per datagram that can be sent to satellite.
     */
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
            + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
    void requestMaxCharactersPerSatelliteTextMessage(int subId, in ResultReceiver receiver);
    void requestMaxSizePerSendingDatagram(int subId, in ResultReceiver receiver);

    /**
     * Register the subscription with a satellite provider.
@@ -2912,14 +2912,16 @@ interface ITelephony {
    * Send datagram over satellite.
    *
    * @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 Type of datagram.
    * @param datagram Datagram to send over satellite.
    * @param callback The callback to get the error code of the request.
    * @param receiver Result receiver to get the datagramId if datagram is sent successfully else
    *                 error code of the request.
    */
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
            + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
    void sendSatelliteDatagram(int subId, int datagramType, in SatelliteDatagram datagram,
            IIntegerConsumer callback);
    void sendSatelliteDatagram(int subId, long datagramId, int datagramType,
            in SatelliteDatagram datagram, in ResultReceiver receiver);

    /**
     * Request to get whether satellite communication is allowed for the current location.