From 61b239171d822b654154f56a257f458a1da9856e Mon Sep 17 00:00:00 2001 From: Ta-wei Yen Date: Tue, 26 Jan 2016 17:52:51 -0800 Subject: [PATCH] Added more granular states to DATA_CHANNEL_STATE Added ACTION_SYNC_VOICEMAIL for manual visual voicemail sync. Change-Id: Ib812988256c137da301a98a283e7e52dfd881440 --- api/current.txt | 6 + api/system-current.txt | 6 + api/test-current.txt | 6 + .../android/provider/VoicemailContract.java | 105 ++++++++++++------ 4 files changed, 89 insertions(+), 34 deletions(-) diff --git a/api/current.txt b/api/current.txt index ee69bfaad1229..1a9f0070df7af 100644 --- a/api/current.txt +++ b/api/current.txt @@ -32230,6 +32230,7 @@ package android.provider { public class VoicemailContract { field public static final java.lang.String ACTION_FETCH_VOICEMAIL = "android.intent.action.FETCH_VOICEMAIL"; field public static final java.lang.String ACTION_NEW_VOICEMAIL = "android.intent.action.NEW_VOICEMAIL"; + field public static final java.lang.String ACTION_SYNC_VOICEMAIL = "android.intent.action.SYNC_VOICEMAIL"; field public static final java.lang.String AUTHORITY = "com.android.voicemail"; field public static final java.lang.String EXTRA_SELF_CHANGE = "com.android.voicemail.extra.SELF_CHANGE"; field public static final java.lang.String PARAM_KEY_SOURCE_PACKAGE = "source_package"; @@ -32244,8 +32245,13 @@ package android.provider { field public static final int CONFIGURATION_STATE_OK = 0; // 0x0 field public static final android.net.Uri CONTENT_URI; field public static final java.lang.String DATA_CHANNEL_STATE = "data_channel_state"; + field public static final int DATA_CHANNEL_STATE_BAD_CONFIGURATION = 3; // 0x3 + field public static final int DATA_CHANNEL_STATE_COMMUNICATION_ERROR = 4; // 0x4 field public static final int DATA_CHANNEL_STATE_NO_CONNECTION = 1; // 0x1 + field public static final int DATA_CHANNEL_STATE_NO_CONNECTION_CELLULAR_REQUIRED = 2; // 0x2 field public static final int DATA_CHANNEL_STATE_OK = 0; // 0x0 + field public static final int DATA_CHANNEL_STATE_SERVER_CONNECTION_ERROR = 6; // 0x6 + field public static final int DATA_CHANNEL_STATE_SERVER_ERROR = 5; // 0x5 field public static final java.lang.String DIR_TYPE = "vnd.android.cursor.dir/voicemail.source.status"; field public static final java.lang.String ITEM_TYPE = "vnd.android.cursor.item/voicemail.source.status"; field public static final java.lang.String NOTIFICATION_CHANNEL_STATE = "notification_channel_state"; diff --git a/api/system-current.txt b/api/system-current.txt index 0c88a4977b08b..d6df895c34a49 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -34452,6 +34452,7 @@ package android.provider { public class VoicemailContract { field public static final java.lang.String ACTION_FETCH_VOICEMAIL = "android.intent.action.FETCH_VOICEMAIL"; field public static final java.lang.String ACTION_NEW_VOICEMAIL = "android.intent.action.NEW_VOICEMAIL"; + field public static final java.lang.String ACTION_SYNC_VOICEMAIL = "android.intent.action.SYNC_VOICEMAIL"; field public static final java.lang.String AUTHORITY = "com.android.voicemail"; field public static final java.lang.String EXTRA_SELF_CHANGE = "com.android.voicemail.extra.SELF_CHANGE"; field public static final java.lang.String PARAM_KEY_SOURCE_PACKAGE = "source_package"; @@ -34466,8 +34467,13 @@ package android.provider { field public static final int CONFIGURATION_STATE_OK = 0; // 0x0 field public static final android.net.Uri CONTENT_URI; field public static final java.lang.String DATA_CHANNEL_STATE = "data_channel_state"; + field public static final int DATA_CHANNEL_STATE_BAD_CONFIGURATION = 3; // 0x3 + field public static final int DATA_CHANNEL_STATE_COMMUNICATION_ERROR = 4; // 0x4 field public static final int DATA_CHANNEL_STATE_NO_CONNECTION = 1; // 0x1 + field public static final int DATA_CHANNEL_STATE_NO_CONNECTION_CELLULAR_REQUIRED = 2; // 0x2 field public static final int DATA_CHANNEL_STATE_OK = 0; // 0x0 + field public static final int DATA_CHANNEL_STATE_SERVER_CONNECTION_ERROR = 6; // 0x6 + field public static final int DATA_CHANNEL_STATE_SERVER_ERROR = 5; // 0x5 field public static final java.lang.String DIR_TYPE = "vnd.android.cursor.dir/voicemail.source.status"; field public static final java.lang.String ITEM_TYPE = "vnd.android.cursor.item/voicemail.source.status"; field public static final java.lang.String NOTIFICATION_CHANNEL_STATE = "notification_channel_state"; diff --git a/api/test-current.txt b/api/test-current.txt index 42a8f1b79b630..550807fc645c8 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -32244,6 +32244,7 @@ package android.provider { public class VoicemailContract { field public static final java.lang.String ACTION_FETCH_VOICEMAIL = "android.intent.action.FETCH_VOICEMAIL"; field public static final java.lang.String ACTION_NEW_VOICEMAIL = "android.intent.action.NEW_VOICEMAIL"; + field public static final java.lang.String ACTION_SYNC_VOICEMAIL = "android.intent.action.SYNC_VOICEMAIL"; field public static final java.lang.String AUTHORITY = "com.android.voicemail"; field public static final java.lang.String EXTRA_SELF_CHANGE = "com.android.voicemail.extra.SELF_CHANGE"; field public static final java.lang.String PARAM_KEY_SOURCE_PACKAGE = "source_package"; @@ -32258,8 +32259,13 @@ package android.provider { field public static final int CONFIGURATION_STATE_OK = 0; // 0x0 field public static final android.net.Uri CONTENT_URI; field public static final java.lang.String DATA_CHANNEL_STATE = "data_channel_state"; + field public static final int DATA_CHANNEL_STATE_BAD_CONFIGURATION = 3; // 0x3 + field public static final int DATA_CHANNEL_STATE_COMMUNICATION_ERROR = 4; // 0x4 field public static final int DATA_CHANNEL_STATE_NO_CONNECTION = 1; // 0x1 + field public static final int DATA_CHANNEL_STATE_NO_CONNECTION_CELLULAR_REQUIRED = 2; // 0x2 field public static final int DATA_CHANNEL_STATE_OK = 0; // 0x0 + field public static final int DATA_CHANNEL_STATE_SERVER_CONNECTION_ERROR = 6; // 0x6 + field public static final int DATA_CHANNEL_STATE_SERVER_ERROR = 5; // 0x5 field public static final java.lang.String DIR_TYPE = "vnd.android.cursor.dir/voicemail.source.status"; field public static final java.lang.String ITEM_TYPE = "vnd.android.cursor.item/voicemail.source.status"; field public static final java.lang.String NOTIFICATION_CHANNEL_STATE = "notification_channel_state"; diff --git a/core/java/android/provider/VoicemailContract.java b/core/java/android/provider/VoicemailContract.java index 24683cb1d9fda..8ee9d1eaf9149 100644 --- a/core/java/android/provider/VoicemailContract.java +++ b/core/java/android/provider/VoicemailContract.java @@ -100,6 +100,12 @@ private VoicemailContract() { @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_FETCH_VOICEMAIL = "android.intent.action.FETCH_VOICEMAIL"; + /** + * Broadcast intent to request all voicemail sources to perform a sync with the remote server. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_SYNC_VOICEMAIL = "android.intent.action.SYNC_VOICEMAIL"; + /** * Extra included in {@link Intent#ACTION_PROVIDER_CHANGED} broadcast intents to indicate if the * receiving package made this change. @@ -393,6 +399,14 @@ private Status() { *

Type: INTEGER

*/ public static final String CONFIGURATION_STATE = "configuration_state"; + /** + * Value of {@link #CONFIGURATION_STATE} passed into + * {@link #setStatus(Context, PhoneAccountHandle, int, int, int)} to indicate that the + * {@link #CONFIGURATION_STATE} field is not to be changed + * + * @hide + */ + public static final int CONFIGURATION_STATE_IGNORE = -1; /** Value of {@link #CONFIGURATION_STATE} to indicate an all OK configuration status. */ public static final int CONFIGURATION_STATE_OK = 0; /** @@ -417,15 +431,50 @@ private Status() { *

Type: INTEGER

*/ public static final String DATA_CHANNEL_STATE = "data_channel_state"; + /** + * Value of {@link #DATA_CHANNEL_STATE} passed into + * {@link #setStatus(Context, PhoneAccountHandle, int, int, int)} to indicate that the + * {@link #DATA_CHANNEL_STATE} field is not to be changed + * + * @hide + */ + public static final int DATA_CHANNEL_STATE_IGNORE = -1; /** * Value of {@link #DATA_CHANNEL_STATE} to indicate that data channel is working fine. */ public static final int DATA_CHANNEL_STATE_OK = 0; /** - * Value of {@link #DATA_CHANNEL_STATE} to indicate that data channel connection is not - * working. + * Value of {@link #DATA_CHANNEL_STATE} to indicate that data channel failed to find a + * suitable network to connect to the server. */ public static final int DATA_CHANNEL_STATE_NO_CONNECTION = 1; + /** + * Value of {@link #DATA_CHANNEL_STATE} to indicate that data channel failed to find a + * suitable network to connect to the server, and the carrier requires using cellular + * data network to connect to the server. + */ + public static final int DATA_CHANNEL_STATE_NO_CONNECTION_CELLULAR_REQUIRED = 2; + /** + * Value of {@link #DATA_CHANNEL_STATE} to indicate that data channel received incorrect + * settings or credentials to connect to the server + */ + public static final int DATA_CHANNEL_STATE_BAD_CONFIGURATION = 3; + /** + * Value of {@link #DATA_CHANNEL_STATE} to indicate that a error has occurred in the data + * channel while communicating with the server + */ + public static final int DATA_CHANNEL_STATE_COMMUNICATION_ERROR = 4; + /** + * Value of {@link #DATA_CHANNEL_STATE} to indicate that the server reported an internal + * error to the data channel. + */ + public static final int DATA_CHANNEL_STATE_SERVER_ERROR = 5; + /** + * Value of {@link #DATA_CHANNEL_STATE} to indicate that while there is a suitable network, + * the data channel is unable to establish a connection with the server. + */ + public static final int DATA_CHANNEL_STATE_SERVER_CONNECTION_ERROR = 6; + /** * The notification channel state of the voicemail source. This is the channel through which * the source gets notified of new voicemails on the remote server. @@ -437,6 +486,14 @@ private Status() { *

Type: INTEGER

*/ public static final String NOTIFICATION_CHANNEL_STATE = "notification_channel_state"; + /** + * Value of {@link #NOTIFICATION_CHANNEL_STATE} passed into + * {@link #setStatus(Context, PhoneAccountHandle, int, int, int)} to indicate that the + * {@link #NOTIFICATION_CHANNEL_STATE} field is not to be changed + * + * @hide + */ + public static final int NOTIFICATION_CHANNEL_STATE_IGNORE = -1; /** * Value of {@link #NOTIFICATION_CHANNEL_STATE} to indicate that the notification channel is * working fine. @@ -497,21 +554,22 @@ public static Uri buildSourceUri(String packageName) { */ public static void setStatus(Context context, PhoneAccountHandle accountHandle, int configurationState, int dataChannelState, int notificationChannelState) { - ContentResolver contentResolver = context.getContentResolver(); - Uri statusUri = buildSourceUri(context.getPackageName()); ContentValues values = new ContentValues(); values.put(Status.PHONE_ACCOUNT_COMPONENT_NAME, accountHandle.getComponentName().flattenToString()); values.put(Status.PHONE_ACCOUNT_ID, accountHandle.getId()); - values.put(Status.CONFIGURATION_STATE, configurationState); - values.put(Status.DATA_CHANNEL_STATE, dataChannelState); - values.put(Status.NOTIFICATION_CHANNEL_STATE, notificationChannelState); - - if (isStatusPresent(contentResolver, statusUri)) { - contentResolver.update(statusUri, values, null, null); - } else { - contentResolver.insert(statusUri, values); + if(configurationState != CONFIGURATION_STATE_IGNORE) { + values.put(Status.CONFIGURATION_STATE, configurationState); + } + if(dataChannelState != DATA_CHANNEL_STATE_IGNORE) { + values.put(Status.DATA_CHANNEL_STATE, dataChannelState); } + if(notificationChannelState != NOTIFICATION_CHANNEL_STATE_IGNORE) { + values.put(Status.NOTIFICATION_CHANNEL_STATE, notificationChannelState); + } + ContentResolver contentResolver = context.getContentResolver(); + Uri statusUri = buildSourceUri(context.getPackageName()); + contentResolver.insert(statusUri, values); } /** @@ -540,28 +598,7 @@ public static void setQuota(Context context, PhoneAccountHandle accountHandle, i ContentResolver contentResolver = context.getContentResolver(); Uri statusUri = buildSourceUri(context.getPackageName()); - if (isStatusPresent(contentResolver, statusUri)) { - contentResolver.update(statusUri, values, null, null); - } else { - contentResolver.insert(statusUri, values); - } - } - - /** - * Determines if a voicemail source exists in the status table. - * - * @param contentResolver A content resolver constructed from the appropriate context. - * @param statusUri The content uri for the source. - * @return {@code true} if a status entry for this source exists - */ - private static boolean isStatusPresent(ContentResolver contentResolver, Uri statusUri) { - Cursor cursor = null; - try { - cursor = contentResolver.query(statusUri, null, null, null, null); - return cursor != null && cursor.getCount() != 0; - } finally { - if (cursor != null) cursor.close(); - } + contentResolver.insert(statusUri, values); } } }