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

Commit 8d7b060b authored by Mohamed Abdalkader's avatar Mohamed Abdalkader
Browse files

Move Sms API to proper MMTelFeature class

- while here remove unnecessary call to ackSms from
  SmsImplBase as this is handled by ImsSmsDispatcher

Test: None, APIs not exercised yet.
BUG=69846044
Change-Id: Iec4bbd07a67502dbbfb2142a7bc95f51be0cb377
parent b0538e6d
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -496,6 +496,7 @@ java_library {
        "telephony/java/com/android/ims/internal/IImsService.aidl",
        "telephony/java/com/android/ims/internal/IImsService.aidl",
        "telephony/java/com/android/ims/internal/IImsServiceController.aidl",
        "telephony/java/com/android/ims/internal/IImsServiceController.aidl",
        "telephony/java/com/android/ims/internal/IImsServiceFeatureCallback.aidl",
        "telephony/java/com/android/ims/internal/IImsServiceFeatureCallback.aidl",
	"telephony/java/com/android/ims/internal/IImsSmsListener.aidl",
        "telephony/java/com/android/ims/internal/IImsStreamMediaSession.aidl",
        "telephony/java/com/android/ims/internal/IImsStreamMediaSession.aidl",
        "telephony/java/com/android/ims/internal/IImsUt.aidl",
        "telephony/java/com/android/ims/internal/IImsUt.aidl",
        "telephony/java/com/android/ims/internal/IImsUtListener.aidl",
        "telephony/java/com/android/ims/internal/IImsUtListener.aidl",
+71 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package android.telephony.ims.feature;
import android.app.PendingIntent;
import android.app.PendingIntent;
import android.os.Message;
import android.os.Message;
import android.os.RemoteException;
import android.os.RemoteException;
import android.telephony.ims.internal.stub.SmsImplBase;


import com.android.ims.ImsCallProfile;
import com.android.ims.ImsCallProfile;
import com.android.ims.internal.IImsCallSession;
import com.android.ims.internal.IImsCallSession;
@@ -28,6 +29,7 @@ import com.android.ims.internal.IImsEcbm;
import com.android.ims.internal.IImsMMTelFeature;
import com.android.ims.internal.IImsMMTelFeature;
import com.android.ims.internal.IImsMultiEndpoint;
import com.android.ims.internal.IImsMultiEndpoint;
import com.android.ims.internal.IImsRegistrationListener;
import com.android.ims.internal.IImsRegistrationListener;
import com.android.ims.internal.IImsSmsListener;
import com.android.ims.internal.IImsUt;
import com.android.ims.internal.IImsUt;
import com.android.ims.internal.ImsCallSession;
import com.android.ims.internal.ImsCallSession;


@@ -171,6 +173,42 @@ public class MMTelFeature extends ImsFeature {
                return MMTelFeature.this.getMultiEndpointInterface();
                return MMTelFeature.this.getMultiEndpointInterface();
            }
            }
        }
        }

        @Override
        public void setSmsListener(IImsSmsListener l) throws RemoteException {
            synchronized (mLock) {
                MMTelFeature.this.setSmsListener(l);
            }
        }

        @Override
        public void sendSms(int token, int messageRef, String format, String smsc, boolean retry,
                byte[] pdu) {
            synchronized (mLock) {
                MMTelFeature.this.sendSms(token, messageRef, format, smsc, retry, pdu);
            }
        }

        @Override
        public void acknowledgeSms(int token, int messageRef, int result) {
            synchronized (mLock) {
                MMTelFeature.this.acknowledgeSms(token, messageRef, result);
            }
        }

        @Override
        public void acknowledgeSmsReport(int token, int messageRef, int result) {
            synchronized (mLock) {
                MMTelFeature.this.acknowledgeSmsReport(token, messageRef, result);
            }
        }

        @Override
        public String getSmsFormat() {
            synchronized (mLock) {
                return MMTelFeature.this.getSmsFormat();
            }
        }
    };
    };


    /**
    /**
@@ -346,6 +384,39 @@ public class MMTelFeature extends ImsFeature {
        return null;
        return null;
    }
    }


    public void setSmsListener(IImsSmsListener listener) {
        getSmsImplementation().registerSmsListener(listener);
    }

    public void sendSms(int token, int messageRef, String format, String smsc, boolean isRetry,
            byte[] pdu) {
        getSmsImplementation().sendSms(token, messageRef, format, smsc, isRetry, pdu);
    }

    public void acknowledgeSms(int token, int messageRef,
            @SmsImplBase.DeliverStatusResult int result) {
        getSmsImplementation().acknowledgeSms(token, messageRef, result);
    }

    public void acknowledgeSmsReport(int token, int messageRef,
            @SmsImplBase.StatusReportResult int result) {
        getSmsImplementation().acknowledgeSmsReport(token, messageRef, result);
    }

    /**
     * Must be overridden by IMS Provider to be able to support SMS over IMS. Otherwise a default
     * non-functional implementation is returned.
     *
     * @return an instance of {@link SmsImplBase} which should be implemented by the IMS Provider.
     */
    protected SmsImplBase getSmsImplementation() {
        return new SmsImplBase();
    }

    public String getSmsFormat() {
        return getSmsImplementation().getSmsFormat();
    }

    @Override
    @Override
    public void onFeatureReady() {
    public void onFeatureReady() {


+9 −8
Original line number Original line Diff line number Diff line
@@ -17,7 +17,6 @@
package android.telephony.ims.internal;
package android.telephony.ims.internal;


import android.annotation.IntDef;
import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.os.RemoteException;
import android.os.RemoteException;
import android.telephony.SmsManager;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.SmsMessage;
@@ -37,6 +36,7 @@ import java.lang.annotation.RetentionPolicy;
public class SmsImplBase {
public class SmsImplBase {
  private static final String LOG_TAG = "SmsImplBase";
  private static final String LOG_TAG = "SmsImplBase";


  /** @hide */
  @IntDef({
  @IntDef({
          SEND_STATUS_OK,
          SEND_STATUS_OK,
          SEND_STATUS_ERROR,
          SEND_STATUS_ERROR,
@@ -68,6 +68,7 @@ public class SmsImplBase {
   */
   */
  public static final int SEND_STATUS_ERROR_FALLBACK = 4;
  public static final int SEND_STATUS_ERROR_FALLBACK = 4;


  /** @hide */
  @IntDef({
  @IntDef({
          DELIVER_STATUS_OK,
          DELIVER_STATUS_OK,
          DELIVER_STATUS_ERROR
          DELIVER_STATUS_ERROR
@@ -84,6 +85,7 @@ public class SmsImplBase {
   */
   */
  public static final int DELIVER_STATUS_ERROR = 2;
  public static final int DELIVER_STATUS_ERROR = 2;


  /** @hide */
  @IntDef({
  @IntDef({
          STATUS_REPORT_STATUS_OK,
          STATUS_REPORT_STATUS_OK,
          STATUS_REPORT_STATUS_ERROR
          STATUS_REPORT_STATUS_ERROR
@@ -128,8 +130,8 @@ public class SmsImplBase {
   *             callbacks for this specific message.
   *             callbacks for this specific message.
   * @param messageRef the message reference.
   * @param messageRef the message reference.
   * @param format the format of the message. Valid values are {@link SmsMessage#FORMAT_3GPP} and
   * @param format the format of the message. Valid values are {@link SmsMessage#FORMAT_3GPP} and
   * @param smsc the Short Message Service Center address.
   *               {@link SmsMessage#FORMAT_3GPP2}.
   *               {@link SmsMessage#FORMAT_3GPP2}.
   * @param smsc the Short Message Service Center address.
   * @param isRetry whether it is a retry of an already attempted message or not.
   * @param isRetry whether it is a retry of an already attempted message or not.
   * @param pdu PDUs representing the contents of the message.
   * @param pdu PDUs representing the contents of the message.
   */
   */
@@ -154,7 +156,7 @@ public class SmsImplBase {
   * @param messageRef the message reference
   * @param messageRef the message reference
   */
   */
  public void acknowledgeSms(int token, int messageRef, @DeliverStatusResult int result) {
  public void acknowledgeSms(int token, int messageRef, @DeliverStatusResult int result) {

    Log.e(LOG_TAG, "acknowledgeSms() not implemented.");
  }
  }


  /**
  /**
@@ -168,7 +170,7 @@ public class SmsImplBase {
   * @param messageRef the message reference
   * @param messageRef the message reference
   */
   */
  public void acknowledgeSmsReport(int token, int messageRef, @StatusReportResult int result) {
  public void acknowledgeSmsReport(int token, int messageRef, @StatusReportResult int result) {

    Log.e(LOG_TAG, "acknowledgeSmsReport() not implemented.");
  }
  }


  /**
  /**
@@ -193,7 +195,6 @@ public class SmsImplBase {
      }
      }
      try {
      try {
        mListener.onSmsReceived(token, format, pdu);
        mListener.onSmsReceived(token, format, pdu);
        acknowledgeSms(token, 0, DELIVER_STATUS_OK);
      } catch (RemoteException e) {
      } catch (RemoteException e) {
        Log.e(LOG_TAG, "Can not deliver sms: " + e.getMessage());
        Log.e(LOG_TAG, "Can not deliver sms: " + e.getMessage());
        acknowledgeSms(token, 0, DELIVER_STATUS_ERROR);
        acknowledgeSms(token, 0, DELIVER_STATUS_ERROR);
+271 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2018 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.ims.internal.stub;

import android.annotation.IntDef;
import android.os.RemoteException;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.ims.internal.feature.MmTelFeature;
import android.util.Log;

import com.android.ims.internal.IImsSmsListener;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Base implementation for SMS over IMS.
 *
 * Any service wishing to provide SMS over IMS should extend this class and implement all methods
 * that the service supports.
 * @hide
 */
public class SmsImplBase {
    private static final String LOG_TAG = "SmsImplBase";

    @IntDef({
            SEND_STATUS_OK,
            SEND_STATUS_ERROR,
            SEND_STATUS_ERROR_RETRY,
            SEND_STATUS_ERROR_FALLBACK
        })
    @Retention(RetentionPolicy.SOURCE)
    public @interface SendStatusResult {}
    /**
     * Message was sent successfully.
     */
    public static final int SEND_STATUS_OK = 1;

    /**
     * IMS provider failed to send the message and platform should not retry falling back to sending
     * the message using the radio.
     */
    public static final int SEND_STATUS_ERROR = 2;

    /**
     * IMS provider failed to send the message and platform should retry again after setting TP-RD bit
     * to high.
     */
    public static final int SEND_STATUS_ERROR_RETRY = 3;

    /**
     * IMS provider failed to send the message and platform should retry falling back to sending
     * the message using the radio.
     */
    public static final int SEND_STATUS_ERROR_FALLBACK = 4;

    @IntDef({
            DELIVER_STATUS_OK,
            DELIVER_STATUS_ERROR
        })
    @Retention(RetentionPolicy.SOURCE)
    public @interface DeliverStatusResult {}
    /**
     * Message was delivered successfully.
     */
    public static final int DELIVER_STATUS_OK = 1;

    /**
     * Message was not delivered.
     */
    public static final int DELIVER_STATUS_ERROR = 2;

    @IntDef({
            STATUS_REPORT_STATUS_OK,
            STATUS_REPORT_STATUS_ERROR
        })
    @Retention(RetentionPolicy.SOURCE)
    public @interface StatusReportResult {}

    /**
     * Status Report was set successfully.
     */
    public static final int STATUS_REPORT_STATUS_OK = 1;

    /**
     * Error while setting status report.
     */
    public static final int STATUS_REPORT_STATUS_ERROR = 2;


    // Lock for feature synchronization
    private final Object mLock = new Object();
    private IImsSmsListener mListener;

    /**
     * Registers a listener responsible for handling tasks like delivering messages.
     *
     * @param listener listener to register.
     *
     * @hide
     */
    public final void registerSmsListener(IImsSmsListener listener) {
        synchronized (mLock) {
            mListener = listener;
        }
    }

    /**
     * This method will be triggered by the platform when the user attempts to send an SMS. This
     * method should be implemented by the IMS providers to provide implementation of sending an SMS
     * over IMS.
     *
     * @param token unique token generated by the platform that should be used when triggering
     *             callbacks for this specific message.
     * @param messageRef the message reference.
     * @param format the format of the message. Valid values are {@link SmsMessage#FORMAT_3GPP} and
     *               {@link SmsMessage#FORMAT_3GPP2}.
     * @param smsc the Short Message Service Center address.
     * @param isRetry whether it is a retry of an already attempted message or not.
     * @param pdu PDUs representing the contents of the message.
     */
    public void sendSms(int token, int messageRef, String format, String smsc, boolean isRetry,
            byte[] pdu) {
        // Base implementation returns error. Should be overridden.
        try {
            onSendSmsResult(token, messageRef, SEND_STATUS_ERROR,
                    SmsManager.RESULT_ERROR_GENERIC_FAILURE);
        } catch (RemoteException e) {
            Log.e(LOG_TAG, "Can not send sms: " + e.getMessage());
        }
    }

    /**
     * This method will be triggered by the platform after {@link #onSmsReceived(int, String, byte[])}
     * has been called to deliver the result to the IMS provider.
     *
     * @param token token provided in {@link #onSmsReceived(int, String, byte[])}
     * @param result result of delivering the message. Valid values are defined in
     * {@link DeliverStatusResult}
     * @param messageRef the message reference
     */
    public void acknowledgeSms(int token, int messageRef, @DeliverStatusResult int result) {
        Log.e(LOG_TAG, "acknowledgeSms() not implemented.");
    }

    /**
     * This method will be triggered by the platform after
     * {@link #onSmsStatusReportReceived(int, int, String, byte[])} has been called to provide the
     * result to the IMS provider.
     *
     * @param token token provided in {@link #sendSms(int, int, String, String, boolean, byte[])}
     * @param result result of delivering the message. Valid values are defined in
     * {@link StatusReportResult}
     * @param messageRef the message reference
     */
    public void acknowledgeSmsReport(int token, int messageRef, @StatusReportResult int result) {
        Log.e(LOG_TAG, "acknowledgeSmsReport() not implemented.");
    }

    /**
     * This method should be triggered by the IMS providers when there is an incoming message. The
     * platform will deliver the message to the messages database and notify the IMS provider of the
     * result by calling {@link #acknowledgeSms(int, int, int)}.
     *
     * This method must not be called before {@link MmTelFeature#onFeatureReady()} is called.
     *
     * @param token unique token generated by IMS providers that the platform will use to trigger
     *              callbacks for this message.
     * @param format the format of the message. Valid values are {@link SmsMessage#FORMAT_3GPP} and
     * {@link SmsMessage#FORMAT_3GPP2}.
     * @param pdu PDUs representing the contents of the message.
     * @throws IllegalStateException if called before {@link MmTelFeature#onFeatureReady()}
     */
    public final void onSmsReceived(int token, String format, byte[] pdu)
            throws IllegalStateException {
        synchronized (mLock) {
            if (mListener == null) {
                throw new IllegalStateException("Feature not ready.");
            }
            try {
                mListener.onSmsReceived(token, format, pdu);
            } catch (RemoteException e) {
                Log.e(LOG_TAG, "Can not deliver sms: " + e.getMessage());
                acknowledgeSms(token, 0, DELIVER_STATUS_ERROR);
            }
        }
    }

    /**
     * This method should be triggered by the IMS providers to pass the result of the sent message
     * to the platform.
     *
     * This method must not be called before {@link MmTelFeature#onFeatureReady()} is called.
     *
     * @param token token provided in {@link #sendSms(int, int, String, String, boolean, byte[])}
     * @param messageRef the message reference. Should be between 0 and 255 per TS.123.040
     * @param status result of sending the SMS. Valid values are defined in {@link SendStatusResult}
     * @param reason reason in case status is failure. Valid values are:
     *  {@link SmsManager#RESULT_ERROR_NONE},
     *  {@link SmsManager#RESULT_ERROR_GENERIC_FAILURE},
     *  {@link SmsManager#RESULT_ERROR_RADIO_OFF},
     *  {@link SmsManager#RESULT_ERROR_NULL_PDU},
     *  {@link SmsManager#RESULT_ERROR_NO_SERVICE},
     *  {@link SmsManager#RESULT_ERROR_LIMIT_EXCEEDED},
     *  {@link SmsManager#RESULT_ERROR_SHORT_CODE_NOT_ALLOWED},
     *  {@link SmsManager#RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED}
     * @throws IllegalStateException if called before {@link MmTelFeature#onFeatureReady()}
     * @throws RemoteException if the connection to the framework is not available. If this happens
     *  attempting to send the SMS should be aborted.
     */
    public final void onSendSmsResult(int token, int messageRef, @SendStatusResult int status,
            int reason) throws IllegalStateException, RemoteException {
        synchronized (mLock) {
            if (mListener == null) {
                throw new IllegalStateException("Feature not ready.");
            }
            mListener.onSendSmsResult(token, messageRef, status, reason);
        }
    }

    /**
     * Sets the status report of the sent message.
     *
     * @param token token provided in {@link #sendSms(int, int, String, String, boolean, byte[])}
     * @param messageRef the message reference.
     * @param format the format of the message. Valid values are {@link SmsMessage#FORMAT_3GPP} and
     * {@link SmsMessage#FORMAT_3GPP2}.
     * @param pdu PDUs representing the content of the status report.
     * @throws IllegalStateException if called before {@link MmTelFeature#onFeatureReady()}
     */
    public final void onSmsStatusReportReceived(int token, int messageRef, String format,
            byte[] pdu) {
        synchronized (mLock) {
            if (mListener == null) {
                throw new IllegalStateException("Feature not ready.");
            }
            try {
                mListener.onSmsStatusReportReceived(token, messageRef, format, pdu);
            } catch (RemoteException e) {
                Log.e(LOG_TAG, "Can not process sms status report: " + e.getMessage());
                acknowledgeSmsReport(token, messageRef, STATUS_REPORT_STATUS_ERROR);
            }
        }
    }

    /**
     * Returns the SMS format. Default is {@link SmsMessage#FORMAT_3GPP} unless overridden by IMS
     * Provider.
     *
     * @return  the format of the message. Valid values are {@link SmsMessage#FORMAT_3GPP} and
     * {@link SmsMessage#FORMAT_3GPP2}.
     */
    public String getSmsFormat() {
      return SmsMessage.FORMAT_3GPP;
    }
}
+8 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.ims.internal.IImsConfig;
import com.android.ims.internal.IImsEcbm;
import com.android.ims.internal.IImsEcbm;
import com.android.ims.internal.IImsMultiEndpoint;
import com.android.ims.internal.IImsMultiEndpoint;
import com.android.ims.internal.IImsRegistrationListener;
import com.android.ims.internal.IImsRegistrationListener;
import com.android.ims.internal.IImsSmsListener;
import com.android.ims.internal.IImsUt;
import com.android.ims.internal.IImsUt;


import android.os.Message;
import android.os.Message;
@@ -53,4 +54,11 @@ interface IImsMMTelFeature {
    IImsEcbm getEcbmInterface();
    IImsEcbm getEcbmInterface();
    void setUiTTYMode(int uiTtyMode, in Message onComplete);
    void setUiTTYMode(int uiTtyMode, in Message onComplete);
    IImsMultiEndpoint getMultiEndpointInterface();
    IImsMultiEndpoint getMultiEndpointInterface();
    // SMS APIs
    void setSmsListener(IImsSmsListener l);
    oneway void sendSms(in int token, int messageRef, String format, String smsc, boolean retry,
            in byte[] pdu);
    oneway void acknowledgeSms(int token, int messageRef, int result);
    oneway void acknowledgeSmsReport(int token, int messageRef, int result);
    String getSmsFormat();
}
}
Loading