From 485d6dec93579d2186a3ecd57c2b5af4ce8e622b Mon Sep 17 00:00:00 2001 From: Ta-wei Yen Date: Fri, 16 Dec 2016 12:17:30 -0800 Subject: [PATCH] Add VisualVoicemailService VisualVoicemailService can be implemennted by the default dialer to provide a visual voicemail client similar to the OMTP visual voicemail spec. Other APIs such as the SMS filter and hidden text SMS sending are made public and consolidated into the service interface. Test: make. CTS tests in a follow up CL Change-Id: Ib5e9aa15fc098f4c13b15e5dbecf9ab646e0e400 --- api/current.txt | 49 +++ api/system-current.txt | 49 +++ api/test-current.txt | 49 +++ .../android/provider/VoicemailContract.java | 47 +-- core/res/AndroidManifest.xml | 8 + .../android/telephony/TelephonyManager.java | 39 ++- .../telephony/VisualVoicemailService.java | 281 ++++++++++++++++++ .../android/telephony/VisualVoicemailSms.java | 148 +++++++++ .../VisualVoicemailSmsFilterSettings.java | 30 +- .../internal/telephony/ITelephony.aidl | 16 +- 10 files changed, 654 insertions(+), 62 deletions(-) create mode 100644 telephony/java/android/telephony/VisualVoicemailService.java create mode 100644 telephony/java/android/telephony/VisualVoicemailSms.java diff --git a/api/current.txt b/api/current.txt index 94890213d3a8e..cb1fee4d1b7d2 100644 --- a/api/current.txt +++ b/api/current.txt @@ -38,6 +38,7 @@ package android { field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE"; field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE"; field public static final java.lang.String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT"; + field public static final java.lang.String BIND_VISUAL_VOICEMAIL_SERVICE = "android.permission.BIND_VISUAL_VOICEMAIL_SERVICE"; field public static final java.lang.String BIND_VOICE_INTERACTION = "android.permission.BIND_VOICE_INTERACTION"; field public static final java.lang.String BIND_VPN_SERVICE = "android.permission.BIND_VPN_SERVICE"; field public static final java.lang.String BIND_VR_LISTENER_SERVICE = "android.permission.BIND_VR_LISTENER_SERVICE"; @@ -37933,6 +37934,54 @@ package android.telephony { method public void onReceiveUssdResponseFailed(java.lang.String, int); } + public abstract class VisualVoicemailService extends android.app.Service { + ctor public VisualVoicemailService(); + method public android.os.IBinder onBind(android.content.Intent); + method public abstract void onCellServiceConnected(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle); + method public abstract void onSimRemoved(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle); + method public abstract void onSmsReceived(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telephony.VisualVoicemailSms); + method public abstract void onStopped(android.telephony.VisualVoicemailService.VisualVoicemailTask); + method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, java.lang.String, short, java.lang.String, android.app.PendingIntent); + method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings); + field public static final java.lang.String SERVICE_INTERFACE = "android.telephony.VisualVoicemailService"; + } + + public static class VisualVoicemailService.VisualVoicemailTask { + method public final void finish(); + } + + public final class VisualVoicemailSms implements android.os.Parcelable { + method public int describeContents(); + method public android.os.Bundle getFields(); + method public java.lang.String getMessageBody(); + method public android.telecom.PhoneAccountHandle getPhoneAccountHandle(); + method public java.lang.String getPrefix(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; + } + + public final class VisualVoicemailSmsFilterSettings implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; + field public static final java.lang.String DEFAULT_CLIENT_PREFIX = "//VVM"; + field public static final int DEFAULT_DESTINATION_PORT = -1; // 0xffffffff + field public static final java.util.List DEFAULT_ORIGINATING_NUMBERS; + field public static final int DESTINATION_PORT_ANY = -1; // 0xffffffff + field public static final int DESTINATION_PORT_DATA_SMS = -2; // 0xfffffffe + field public final java.lang.String clientPrefix; + field public final int destinationPort; + field public final java.util.List originatingNumbers; + } + + public static class VisualVoicemailSmsFilterSettings.Builder { + ctor public VisualVoicemailSmsFilterSettings.Builder(); + method public android.telephony.VisualVoicemailSmsFilterSettings build(); + method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setClientPrefix(java.lang.String); + method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setDestinationPort(int); + method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setOriginatingNumbers(java.util.List); + } + } package android.telephony.cdma { diff --git a/api/system-current.txt b/api/system-current.txt index 2190abb2ef67f..0ad1eea4ef467 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -55,6 +55,7 @@ package android { field public static final java.lang.String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT"; field public static final java.lang.String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT"; field public static final java.lang.String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE"; + field public static final java.lang.String BIND_VISUAL_VOICEMAIL_SERVICE = "android.permission.BIND_VISUAL_VOICEMAIL_SERVICE"; field public static final java.lang.String BIND_VOICE_INTERACTION = "android.permission.BIND_VOICE_INTERACTION"; field public static final java.lang.String BIND_VPN_SERVICE = "android.permission.BIND_VPN_SERVICE"; field public static final java.lang.String BIND_VR_LISTENER_SERVICE = "android.permission.BIND_VR_LISTENER_SERVICE"; @@ -41084,6 +41085,54 @@ package android.telephony { method public void onReceiveUssdResponseFailed(java.lang.String, int); } + public abstract class VisualVoicemailService extends android.app.Service { + ctor public VisualVoicemailService(); + method public android.os.IBinder onBind(android.content.Intent); + method public abstract void onCellServiceConnected(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle); + method public abstract void onSimRemoved(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle); + method public abstract void onSmsReceived(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telephony.VisualVoicemailSms); + method public abstract void onStopped(android.telephony.VisualVoicemailService.VisualVoicemailTask); + method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, java.lang.String, short, java.lang.String, android.app.PendingIntent); + method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings); + field public static final java.lang.String SERVICE_INTERFACE = "android.telephony.VisualVoicemailService"; + } + + public static class VisualVoicemailService.VisualVoicemailTask { + method public final void finish(); + } + + public final class VisualVoicemailSms implements android.os.Parcelable { + method public int describeContents(); + method public android.os.Bundle getFields(); + method public java.lang.String getMessageBody(); + method public android.telecom.PhoneAccountHandle getPhoneAccountHandle(); + method public java.lang.String getPrefix(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; + } + + public final class VisualVoicemailSmsFilterSettings implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; + field public static final java.lang.String DEFAULT_CLIENT_PREFIX = "//VVM"; + field public static final int DEFAULT_DESTINATION_PORT = -1; // 0xffffffff + field public static final java.util.List DEFAULT_ORIGINATING_NUMBERS; + field public static final int DESTINATION_PORT_ANY = -1; // 0xffffffff + field public static final int DESTINATION_PORT_DATA_SMS = -2; // 0xfffffffe + field public final java.lang.String clientPrefix; + field public final int destinationPort; + field public final java.util.List originatingNumbers; + } + + public static class VisualVoicemailSmsFilterSettings.Builder { + ctor public VisualVoicemailSmsFilterSettings.Builder(); + method public android.telephony.VisualVoicemailSmsFilterSettings build(); + method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setClientPrefix(java.lang.String); + method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setDestinationPort(int); + method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setOriginatingNumbers(java.util.List); + } + } package android.telephony.cdma { diff --git a/api/test-current.txt b/api/test-current.txt index a55fa4e6b7a17..ceb1af7faf208 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -38,6 +38,7 @@ package android { field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE"; field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE"; field public static final java.lang.String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT"; + field public static final java.lang.String BIND_VISUAL_VOICEMAIL_SERVICE = "android.permission.BIND_VISUAL_VOICEMAIL_SERVICE"; field public static final java.lang.String BIND_VOICE_INTERACTION = "android.permission.BIND_VOICE_INTERACTION"; field public static final java.lang.String BIND_VPN_SERVICE = "android.permission.BIND_VPN_SERVICE"; field public static final java.lang.String BIND_VR_LISTENER_SERVICE = "android.permission.BIND_VR_LISTENER_SERVICE"; @@ -38029,6 +38030,54 @@ package android.telephony { method public void onReceiveUssdResponseFailed(java.lang.String, int); } + public abstract class VisualVoicemailService extends android.app.Service { + ctor public VisualVoicemailService(); + method public android.os.IBinder onBind(android.content.Intent); + method public abstract void onCellServiceConnected(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle); + method public abstract void onSimRemoved(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle); + method public abstract void onSmsReceived(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telephony.VisualVoicemailSms); + method public abstract void onStopped(android.telephony.VisualVoicemailService.VisualVoicemailTask); + method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, java.lang.String, short, java.lang.String, android.app.PendingIntent); + method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings); + field public static final java.lang.String SERVICE_INTERFACE = "android.telephony.VisualVoicemailService"; + } + + public static class VisualVoicemailService.VisualVoicemailTask { + method public final void finish(); + } + + public final class VisualVoicemailSms implements android.os.Parcelable { + method public int describeContents(); + method public android.os.Bundle getFields(); + method public java.lang.String getMessageBody(); + method public android.telecom.PhoneAccountHandle getPhoneAccountHandle(); + method public java.lang.String getPrefix(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; + } + + public final class VisualVoicemailSmsFilterSettings implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; + field public static final java.lang.String DEFAULT_CLIENT_PREFIX = "//VVM"; + field public static final int DEFAULT_DESTINATION_PORT = -1; // 0xffffffff + field public static final java.util.List DEFAULT_ORIGINATING_NUMBERS; + field public static final int DESTINATION_PORT_ANY = -1; // 0xffffffff + field public static final int DESTINATION_PORT_DATA_SMS = -2; // 0xfffffffe + field public final java.lang.String clientPrefix; + field public final int destinationPort; + field public final java.util.List originatingNumbers; + } + + public static class VisualVoicemailSmsFilterSettings.Builder { + ctor public VisualVoicemailSmsFilterSettings.Builder(); + method public android.telephony.VisualVoicemailSmsFilterSettings build(); + method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setClientPrefix(java.lang.String); + method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setDestinationPort(int); + method public android.telephony.VisualVoicemailSmsFilterSettings.Builder setOriginatingNumbers(java.util.List); + } + } package android.telephony.cdma { diff --git a/core/java/android/provider/VoicemailContract.java b/core/java/android/provider/VoicemailContract.java index 5099eebf6eb16..c3cbcdc3932c9 100644 --- a/core/java/android/provider/VoicemailContract.java +++ b/core/java/android/provider/VoicemailContract.java @@ -106,15 +106,7 @@ public class VoicemailContract { /** * Broadcast intent to inform a new visual voicemail SMS has been received. This intent will - * only be delivered to the voicemail client. The intent will have the following extra values: - * - *
    - *
  • {@link #EXTRA_VOICEMAIL_SMS_TYPE} - (String) The event type of the SMS. Common - * values are "SYNC" or "STATUS"
  • - *
  • {@link #EXTRA_VOICEMAIL_SMS_DATA} - (Bundle) The fields sent by the SMS
  • - *
  • {@link #EXTRA_VOICEMAIL_SMS_SUBID} - (Integer) The subscription ID of the - * phone account that received the SMS
  • - *
+ * only be delivered to the telephony service. {@link #EXTRA_VOICEMAIL_SMS} will be included. */ /** @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) @@ -122,42 +114,11 @@ public class VoicemailContract { "android.intent.action.VOICEMAIL_SMS_RECEIVED"; /** - * Optional extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to - * indicate the event type of the SMS. Common values are "SYNC" or "STATUS". The extra will not - * exist if the framework cannot parse the SMS as voicemail but the carrier pattern indicates - * it is. - */ - /** @hide */ - public static final String EXTRA_VOICEMAIL_SMS_PREFIX = - "com.android.voicemail.extra.VOICEMAIL_SMS_PREFIX"; - - /** - * Optional extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to - * indicate the fields sent by the SMS. The extra will not exist if the framework cannot - * parse the SMS as voicemail but the carrier pattern indicates it is. - */ - /** @hide */ - public static final String EXTRA_VOICEMAIL_SMS_FIELDS = - "com.android.voicemail.extra.VOICEMAIL_SMS_FIELDS"; - - /** - * Extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to indicate the - * message body of the SMS. This extra is included if the framework cannot - * parse the SMS as voicemail but the carrier pattern indicates it is. - */ - /** + * Extra in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} indicating the content of the SMS. + * * @hide */ - public static final String EXTRA_VOICEMAIL_SMS_MESSAGE_BODY = - "com.android.voicemail.extra.VOICEMAIL_SMS_MESSAGE_BODY"; - - /** - * Extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to indicate he - * subscription ID of the phone account that received the SMS. - */ - /** @hide */ - public static final String EXTRA_VOICEMAIL_SMS_SUBID = - "com.android.voicemail.extra.VOICEMAIL_SMS_SUBID"; + public static final String EXTRA_VOICEMAIL_SMS = "android.provider.extra.VOICEMAIL_SMS"; /** * Extra included in {@link Intent#ACTION_PROVIDER_CHANGED} broadcast intents to indicate if the diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 6f33f2787340a..201e5780a8280 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1540,6 +1540,14 @@ + + +