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

Commit 23904856 authored by Brad Ebinger's avatar Brad Ebinger Committed by android-build-merger
Browse files

Merge changes from topics "ims_sms_sms_ready", "ims_sms_rm_internal_sms", "ims_sms_disp"

am: d6d9ff3c

Change-Id: I5575ec7a2a1cba12815a118106133806977219de
parents 8df431a8 d6d9ff3c
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -471,7 +471,6 @@ java_library {
        "telephony/java/android/telephony/ims/internal/aidl/IImsRcsFeature.aidl",
        "telephony/java/android/telephony/ims/internal/aidl/IImsRcsFeature.aidl",
        "telephony/java/android/telephony/ims/internal/aidl/IImsServiceController.aidl",
        "telephony/java/android/telephony/ims/internal/aidl/IImsServiceController.aidl",
        "telephony/java/android/telephony/ims/internal/aidl/IImsServiceControllerListener.aidl",
        "telephony/java/android/telephony/ims/internal/aidl/IImsServiceControllerListener.aidl",
	"telephony/java/android/telephony/ims/internal/aidl/IImsSmsListener.aidl",
	"telephony/java/android/telephony/mbms/IMbmsDownloadSessionCallback.aidl",
	"telephony/java/android/telephony/mbms/IMbmsDownloadSessionCallback.aidl",
        "telephony/java/android/telephony/mbms/IMbmsStreamingSessionCallback.aidl",
        "telephony/java/android/telephony/mbms/IMbmsStreamingSessionCallback.aidl",
        "telephony/java/android/telephony/mbms/IDownloadStateCallback.aidl",
        "telephony/java/android/telephony/mbms/IDownloadStateCallback.aidl",
@@ -496,6 +495,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",
+42 −0
Original line number Original line Diff line number Diff line
@@ -4044,6 +4044,24 @@ package android.telephony {
  public final class SmsManager {
  public final class SmsManager {
    method public void sendMultipartTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
    method public void sendMultipartTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
    method public void sendTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);
    method public void sendTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);
    field public static final int RESULT_CANCELLED = 23; // 0x17
    field public static final int RESULT_ENCODING_ERROR = 18; // 0x12
    field public static final int RESULT_ERROR_FDN_CHECK_FAILURE = 6; // 0x6
    field public static final int RESULT_ERROR_NONE = 0; // 0x0
    field public static final int RESULT_INTERNAL_ERROR = 21; // 0x15
    field public static final int RESULT_INVALID_ARGUMENTS = 11; // 0xb
    field public static final int RESULT_INVALID_SMSC_ADDRESS = 19; // 0x13
    field public static final int RESULT_INVALID_SMS_FORMAT = 14; // 0xe
    field public static final int RESULT_INVALID_STATE = 12; // 0xc
    field public static final int RESULT_MODEM_ERROR = 16; // 0x10
    field public static final int RESULT_NETWORK_ERROR = 17; // 0x11
    field public static final int RESULT_NETWORK_REJECT = 10; // 0xa
    field public static final int RESULT_NO_MEMORY = 13; // 0xd
    field public static final int RESULT_NO_RESOURCES = 22; // 0x16
    field public static final int RESULT_OPERATION_NOT_ALLOWED = 20; // 0x14
    field public static final int RESULT_RADIO_NOT_AVAILABLE = 9; // 0x9
    field public static final int RESULT_REQUEST_NOT_SUPPORTED = 24; // 0x18
    field public static final int RESULT_SYSTEM_ERROR = 15; // 0xf
  }
  }


  public class SubscriptionManager {
  public class SubscriptionManager {
@@ -4287,6 +4305,30 @@ package android.telephony.ims {


}
}


package android.telephony.ims.internal.stub {

  public class SmsImplBase {
    ctor public SmsImplBase();
    method public void acknowledgeSms(int, int, int);
    method public void acknowledgeSmsReport(int, int, int);
    method public java.lang.String getSmsFormat();
    method public void onReady();
    method public final void onSendSmsResult(int, int, int, int) throws java.lang.RuntimeException;
    method public final void onSmsReceived(int, java.lang.String, byte[]) throws java.lang.RuntimeException;
    method public final void onSmsStatusReportReceived(int, int, java.lang.String, byte[]) throws java.lang.RuntimeException;
    method public void sendSms(int, int, java.lang.String, java.lang.String, boolean, byte[]);
    field public static final int DELIVER_STATUS_ERROR = 2; // 0x2
    field public static final int DELIVER_STATUS_OK = 1; // 0x1
    field public static final int SEND_STATUS_ERROR = 2; // 0x2
    field public static final int SEND_STATUS_ERROR_FALLBACK = 4; // 0x4
    field public static final int SEND_STATUS_ERROR_RETRY = 3; // 0x3
    field public static final int SEND_STATUS_OK = 1; // 0x1
    field public static final int STATUS_REPORT_STATUS_ERROR = 2; // 0x2
    field public static final int STATUS_REPORT_STATUS_OK = 1; // 0x1
  }

}

package android.telephony.mbms {
package android.telephony.mbms {


  public final class DownloadRequest implements android.os.Parcelable {
  public final class DownloadRequest implements android.os.Parcelable {
+107 −2
Original line number Original line Diff line number Diff line
@@ -1127,7 +1127,11 @@ public final class SmsManager {


    // SMS send failure result codes
    // SMS send failure result codes


    /** No error. {@hide}*/
    /**
     * No error.
     * @hide
     */
    @SystemApi
    static public final int RESULT_ERROR_NONE    = 0;
    static public final int RESULT_ERROR_NONE    = 0;
    /** Generic failure cause */
    /** Generic failure cause */
    static public final int RESULT_ERROR_GENERIC_FAILURE    = 1;
    static public final int RESULT_ERROR_GENERIC_FAILURE    = 1;
@@ -1139,12 +1143,113 @@ public final class SmsManager {
    static public final int RESULT_ERROR_NO_SERVICE         = 4;
    static public final int RESULT_ERROR_NO_SERVICE         = 4;
    /** Failed because we reached the sending queue limit. */
    /** Failed because we reached the sending queue limit. */
    static public final int RESULT_ERROR_LIMIT_EXCEEDED     = 5;
    static public final int RESULT_ERROR_LIMIT_EXCEEDED     = 5;
    /** Failed because FDN is enabled. {@hide} */
    /**
     * Failed because FDN is enabled.
     * @hide
     */
    @SystemApi
    static public final int RESULT_ERROR_FDN_CHECK_FAILURE  = 6;
    static public final int RESULT_ERROR_FDN_CHECK_FAILURE  = 6;
    /** Failed because user denied the sending of this short code. */
    /** Failed because user denied the sending of this short code. */
    static public final int RESULT_ERROR_SHORT_CODE_NOT_ALLOWED = 7;
    static public final int RESULT_ERROR_SHORT_CODE_NOT_ALLOWED = 7;
    /** Failed because the user has denied this app ever send premium short codes. */
    /** Failed because the user has denied this app ever send premium short codes. */
    static public final int RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED = 8;
    static public final int RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED = 8;
    /**
     * Failed because the radio was not available
     * @hide
     */
    @SystemApi
    static public final int RESULT_RADIO_NOT_AVAILABLE = 9;
    /**
     * Failed because of network rejection
     * @hide
     */
    @SystemApi
    static public final int RESULT_NETWORK_REJECT = 10;
    /**
     * Failed because of invalid arguments
     * @hide
     */
    @SystemApi
    static public final int RESULT_INVALID_ARGUMENTS = 11;
    /**
     * Failed because of an invalid state
     * @hide
     */
    @SystemApi
    static public final int RESULT_INVALID_STATE = 12;
    /**
     * Failed because there is no memory
     * @hide
     */
    @SystemApi
    static public final int RESULT_NO_MEMORY = 13;
    /**
     * Failed because the sms format is not valid
     * @hide
     */
    @SystemApi
    static public final int RESULT_INVALID_SMS_FORMAT = 14;
    /**
     * Failed because of a system error
     * @hide
     */
    @SystemApi
    static public final int RESULT_SYSTEM_ERROR = 15;
    /**
     * Failed because of a modem error
     * @hide
     */
    @SystemApi
    static public final int RESULT_MODEM_ERROR = 16;
    /**
     * Failed because of a network error
     * @hide
     */
    @SystemApi
    static public final int RESULT_NETWORK_ERROR = 17;
    /**
     * Failed because of an encoding error
     * @hide
     */
    @SystemApi
    static public final int RESULT_ENCODING_ERROR = 18;
    /**
     * Failed because of an invalid smsc address
     * @hide
     */
    @SystemApi
    static public final int RESULT_INVALID_SMSC_ADDRESS = 19;
    /**
     * Failed because the operation is not allowed
     * @hide
     */
    @SystemApi
    static public final int RESULT_OPERATION_NOT_ALLOWED = 20;
    /**
     * Failed because of an internal error
     * @hide
     */
    @SystemApi
    static public final int RESULT_INTERNAL_ERROR = 21;
    /**
     * Failed because there are no resources
     * @hide
     */
    @SystemApi
    static public final int RESULT_NO_RESOURCES = 22;
    /**
     * Failed because the operation was cancelled
     * @hide
     */
    @SystemApi
    static public final int RESULT_CANCELLED = 23;
    /**
     * Failed because the request is not supported
     * @hide
     */
    @SystemApi
    static public final int RESULT_REQUEST_NOT_SUPPORTED = 24;



    static private final String PHONE_PACKAGE_NAME = "com.android.phone";
    static private final String PHONE_PACKAGE_NAME = "com.android.phone";


+82 −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,49 @@ 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();
            }
        }

        @Override
        public void onSmsReady() {
            synchronized (mLock) {
                MMTelFeature.this.onSmsReady();
            }
        }
    };
    };


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


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

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

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

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

    private void onSmsReady() {
        getSmsImplementation().onReady();
    }

    /**
     * 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() {


+0 −260
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2017 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;

import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.os.RemoteException;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.ims.internal.aidl.IImsSmsListener;
import android.telephony.ims.internal.feature.MmTelFeature;
import android.util.Log;
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 smsc the Short Message Service Center address.
   * @param format the format of the message. Valid values are {@link SmsMessage#FORMAT_3GPP} and
   * {@link SmsMessage#FORMAT_3GPP2}.
   * @param messageRef the message reference.
   * @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 messageRef, String format, String smsc, boolean isRetry, byte[] pdu) {
    // Base implementation returns error. Should be overridden.
    try {
      onSendSmsResult(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(String, byte[])} has
   * been called to deliver the result to the IMS provider.
   *
   * @param result result of delivering the message. Valid values are defined in
   * {@link DeliverStatusResult}
   * @param messageRef the message reference or -1 of unavailable.
   */
  public void acknowledgeSms(int messageRef, @DeliverStatusResult int result) {

  }

  /**
   * This method will be triggered by the platform after
   * {@link #onSmsStatusReportReceived(int, int, byte[])} has been called to provide the result to
   * the IMS provider.
   *
   * @param result result of delivering the message. Valid values are defined in
   * {@link StatusReportResult}
   * @param messageRef the message reference or -1 of unavailable.
   */
  public void acknowledgeSmsReport(int messageRef, @StatusReportResult int result) {

  }

  /**
   * 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)}.
   *
   * This method must not be called before {@link MmTelFeature#onFeatureReady()} is called.
   *
   * @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(String format, byte[] pdu) throws IllegalStateException {
    synchronized (mLock) {
      if (mListener == null) {
        throw new IllegalStateException("Feature not ready.");
      }
      try {
        mListener.onSmsReceived(format, pdu);
        acknowledgeSms(-1, DELIVER_STATUS_OK);
      } catch (RemoteException e) {
        Log.e(LOG_TAG, "Can not deliver sms: " + e.getMessage());
        acknowledgeSms(-1, 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 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 messageRef, @SendStatusResult int status, int reason)
      throws IllegalStateException, RemoteException {
    synchronized (mLock) {
      if (mListener == null) {
        throw new IllegalStateException("Feature not ready.");
      }
      mListener.onSendSmsResult(messageRef, status, reason);
    }
  }

  /**
   * Sets the status report of the sent 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 pdu PDUs representing the content of the status report.
   * @throws IllegalStateException if called before {@link MmTelFeature#onFeatureReady()}
   */
  public final void onSmsStatusReportReceived(int messageRef, String format, byte[] pdu) {
    synchronized (mLock) {
      if (mListener == null) {
        throw new IllegalStateException("Feature not ready.");
      }
      try {
        mListener.onSmsStatusReportReceived(messageRef, format, pdu);
      } catch (RemoteException e) {
        Log.e(LOG_TAG, "Can not process sms status report: " + e.getMessage());
        acknowledgeSmsReport(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;
  }

}
Loading