Merge "SMS over IMS APIs revision"
am: 2bf7f03e63
Change-Id: I7296426e1c1fc903d92e324a09598e357e75389b
This commit is contained in:
@@ -464,6 +464,7 @@ java_library {
|
|||||||
"telephony/java/android/telephony/ims/internal/aidl/IImsRegistrationCallback.aidl",
|
"telephony/java/android/telephony/ims/internal/aidl/IImsRegistrationCallback.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",
|
||||||
@@ -484,13 +485,11 @@ 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/IImsSmsFeature.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",
|
||||||
"telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl",
|
"telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl",
|
||||||
"telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl",
|
"telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl",
|
||||||
"telephony/java/com/android/ims/internal/ISmsListener.aidl",
|
|
||||||
"telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl",
|
"telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl",
|
||||||
"telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl",
|
"telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl",
|
||||||
"telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl",
|
"telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl",
|
||||||
|
|||||||
@@ -1123,6 +1123,8 @@ public final class SmsManager {
|
|||||||
|
|
||||||
// SMS send failure result codes
|
// SMS send failure result codes
|
||||||
|
|
||||||
|
/** No error. {@hide}*/
|
||||||
|
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;
|
||||||
/** Failed because radio was explicitly turned off */
|
/** Failed because radio was explicitly turned off */
|
||||||
|
|||||||
@@ -1,237 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.feature;
|
|
||||||
|
|
||||||
import android.annotation.SystemApi;
|
|
||||||
import android.os.RemoteException;
|
|
||||||
import com.android.ims.internal.IImsSmsFeature;
|
|
||||||
import com.android.ims.internal.ISmsListener;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base implementation of SMS over IMS functionality.
|
|
||||||
*
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
public class SmsFeature extends ImsFeature {
|
|
||||||
/**
|
|
||||||
* SMS over IMS format is 3gpp.
|
|
||||||
*/
|
|
||||||
public static final int IMS_SMS_FORMAT_3GPP = 1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SMS over IMS format is 3gpp2.
|
|
||||||
*/
|
|
||||||
public static final int IMS_SMS_FORMAT_3GPP2 = 2;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Message was delivered successfully.
|
|
||||||
*/
|
|
||||||
public static final int DELIVER_STATUS_OK = 1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Message was not delivered.
|
|
||||||
*/
|
|
||||||
public static final int DELIVER_STATUS_ERROR = 2;
|
|
||||||
|
|
||||||
// Lock for feature synchronization
|
|
||||||
private final Object mLock = new Object();
|
|
||||||
private ISmsListener mSmsListener;
|
|
||||||
|
|
||||||
private final IImsSmsFeature mIImsSmsBinder = new IImsSmsFeature.Stub() {
|
|
||||||
@Override
|
|
||||||
public void registerSmsListener(ISmsListener listener) {
|
|
||||||
synchronized (mLock) {
|
|
||||||
SmsFeature.this.registerSmsListener(listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendSms(int format, int messageRef, boolean retry, byte[] pdu) {
|
|
||||||
synchronized (mLock) {
|
|
||||||
SmsFeature.this.sendSms(format, messageRef, retry, pdu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void acknowledgeSms(int messageRef, int result) {
|
|
||||||
synchronized (mLock) {
|
|
||||||
SmsFeature.this.acknowledgeSms(messageRef, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSmsFormat() {
|
|
||||||
synchronized (mLock) {
|
|
||||||
return SmsFeature.this.getSmsFormat();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a listener responsible for handling tasks like delivering messages.
|
|
||||||
|
|
||||||
* @param listener listener to register.
|
|
||||||
*
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
@SystemApi
|
|
||||||
public final void registerSmsListener(ISmsListener listener) {
|
|
||||||
synchronized (mLock) {
|
|
||||||
mSmsListener = 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 format the format of the message. One of {@link #IMS_SMS_FORMAT_3GPP} or
|
|
||||||
* {@link #IMS_SMS_FORMAT_3GPP2}
|
|
||||||
* @param messageRef the message reference.
|
|
||||||
* @param retry 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 format, int messageRef, boolean isRetry, byte[] pdu) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method will be triggered by the platform after {@link #deliverSms(int, byte[])} has been
|
|
||||||
* called to deliver the result to the IMS provider. It will also be triggered after
|
|
||||||
* {@link #setSentSmsResult(int, int)} has been called to provide the result of the operation.
|
|
||||||
*
|
|
||||||
* @param result Should be {@link #DELIVER_STATUS_OK} if the message was delivered successfully,
|
|
||||||
* {@link #DELIVER_STATUS_ERROR} otherwise.
|
|
||||||
* @param messageRef the message reference.
|
|
||||||
*/
|
|
||||||
public void acknowledgeSms(int messageRef, 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)}.
|
|
||||||
*
|
|
||||||
* This method must not be called before {@link #onFeatureReady()} is called.
|
|
||||||
*
|
|
||||||
* @param format the format of the message.One of {@link #IMS_SMS_FORMAT_3GPP} or
|
|
||||||
* {@link #IMS_SMS_FORMAT_3GPP2}
|
|
||||||
* @param pdu PDUs representing the contents of the message.
|
|
||||||
* @throws IllegalStateException if called before {@link #onFeatureReady()}
|
|
||||||
*/
|
|
||||||
public final void deliverSms(int format, byte[] pdu) throws IllegalStateException {
|
|
||||||
// TODO: Guard against NPE/ Check if feature is ready and thrown an exception
|
|
||||||
// otherwise.
|
|
||||||
try {
|
|
||||||
mSmsListener.deliverSms(format, pdu);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 #onFeatureReady()} is called.
|
|
||||||
*
|
|
||||||
* @param messageRef the message reference.
|
|
||||||
* @param result One of {@link #SEND_STATUS_OK}, {@link #SEND_STATUS_ERROR},
|
|
||||||
* {@link #SEND_STATUS_ERROR_RETRY}, {@link #SEND_STATUS_ERROR_FALLBACK}
|
|
||||||
* @throws IllegalStateException if called before {@link #onFeatureReady()}
|
|
||||||
*/
|
|
||||||
public final void setSentSmsResult(int messageRef, int result) throws IllegalStateException {
|
|
||||||
// TODO: Guard against NPE/ Check if feature is ready and thrown an exception
|
|
||||||
// otherwise.
|
|
||||||
try {
|
|
||||||
mSmsListener.setSentSmsResult(messageRef, result);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the status report of the sent message.
|
|
||||||
*
|
|
||||||
* @param format Should be {@link #IMS_SMS_FORMAT_3GPP} or {@link #IMS_SMS_FORMAT_3GPP2}
|
|
||||||
* @param pdu PDUs representing the content of the status report.
|
|
||||||
* @throws IllegalStateException if called before {@link #onFeatureReady()}
|
|
||||||
*/
|
|
||||||
public final void setSentSmsStatusReport(int format, byte[] pdu) {
|
|
||||||
// TODO: Guard against NPE/ Check if feature is ready and thrown an exception
|
|
||||||
// otherwise.
|
|
||||||
try {
|
|
||||||
mSmsListener.setSentSmsStatusReport(format, pdu);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SMS format. Default is {@link #IMS_SMS_FORMAT_3GPP} unless overridden by IMS
|
|
||||||
* Provider.
|
|
||||||
*
|
|
||||||
* @return sms format.
|
|
||||||
*/
|
|
||||||
public int getSmsFormat() {
|
|
||||||
return IMS_SMS_FORMAT_3GPP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public void onFeatureReady() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onFeatureRemoved() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public final IImsSmsFeature getBinder() {
|
|
||||||
return mIImsSmsBinder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
260
telephony/java/android/telephony/ims/internal/SmsImplBase.java
Normal file
260
telephony/java/android/telephony/ims/internal/SmsImplBase.java
Normal file
@@ -0,0 +1,260 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ package android.telephony.ims.internal.aidl;
|
|||||||
|
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.telephony.ims.internal.aidl.IImsMmTelListener;
|
import android.telephony.ims.internal.aidl.IImsMmTelListener;
|
||||||
|
import android.telephony.ims.internal.aidl.IImsSmsListener;
|
||||||
import android.telephony.ims.internal.aidl.IImsCapabilityCallback;
|
import android.telephony.ims.internal.aidl.IImsCapabilityCallback;
|
||||||
import android.telephony.ims.internal.aidl.IImsCallSessionListener;
|
import android.telephony.ims.internal.aidl.IImsCallSessionListener;
|
||||||
import android.telephony.ims.internal.feature.CapabilityChangeRequest;
|
import android.telephony.ims.internal.feature.CapabilityChangeRequest;
|
||||||
@@ -30,7 +31,7 @@ import com.android.ims.internal.IImsRegistrationListener;
|
|||||||
import com.android.ims.internal.IImsUt;
|
import com.android.ims.internal.IImsUt;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See MmTelFeature for more information.
|
* See SmsImplBase for more information.
|
||||||
* {@hide}
|
* {@hide}
|
||||||
*/
|
*/
|
||||||
interface IImsMmTelFeature {
|
interface IImsMmTelFeature {
|
||||||
@@ -49,4 +50,10 @@ interface IImsMmTelFeature {
|
|||||||
IImsCapabilityCallback c);
|
IImsCapabilityCallback c);
|
||||||
oneway void queryCapabilityConfiguration(int capability, int radioTech,
|
oneway void queryCapabilityConfiguration(int capability, int radioTech,
|
||||||
IImsCapabilityCallback c);
|
IImsCapabilityCallback c);
|
||||||
|
// SMS APIs
|
||||||
|
void setSmsListener(IImsSmsListener l);
|
||||||
|
oneway void sendSms(int messageRef, String format, String smsc, boolean retry, in byte[] pdu);
|
||||||
|
oneway void acknowledgeSms(int messageRef, int result);
|
||||||
|
oneway void acknowledgeSmsReport(int messageRef, int result);
|
||||||
|
String getSmsFormat();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,14 +14,14 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.ims.internal;
|
package android.telephony.ims.internal.aidl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See SmsFeature for more information.
|
* See MMTelFeature for more information.
|
||||||
* {@hide}
|
* {@hide}
|
||||||
*/
|
*/
|
||||||
interface ISmsListener {
|
interface IImsSmsListener {
|
||||||
void setSentSmsResult(in int messageRef, in int result);
|
void onSendSmsResult(in int messageRef, in int status, in int reason);
|
||||||
void setSentSmsStatusReport(in int format, in byte[] pdu);
|
void onSmsStatusReportReceived(in int messageRef, in String format, in byte[] pdu);
|
||||||
void deliverSms(in int format, in byte[] pdu);
|
void onSmsReceived(in String format, in byte[] pdu);
|
||||||
}
|
}
|
||||||
@@ -21,11 +21,15 @@ import android.os.Message;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.telecom.TelecomManager;
|
import android.telecom.TelecomManager;
|
||||||
import android.telephony.ims.internal.ImsCallSessionListener;
|
import android.telephony.ims.internal.ImsCallSessionListener;
|
||||||
|
import android.telephony.ims.internal.SmsImplBase;
|
||||||
|
import android.telephony.ims.internal.SmsImplBase.DeliverStatusResult;
|
||||||
|
import android.telephony.ims.internal.SmsImplBase.StatusReportResult;
|
||||||
import android.telephony.ims.internal.aidl.IImsCallSessionListener;
|
import android.telephony.ims.internal.aidl.IImsCallSessionListener;
|
||||||
import android.telephony.ims.internal.aidl.IImsCapabilityCallback;
|
import android.telephony.ims.internal.aidl.IImsCapabilityCallback;
|
||||||
import android.telephony.ims.internal.aidl.IImsMmTelFeature;
|
import android.telephony.ims.internal.aidl.IImsMmTelFeature;
|
||||||
import android.telephony.ims.internal.aidl.IImsMmTelListener;
|
import android.telephony.ims.internal.aidl.IImsMmTelListener;
|
||||||
import android.telephony.ims.internal.stub.ImsRegistrationImplBase;
|
import android.telephony.ims.internal.stub.ImsRegistrationImplBase;
|
||||||
|
import android.telephony.ims.internal.aidl.IImsSmsListener;
|
||||||
import android.telephony.ims.stub.ImsEcbmImplBase;
|
import android.telephony.ims.stub.ImsEcbmImplBase;
|
||||||
import android.telephony.ims.stub.ImsMultiEndpointImplBase;
|
import android.telephony.ims.stub.ImsMultiEndpointImplBase;
|
||||||
import android.telephony.ims.stub.ImsUtImplBase;
|
import android.telephony.ims.stub.ImsUtImplBase;
|
||||||
@@ -63,6 +67,11 @@ public class MmTelFeature extends ImsFeature {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSmsListener(IImsSmsListener l) throws RemoteException {
|
||||||
|
MmTelFeature.this.setSmsListener(l);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getFeatureState() throws RemoteException {
|
public int getFeatureState() throws RemoteException {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
@@ -143,6 +152,34 @@ public class MmTelFeature extends ImsFeature {
|
|||||||
IImsCapabilityCallback c) {
|
IImsCapabilityCallback c) {
|
||||||
queryCapabilityConfigurationInternal(capability, radioTech, c);
|
queryCapabilityConfigurationInternal(capability, radioTech, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendSms(int messageRef, String format, String smsc, boolean retry, byte[] pdu) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
MmTelFeature.this.sendSms(messageRef, format, smsc, retry, pdu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void acknowledgeSms(int messageRef, int result) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
MmTelFeature.this.acknowledgeSms(messageRef, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void acknowledgeSmsReport(int messageRef, int result) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
MmTelFeature.this.acknowledgeSmsReport(messageRef, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSmsFormat() {
|
||||||
|
synchronized (mLock) {
|
||||||
|
return MmTelFeature.this.getSmsFormat();
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -171,7 +208,8 @@ public class MmTelFeature extends ImsFeature {
|
|||||||
value = {
|
value = {
|
||||||
CAPABILITY_TYPE_VOICE,
|
CAPABILITY_TYPE_VOICE,
|
||||||
CAPABILITY_TYPE_VIDEO,
|
CAPABILITY_TYPE_VIDEO,
|
||||||
CAPABILITY_TYPE_UT
|
CAPABILITY_TYPE_UT,
|
||||||
|
CAPABILITY_TYPE_SMS
|
||||||
})
|
})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface MmTelCapability {}
|
public @interface MmTelCapability {}
|
||||||
@@ -191,6 +229,11 @@ public class MmTelFeature extends ImsFeature {
|
|||||||
*/
|
*/
|
||||||
public static final int CAPABILITY_TYPE_UT = 1 << 2;
|
public static final int CAPABILITY_TYPE_UT = 1 << 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This MmTelFeature supports SMS (IR.92)
|
||||||
|
*/
|
||||||
|
public static final int CAPABILITY_TYPE_SMS = 1 << 3;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void addCapabilities(@MmTelCapability int capabilities) {
|
public final void addCapabilities(@MmTelCapability int capabilities) {
|
||||||
super.addCapabilities(capabilities);
|
super.addCapabilities(capabilities);
|
||||||
@@ -239,6 +282,10 @@ public class MmTelFeature extends ImsFeature {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setSmsListener(IImsSmsListener listener) {
|
||||||
|
getSmsImplementation().registerSmsListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
private void queryCapabilityConfigurationInternal(int capability, int radioTech,
|
private void queryCapabilityConfigurationInternal(int capability, int radioTech,
|
||||||
IImsCapabilityCallback c) {
|
IImsCapabilityCallback c) {
|
||||||
boolean enabled = queryCapabilityConfiguration(capability, radioTech);
|
boolean enabled = queryCapabilityConfiguration(capability, radioTech);
|
||||||
@@ -400,6 +447,32 @@ public class MmTelFeature extends ImsFeature {
|
|||||||
// Base Implementation - Should be overridden
|
// Base Implementation - Should be overridden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void sendSms(int messageRef, String format, String smsc, boolean isRetry, byte[] pdu) {
|
||||||
|
getSmsImplementation().sendSms(messageRef, format, smsc, isRetry, pdu);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void acknowledgeSms(int messageRef, @DeliverStatusResult int result) {
|
||||||
|
getSmsImplementation().acknowledgeSms(messageRef, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void acknowledgeSmsReport(int messageRef, @StatusReportResult int result) {
|
||||||
|
getSmsImplementation().acknowledgeSmsReport(messageRef, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getSmsFormat() {
|
||||||
|
return getSmsImplementation().getSmsFormat();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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();
|
||||||
|
}
|
||||||
|
|
||||||
/**{@inheritDoc}*/
|
/**{@inheritDoc}*/
|
||||||
@Override
|
@Override
|
||||||
public void onFeatureRemoved() {
|
public void onFeatureRemoved() {
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
import com.android.ims.internal.ISmsListener;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See SmsFeature for more information.
|
|
||||||
*
|
|
||||||
* {@hide}
|
|
||||||
*/
|
|
||||||
interface IImsSmsFeature {
|
|
||||||
void registerSmsListener(in ISmsListener listener);
|
|
||||||
void sendSms(in int format, in int messageRef, in boolean retry, in byte[] pdu);
|
|
||||||
void acknowledgeSms(in int messageRef, in int result);
|
|
||||||
int getSmsFormat();
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user