diff options
| -rw-r--r-- | core/api/system-current.txt | 20 | ||||
| -rw-r--r-- | core/java/android/service/carrier/CarrierMessagingService.java | 39 | ||||
| -rw-r--r-- | core/java/android/service/carrier/CarrierMessagingServiceWrapper.java | 196 | ||||
| -rw-r--r-- | packages/Shell/AndroidManifest.xml | 3 |
4 files changed, 185 insertions, 73 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index d8c18f3bc41e..3a769d5d5a71 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -9098,6 +9098,26 @@ package android.service.carrier { method @NonNull @WorkerThread public abstract java.util.List<android.content.ContentValues> onRestoreApns(int); } + public final class CarrierMessagingServiceWrapper { + ctor public CarrierMessagingServiceWrapper(); + method public boolean bindToCarrierMessagingService(@NonNull android.content.Context, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull Runnable); + method public void disposeConnection(@NonNull android.content.Context); + method public void downloadMms(@NonNull android.net.Uri, int, @NonNull android.net.Uri, @NonNull java.util.concurrent.Executor, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallback); + method public void receiveSms(@NonNull android.service.carrier.MessagePdu, @NonNull String, int, int, @NonNull java.util.concurrent.Executor, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallback); + method public void sendDataSms(@NonNull byte[], int, @NonNull String, int, int, @NonNull java.util.concurrent.Executor, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallback); + method public void sendMms(@NonNull android.net.Uri, int, @NonNull android.net.Uri, @NonNull java.util.concurrent.Executor, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallback); + method public void sendMultipartTextSms(@NonNull java.util.List<java.lang.String>, int, @NonNull String, int, @NonNull java.util.concurrent.Executor, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallback); + method public void sendTextSms(@NonNull String, int, @NonNull String, int, @NonNull java.util.concurrent.Executor, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallback); + } + + public static interface CarrierMessagingServiceWrapper.CarrierMessagingCallback { + method public default void onDownloadMmsComplete(int); + method public default void onReceiveSmsComplete(int); + method public default void onSendMmsComplete(int, @Nullable byte[]); + method public default void onSendMultipartSmsComplete(int, @Nullable int[]); + method public default void onSendSmsComplete(int, int); + } + } package android.service.contentcapture { diff --git a/core/java/android/service/carrier/CarrierMessagingService.java b/core/java/android/service/carrier/CarrierMessagingService.java index 88a78c36d112..61213e6293ba 100644 --- a/core/java/android/service/carrier/CarrierMessagingService.java +++ b/core/java/android/service/carrier/CarrierMessagingService.java @@ -16,6 +16,7 @@ package android.service.carrier; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; @@ -25,6 +26,8 @@ import android.net.Uri; import android.os.IBinder; import android.os.RemoteException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.List; /** @@ -74,6 +77,15 @@ public abstract class CarrierMessagingService extends Service { */ public static final int RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE = 0x2; + /** @hide */ + @IntDef(flag = true, prefix = { "RECEIVE_OPTIONS_" }, value = { + RECEIVE_OPTIONS_DEFAULT, + RECEIVE_OPTIONS_DROP, + RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE + }) + @Retention(RetentionPolicy.SOURCE) + public @interface FilterCompleteResult{} + /** * Indicates that an SMS or MMS message was successfully sent. */ @@ -89,6 +101,15 @@ public abstract class CarrierMessagingService extends Service { */ public static final int SEND_STATUS_ERROR = 2; + /** @hide */ + @IntDef(prefix = { "SEND_STATUS_" }, value = { + SEND_STATUS_OK, + SEND_STATUS_RETRY_ON_CARRIER_NETWORK, + SEND_STATUS_ERROR + }) + @Retention(RetentionPolicy.SOURCE) + public @interface SendResult {} + /** * Successfully downloaded an MMS message. */ @@ -104,10 +125,26 @@ public abstract class CarrierMessagingService extends Service { */ public static final int DOWNLOAD_STATUS_ERROR = 2; + /** @hide */ + @IntDef(prefix = { "DOWNLOAD_STATUS_" }, value = { + DOWNLOAD_STATUS_OK, + DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK, + DOWNLOAD_STATUS_ERROR + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DownloadResult {} + /** * Flag to request SMS delivery status report. */ - public static final int SEND_FLAG_REQUEST_DELIVERY_STATUS = 1; + public static final int SEND_FLAG_REQUEST_DELIVERY_STATUS = 0x1; + + /** @hide */ + @IntDef(flag = true, prefix = { "SEND_FLAG_" }, value = { + SEND_FLAG_REQUEST_DELIVERY_STATUS + }) + @Retention(RetentionPolicy.SOURCE) + public @interface SendRequest {} private final ICarrierMessagingWrapper mWrapper = new ICarrierMessagingWrapper(); diff --git a/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java b/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java index 4ffffc6870cb..197c5a657371 100644 --- a/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java +++ b/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java @@ -16,19 +16,25 @@ package android.service.carrier; +import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SystemApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.net.Uri; +import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; +import android.telephony.SmsMessage; import com.android.internal.util.Preconditions; import java.util.List; +import java.util.Objects; +import java.util.concurrent.Executor; /** * Provides basic structure for platform to connect to the carrier messaging service. @@ -46,6 +52,7 @@ import java.util.List; * CarrierMessagingService. * @hide */ +@SystemApi public final class CarrierMessagingServiceWrapper { // Populated by bindToCarrierMessagingService. bindToCarrierMessagingService must complete // prior to calling disposeConnection so that mCarrierMessagingServiceConnection is initialized. @@ -53,6 +60,7 @@ public final class CarrierMessagingServiceWrapper { private volatile ICarrierMessagingService mICarrierMessagingService; private Runnable mOnServiceReadyCallback; + private Executor mServiceReadyCallbackExecutor; /** * Binds to the carrier messaging service under package {@code carrierPackageName}. This method @@ -60,18 +68,27 @@ public final class CarrierMessagingServiceWrapper { * * @param context the context * @param carrierPackageName the carrier package name + * @param executor the executor to run the callback. + * @param onServiceReadyCallback the callback when service becomes ready. * @return true upon successfully binding to a carrier messaging service, false otherwise * @hide */ + @SystemApi public boolean bindToCarrierMessagingService(@NonNull Context context, @NonNull String carrierPackageName, + @NonNull @CallbackExecutor Executor executor, @NonNull Runnable onServiceReadyCallback) { Preconditions.checkState(mCarrierMessagingServiceConnection == null); + Objects.requireNonNull(context); + Objects.requireNonNull(carrierPackageName); + Objects.requireNonNull(executor); + Objects.requireNonNull(onServiceReadyCallback); Intent intent = new Intent(CarrierMessagingService.SERVICE_INTERFACE); intent.setPackage(carrierPackageName); mCarrierMessagingServiceConnection = new CarrierMessagingServiceConnection(); mOnServiceReadyCallback = onServiceReadyCallback; + mServiceReadyCallbackExecutor = executor; return context.bindService(intent, mCarrierMessagingServiceConnection, Context.BIND_AUTO_CREATE); } @@ -82,11 +99,13 @@ public final class CarrierMessagingServiceWrapper { * @param context the context * @hide */ + @SystemApi public void disposeConnection(@NonNull Context context) { Preconditions.checkNotNull(mCarrierMessagingServiceConnection); context.unbindService(mCarrierMessagingServiceConnection); mCarrierMessagingServiceConnection = null; mOnServiceReadyCallback = null; + mServiceReadyCallbackExecutor = null; } /** @@ -96,26 +115,38 @@ public final class CarrierMessagingServiceWrapper { */ private void onServiceReady(ICarrierMessagingService carrierMessagingService) { mICarrierMessagingService = carrierMessagingService; - if (mOnServiceReadyCallback != null) mOnServiceReadyCallback.run(); + if (mOnServiceReadyCallback != null && mServiceReadyCallbackExecutor != null) { + final long identity = Binder.clearCallingIdentity(); + try { + mServiceReadyCallbackExecutor.execute(mOnServiceReadyCallback); + } finally { + Binder.restoreCallingIdentity(identity); + } + } } /** - * Request filtering an incoming SMS message. + * Request the CarrierMessagingService to process an incoming SMS text or data message. * The service will call callback.onFilterComplete with the filtering result. * * @param pdu the PDUs of the message - * @param format the format of the PDUs, typically "3gpp" or "3gpp2" + * @param format the format of the PDUs, typically "3gpp" or "3gpp2". + * See {@link SmsMessage#FORMAT_3GPP} and {@link SmsMessage#FORMAT_3GPP2} for + * more details. * @param destPort the destination port of a data SMS. It will be -1 for text SMS * @param subId SMS subscription ID of the SIM + * @param executor the executor to run the callback. * @param callback the callback to notify upon completion * @hide */ - public void filterSms(@NonNull MessagePdu pdu, @NonNull String format, int destPort, - int subId, @NonNull final CarrierMessagingCallback callback) { + @SystemApi + public void receiveSms(@NonNull MessagePdu pdu, @NonNull @SmsMessage.Format String format, + int destPort, int subId, @NonNull @CallbackExecutor final Executor executor, + @NonNull final CarrierMessagingCallback callback) { if (mICarrierMessagingService != null) { try { mICarrierMessagingService.filterSms(pdu, format, destPort, subId, - new CarrierMessagingCallbackInternal(callback)); + new CarrierMessagingCallbackInternal(callback, executor)); } catch (RemoteException e) { throw new RuntimeException(e); } @@ -130,19 +161,23 @@ public final class CarrierMessagingServiceWrapper { * @param text the text to send * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message - * @param sendSmsFlag flag for sending SMS + * @param sendSmsFlag Flag for sending SMS. Acceptable values are 0 and + * {@link CarrierMessagingService#SEND_FLAG_REQUEST_DELIVERY_STATUS}. + * @param executor the executor to run the callback. * @param callback the callback to notify upon completion * @hide */ + @SystemApi public void sendTextSms(@NonNull String text, int subId, @NonNull String destAddress, - int sendSmsFlag, @NonNull final CarrierMessagingCallback callback) { - if (mICarrierMessagingService != null) { - try { - mICarrierMessagingService.sendTextSms(text, subId, destAddress, sendSmsFlag, - new CarrierMessagingCallbackInternal(callback)); - } catch (RemoteException e) { - throw new RuntimeException(e); - } + @CarrierMessagingService.SendRequest int sendSmsFlag, + @NonNull @CallbackExecutor final Executor executor, + @NonNull final CarrierMessagingCallback callback) { + Objects.requireNonNull(mICarrierMessagingService); + try { + mICarrierMessagingService.sendTextSms(text, subId, destAddress, sendSmsFlag, + new CarrierMessagingCallbackInternal(callback, executor)); + } catch (RemoteException e) { + throw new RuntimeException(e); } } @@ -155,20 +190,24 @@ public final class CarrierMessagingServiceWrapper { * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message * @param destPort port number of the recipient of the message - * @param sendSmsFlag flag for sending SMS + * @param sendSmsFlag Flag for sending SMS. Acceptable values are 0 and + * {@link CarrierMessagingService#SEND_FLAG_REQUEST_DELIVERY_STATUS}. + * @param executor the executor to run the callback. * @param callback the callback to notify upon completion * @hide */ + @SystemApi public void sendDataSms(@NonNull byte[] data, int subId, @NonNull String destAddress, - int destPort, int sendSmsFlag, + int destPort, @CarrierMessagingService.SendRequest int sendSmsFlag, + @NonNull @CallbackExecutor final Executor executor, @NonNull final CarrierMessagingCallback callback) { - if (mICarrierMessagingService != null) { - try { - mICarrierMessagingService.sendDataSms(data, subId, destAddress, destPort, - sendSmsFlag, new CarrierMessagingCallbackInternal(callback)); - } catch (RemoteException e) { - throw new RuntimeException(e); - } + Objects.requireNonNull(mICarrierMessagingService); + try { + mICarrierMessagingService.sendDataSms(data, subId, destAddress, destPort, + sendSmsFlag, new CarrierMessagingCallbackInternal( + callback, executor)); + } catch (RemoteException e) { + throw new RuntimeException(e); } } @@ -180,20 +219,24 @@ public final class CarrierMessagingServiceWrapper { * @param parts the parts of the multi-part text SMS to send * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message - * @param sendSmsFlag flag for sending SMS + * @param sendSmsFlag Flag for sending SMS. Acceptable values are 0 and + * {@link CarrierMessagingService#SEND_FLAG_REQUEST_DELIVERY_STATUS}. + * @param executor the executor to run the callback. * @param callback the callback to notify upon completion * @hide */ + @SystemApi public void sendMultipartTextSms(@NonNull List<String> parts, int subId, - @NonNull String destAddress, int sendSmsFlag, + @NonNull String destAddress, + @CarrierMessagingService.SendRequest int sendSmsFlag, + @NonNull @CallbackExecutor final Executor executor, @NonNull final CarrierMessagingCallback callback) { - if (mICarrierMessagingService != null) { - try { - mICarrierMessagingService.sendMultipartTextSms(parts, subId, destAddress, - sendSmsFlag, new CarrierMessagingCallbackInternal(callback)); - } catch (RemoteException e) { - throw new RuntimeException(e); - } + Objects.requireNonNull(mICarrierMessagingService); + try { + mICarrierMessagingService.sendMultipartTextSms(parts, subId, destAddress, + sendSmsFlag, new CarrierMessagingCallbackInternal(callback, executor)); + } catch (RemoteException e) { + throw new RuntimeException(e); } } @@ -206,18 +249,20 @@ public final class CarrierMessagingServiceWrapper { * @param subId SMS subscription ID of the SIM * @param location the optional URI to send this MMS PDU. If this is {code null}, * the PDU should be sent to the default MMSC URL. + * @param executor the executor to run the callback. * @param callback the callback to notify upon completion * @hide */ + @SystemApi public void sendMms(@NonNull Uri pduUri, int subId, @NonNull Uri location, + @NonNull @CallbackExecutor final Executor executor, @NonNull final CarrierMessagingCallback callback) { - if (mICarrierMessagingService != null) { - try { - mICarrierMessagingService.sendMms(pduUri, subId, location, - new CarrierMessagingCallbackInternal(callback)); - } catch (RemoteException e) { - throw new RuntimeException(e); - } + Objects.requireNonNull(mICarrierMessagingService); + try { + mICarrierMessagingService.sendMms(pduUri, subId, location, + new CarrierMessagingCallbackInternal(callback, executor)); + } catch (RemoteException e) { + throw new RuntimeException(e); } } @@ -229,18 +274,20 @@ public final class CarrierMessagingServiceWrapper { * @param pduUri the content provider URI of the PDU to be downloaded. * @param subId SMS subscription ID of the SIM * @param location the URI of the message to be downloaded. + * @param executor the executor to run the callback. * @param callback the callback to notify upon completion * @hide */ + @SystemApi public void downloadMms(@NonNull Uri pduUri, int subId, @NonNull Uri location, + @NonNull @CallbackExecutor final Executor executor, @NonNull final CarrierMessagingCallback callback) { - if (mICarrierMessagingService != null) { - try { - mICarrierMessagingService.downloadMms(pduUri, subId, location, - new CarrierMessagingCallbackInternal(callback)); - } catch (RemoteException e) { - throw new RuntimeException(e); - } + Objects.requireNonNull(mICarrierMessagingService); + try { + mICarrierMessagingService.downloadMms(pduUri, subId, location, + new CarrierMessagingCallbackInternal(callback, executor)); + } catch (RemoteException e) { + throw new RuntimeException(e); } } @@ -263,19 +310,19 @@ public final class CarrierMessagingServiceWrapper { * {@link CarrierMessagingServiceWrapper}. * @hide */ + @SystemApi public interface CarrierMessagingCallback { - /** - * Response callback for {@link CarrierMessagingServiceWrapper#filterSms}. + * Response callback for {@link CarrierMessagingServiceWrapper#receiveSms}. * @param result a bitmask integer to indicate how the incoming text SMS should be handled * by the platform. Bits set can be * {@link CarrierMessagingService#RECEIVE_OPTIONS_DROP} and * {@link CarrierMessagingService# * RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE}. - * {@see CarrierMessagingService#onReceiveTextSms}. - * @hide + * {@link CarrierMessagingService#onReceiveTextSms}. */ - default void onFilterComplete(int result) { + default void onReceiveSmsComplete( + @CarrierMessagingService.FilterCompleteResult int result) { } @@ -287,10 +334,9 @@ public final class CarrierMessagingServiceWrapper { * and {@link CarrierMessagingService#SEND_STATUS_ERROR}. * @param messageRef message reference of the just-sent message. This field is applicable * only if result is {@link CarrierMessagingService#SEND_STATUS_OK}. - * @hide */ - default void onSendSmsComplete(int result, int messageRef) { - + default void onSendSmsComplete(@CarrierMessagingService.SendResult + int result, int messageRef) { } /** @@ -301,9 +347,9 @@ public final class CarrierMessagingServiceWrapper { * @param messageRefs an array of message references, one for each part of the * multipart SMS. This field is applicable only if result is * {@link CarrierMessagingService#SEND_STATUS_OK}. - * @hide */ - default void onSendMultipartSmsComplete(int result, @Nullable int[] messageRefs) { + default void onSendMultipartSmsComplete(@CarrierMessagingService.SendResult + int result, @Nullable int[] messageRefs) { } @@ -315,56 +361,62 @@ public final class CarrierMessagingServiceWrapper { * @param sendConfPdu a possibly {code null} SendConf PDU, which confirms that the message * was sent. sendConfPdu is ignored if the {@code result} is not * {@link CarrierMessagingService#SEND_STATUS_OK}. - * @hide */ - default void onSendMmsComplete(int result, @Nullable byte[] sendConfPdu) { + default void onSendMmsComplete(@CarrierMessagingService.SendResult + int result, @Nullable byte[] sendConfPdu) { } /** * Response callback for {@link CarrierMessagingServiceWrapper#downloadMms}. - * @param result download status, one of {@link CarrierMessagingService#SEND_STATUS_OK}, - * {@link CarrierMessagingService#SEND_STATUS_RETRY_ON_CARRIER_NETWORK}, - * and {@link CarrierMessagingService#SEND_STATUS_ERROR}. - * @hide + * @param result download status, one of {@link CarrierMessagingService#DOWNLOAD_STATUS_OK}, + * {@link CarrierMessagingService#DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK}, + * and {@link CarrierMessagingService#DOWNLOAD_STATUS_ERROR}. */ - default void onDownloadMmsComplete(int result) { + default void onDownloadMmsComplete(@CarrierMessagingService.DownloadResult + int result) { } } private final class CarrierMessagingCallbackInternal extends ICarrierMessagingCallback.Stub { - CarrierMessagingCallback mCarrierMessagingCallback; + final CarrierMessagingCallback mCarrierMessagingCallback; + final Executor mExecutor; - CarrierMessagingCallbackInternal(CarrierMessagingCallback callback) { + CarrierMessagingCallbackInternal(CarrierMessagingCallback callback, + final Executor executor) { mCarrierMessagingCallback = callback; + mExecutor = executor; } @Override public void onFilterComplete(int result) throws RemoteException { - mCarrierMessagingCallback.onFilterComplete(result); + mExecutor.execute(() -> mCarrierMessagingCallback.onReceiveSmsComplete(result)); } @Override public void onSendSmsComplete(int result, int messageRef) throws RemoteException { - mCarrierMessagingCallback.onSendSmsComplete(result, messageRef); + mExecutor.execute(() -> mCarrierMessagingCallback.onSendSmsComplete( + result, messageRef)); } @Override public void onSendMultipartSmsComplete(int result, int[] messageRefs) throws RemoteException { - mCarrierMessagingCallback.onSendMultipartSmsComplete(result, messageRefs); + mExecutor.execute(() -> mCarrierMessagingCallback.onSendMultipartSmsComplete( + result, messageRefs)); } @Override public void onSendMmsComplete(int result, byte[] sendConfPdu) throws RemoteException { - mCarrierMessagingCallback.onSendMmsComplete(result, sendConfPdu); + mExecutor.execute(() -> mCarrierMessagingCallback.onSendMmsComplete( + result, sendConfPdu)); } @Override public void onDownloadMmsComplete(int result) throws RemoteException { - mCarrierMessagingCallback.onDownloadMmsComplete(result); + mExecutor.execute(() -> mCarrierMessagingCallback.onDownloadMmsComplete(result)); } } -}
\ No newline at end of file +} diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index d6397f7c4860..141b8cbe8022 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -350,6 +350,9 @@ <!-- Permissions required for CTS test - CtsContactsProviderTestCases --> <uses-permission android:name="android.contacts.permission.MANAGE_SIM_ACCOUNTS" /> + <!-- Permissions required for CTS test - CarrierMessagingServiceWrapprTest --> + <uses-permission android:name="android.permission.BIND_CARRIER_SERVICES" /> + <!-- Allows overriding the system's device state from the shell --> <uses-permission android:name="android.permission.CONTROL_DEVICE_STATE"/> |