diff options
author | Mohamed Abdalkader <abdalkader@google.com> | 2018-01-12 16:37:08 -0800 |
---|---|---|
committer | Brad Ebinger <breadley@google.com> | 2018-01-31 11:24:31 -0800 |
commit | 6e545d5892566af017d5bddc054db5962885e711 (patch) | |
tree | e667e21c1f840b14721beed2551e791c213d2153 | |
parent | 967a952b34d08427f0aeb69f1328417b8ad7ffc3 (diff) |
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
Merged-In: Iec4bbd07a67502dbbfb2142a7bc95f51be0cb377
Change-Id: Iec4bbd07a67502dbbfb2142a7bc95f51be0cb377
6 files changed, 388 insertions, 8 deletions
diff --git a/Android.bp b/Android.bp index 69fb4597d088..d14a43306ebb 100644 --- a/Android.bp +++ b/Android.bp @@ -496,6 +496,7 @@ java_library { "telephony/java/com/android/ims/internal/IImsService.aidl", "telephony/java/com/android/ims/internal/IImsServiceController.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/IImsUt.aidl", "telephony/java/com/android/ims/internal/IImsUtListener.aidl", diff --git a/telephony/java/android/telephony/ims/feature/MMTelFeature.java b/telephony/java/android/telephony/ims/feature/MMTelFeature.java index 4e095e3a7003..519710728403 100644 --- a/telephony/java/android/telephony/ims/feature/MMTelFeature.java +++ b/telephony/java/android/telephony/ims/feature/MMTelFeature.java @@ -19,6 +19,7 @@ package android.telephony.ims.feature; import android.app.PendingIntent; import android.os.Message; import android.os.RemoteException; +import android.telephony.ims.internal.stub.SmsImplBase; import com.android.ims.ImsCallProfile; 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.IImsMultiEndpoint; import com.android.ims.internal.IImsRegistrationListener; +import com.android.ims.internal.IImsSmsListener; import com.android.ims.internal.IImsUt; import com.android.ims.internal.ImsCallSession; @@ -171,6 +173,42 @@ public class MMTelFeature extends ImsFeature { 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; } + 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 public void onFeatureReady() { diff --git a/telephony/java/android/telephony/ims/internal/SmsImplBase.java b/telephony/java/android/telephony/ims/internal/SmsImplBase.java index eb805a88da8e..33b23d94ad34 100644 --- a/telephony/java/android/telephony/ims/internal/SmsImplBase.java +++ b/telephony/java/android/telephony/ims/internal/SmsImplBase.java @@ -17,7 +17,6 @@ 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; @@ -37,6 +36,7 @@ import java.lang.annotation.RetentionPolicy; public class SmsImplBase { private static final String LOG_TAG = "SmsImplBase"; + /** @hide */ @IntDef({ SEND_STATUS_OK, SEND_STATUS_ERROR, @@ -68,6 +68,7 @@ public class SmsImplBase { */ public static final int SEND_STATUS_ERROR_FALLBACK = 4; + /** @hide */ @IntDef({ DELIVER_STATUS_OK, DELIVER_STATUS_ERROR @@ -84,6 +85,7 @@ public class SmsImplBase { */ public static final int DELIVER_STATUS_ERROR = 2; + /** @hide */ @IntDef({ STATUS_REPORT_STATUS_OK, STATUS_REPORT_STATUS_ERROR @@ -114,9 +116,9 @@ public class SmsImplBase { * @hide */ public final void registerSmsListener(IImsSmsListener listener) { - synchronized (mLock) { - mListener = listener; - } + synchronized (mLock) { + mListener = listener; + } } /** @@ -128,8 +130,8 @@ public class SmsImplBase { * 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. - * {@link SmsMessage#FORMAT_3GPP2}. * @param isRetry whether it is a retry of an already attempted message or not. * @param pdu PDUs representing the contents of the message. */ @@ -154,7 +156,7 @@ public class SmsImplBase { * @param messageRef the message reference */ 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 */ 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 { mListener.onSmsReceived(token, format, pdu); - acknowledgeSms(token, 0, DELIVER_STATUS_OK); } catch (RemoteException e) { Log.e(LOG_TAG, "Can not deliver sms: " + e.getMessage()); acknowledgeSms(token, 0, DELIVER_STATUS_ERROR); diff --git a/telephony/java/android/telephony/ims/internal/stub/SmsImplBase.java b/telephony/java/android/telephony/ims/internal/stub/SmsImplBase.java new file mode 100644 index 000000000000..113dad4696ef --- /dev/null +++ b/telephony/java/android/telephony/ims/internal/stub/SmsImplBase.java @@ -0,0 +1,271 @@ +/* + * 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; + } +} diff --git a/telephony/java/com/android/ims/internal/IImsMMTelFeature.aidl b/telephony/java/com/android/ims/internal/IImsMMTelFeature.aidl index 52b3853ec5b6..cce39f4daf2a 100644 --- a/telephony/java/com/android/ims/internal/IImsMMTelFeature.aidl +++ b/telephony/java/com/android/ims/internal/IImsMMTelFeature.aidl @@ -25,6 +25,7 @@ import com.android.ims.internal.IImsConfig; import com.android.ims.internal.IImsEcbm; import com.android.ims.internal.IImsMultiEndpoint; import com.android.ims.internal.IImsRegistrationListener; +import com.android.ims.internal.IImsSmsListener; import com.android.ims.internal.IImsUt; import android.os.Message; @@ -53,4 +54,11 @@ interface IImsMMTelFeature { IImsEcbm getEcbmInterface(); void setUiTTYMode(int uiTtyMode, in Message onComplete); 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(); } diff --git a/telephony/java/com/android/ims/internal/IImsSmsListener.aidl b/telephony/java/com/android/ims/internal/IImsSmsListener.aidl new file mode 100644 index 000000000000..5a4b7e489025 --- /dev/null +++ b/telephony/java/com/android/ims/internal/IImsSmsListener.aidl @@ -0,0 +1,28 @@ +/* + * 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 com.android.ims.internal; + +/** + * See SmsImplBase for more information. + * {@hide} + */ +interface IImsSmsListener { + void onSendSmsResult(int token, int messageRef, int status, int reason); + void onSmsStatusReportReceived(int token, int messageRef, in String format, + in byte[] pdu); + void onSmsReceived(int token, in String format, in byte[] pdu); +}
\ No newline at end of file |