Helper methods for voicemail status provider.
Added method to make it easier to insert into the voicemail status table. Also takes in a phone account for future multi-SIM support. Remove VvmSyncService class in favor of moving most of the code to OmtpVvmSyncService. Bug: 19236241 Change-Id: I5d9def276fbdbc6f825fb35e9fa31bfc3cead1ba
This commit is contained in:
@@ -25881,6 +25881,7 @@ package android.provider {
|
|||||||
|
|
||||||
public static final class VoicemailContract.Status implements android.provider.BaseColumns {
|
public static final class VoicemailContract.Status implements android.provider.BaseColumns {
|
||||||
method public static android.net.Uri buildSourceUri(java.lang.String);
|
method public static android.net.Uri buildSourceUri(java.lang.String);
|
||||||
|
method public static void setStatus(android.content.Context, android.telecom.PhoneAccountHandle, int, int, int);
|
||||||
field public static final java.lang.String CONFIGURATION_STATE = "configuration_state";
|
field public static final java.lang.String CONFIGURATION_STATE = "configuration_state";
|
||||||
field public static final int CONFIGURATION_STATE_CAN_BE_CONFIGURED = 2; // 0x2
|
field public static final int CONFIGURATION_STATE_CAN_BE_CONFIGURED = 2; // 0x2
|
||||||
field public static final int CONFIGURATION_STATE_NOT_CONFIGURED = 1; // 0x1
|
field public static final int CONFIGURATION_STATE_NOT_CONFIGURED = 1; // 0x1
|
||||||
@@ -28346,22 +28347,6 @@ package android.telecom {
|
|||||||
method public android.telecom.Voicemail.Builder setUri(android.net.Uri);
|
method public android.telecom.Voicemail.Builder setUri(android.net.Uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class VvmSyncService extends android.app.Service {
|
|
||||||
ctor public VvmSyncService();
|
|
||||||
method public android.os.IBinder onBind(android.content.Intent);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class VvmSyncService.VvmSyncAdapter extends android.content.AbstractThreadedSyncAdapter {
|
|
||||||
ctor public VvmSyncService.VvmSyncAdapter(android.content.Context, boolean);
|
|
||||||
method protected java.util.List<android.telecom.Voicemail> downloadVoicemails();
|
|
||||||
method public void onPerformSync(android.accounts.Account, android.os.Bundle, java.lang.String, android.content.ContentProviderClient, android.content.SyncResult);
|
|
||||||
method protected void syncToServer();
|
|
||||||
field public static final java.lang.String NEW_VOICEMAIL_DATA = "extra_new_voicemail_data";
|
|
||||||
field public static final java.lang.String SYNC_EXTRA_CODE = "sync_extra_code";
|
|
||||||
field public static final int SYNC_EXTRA_MAILBOX_UPDATE = 2; // 0x2
|
|
||||||
field public static final int SYNC_EXTRA_NEW_VOICEMAIL = 1; // 0x1
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
package android.telephony {
|
package android.telephony {
|
||||||
|
|||||||
@@ -27504,6 +27504,7 @@ package android.provider {
|
|||||||
|
|
||||||
public static final class VoicemailContract.Status implements android.provider.BaseColumns {
|
public static final class VoicemailContract.Status implements android.provider.BaseColumns {
|
||||||
method public static android.net.Uri buildSourceUri(java.lang.String);
|
method public static android.net.Uri buildSourceUri(java.lang.String);
|
||||||
|
method public static void setStatus(android.content.Context, android.telecom.PhoneAccountHandle, int, int, int);
|
||||||
field public static final java.lang.String CONFIGURATION_STATE = "configuration_state";
|
field public static final java.lang.String CONFIGURATION_STATE = "configuration_state";
|
||||||
field public static final int CONFIGURATION_STATE_CAN_BE_CONFIGURED = 2; // 0x2
|
field public static final int CONFIGURATION_STATE_CAN_BE_CONFIGURED = 2; // 0x2
|
||||||
field public static final int CONFIGURATION_STATE_NOT_CONFIGURED = 1; // 0x1
|
field public static final int CONFIGURATION_STATE_NOT_CONFIGURED = 1; // 0x1
|
||||||
@@ -30522,22 +30523,6 @@ package android.telecom {
|
|||||||
method public android.telecom.Voicemail.Builder setUri(android.net.Uri);
|
method public android.telecom.Voicemail.Builder setUri(android.net.Uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class VvmSyncService extends android.app.Service {
|
|
||||||
ctor public VvmSyncService();
|
|
||||||
method public android.os.IBinder onBind(android.content.Intent);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class VvmSyncService.VvmSyncAdapter extends android.content.AbstractThreadedSyncAdapter {
|
|
||||||
ctor public VvmSyncService.VvmSyncAdapter(android.content.Context, boolean);
|
|
||||||
method protected java.util.List<android.telecom.Voicemail> downloadVoicemails();
|
|
||||||
method public void onPerformSync(android.accounts.Account, android.os.Bundle, java.lang.String, android.content.ContentProviderClient, android.content.SyncResult);
|
|
||||||
method protected void syncToServer();
|
|
||||||
field public static final java.lang.String NEW_VOICEMAIL_DATA = "extra_new_voicemail_data";
|
|
||||||
field public static final java.lang.String SYNC_EXTRA_CODE = "sync_extra_code";
|
|
||||||
field public static final int SYNC_EXTRA_MAILBOX_UPDATE = 2; // 0x2
|
|
||||||
field public static final int SYNC_EXTRA_NEW_VOICEMAIL = 1; // 0x1
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
package android.telephony {
|
package android.telephony {
|
||||||
|
|||||||
@@ -24,8 +24,10 @@ import android.content.ContentValues;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.CallLog.Calls;
|
import android.provider.CallLog.Calls;
|
||||||
|
import android.telecom.PhoneAccountHandle;
|
||||||
import android.telecom.Voicemail;
|
import android.telecom.Voicemail;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -428,5 +430,50 @@ public class VoicemailContract {
|
|||||||
return Status.CONTENT_URI.buildUpon()
|
return Status.CONTENT_URI.buildUpon()
|
||||||
.appendQueryParameter(PARAM_KEY_SOURCE_PACKAGE, packageName).build();
|
.appendQueryParameter(PARAM_KEY_SOURCE_PACKAGE, packageName).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper method to set the status of a voicemail source.
|
||||||
|
*
|
||||||
|
* @param context The context from the package calling the method. This will be the source.
|
||||||
|
* @param accountHandle The handle for the account the source is associated with.
|
||||||
|
* @param configurationState See {@link Status#CONFIGURATION_STATE}
|
||||||
|
* @param dataChannelState See {@link Status#DATA_CHANNEL_STATE}
|
||||||
|
* @param notificationChannelState See {@link Status#NOTIFICATION_CHANNEL_STATE}
|
||||||
|
*/
|
||||||
|
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().toString());
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,114 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2015 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@link Service} which runs the internal implementation of {@link AbstractThreadedSyncAdapter},
|
|
||||||
* syncing voicemails to and from a visual voicemail server.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.telecom;
|
|
||||||
|
|
||||||
import android.accounts.Account;
|
|
||||||
import android.app.Service;
|
|
||||||
import android.content.AbstractThreadedSyncAdapter;
|
|
||||||
import android.content.ContentProviderClient;
|
|
||||||
import android.content.ContentResolver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SyncResult;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.IBinder;
|
|
||||||
import android.provider.VoicemailContract;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A service to run the VvmSyncAdapter.
|
|
||||||
*/
|
|
||||||
public class VvmSyncService extends Service {
|
|
||||||
// Storage for an instance of the sync adapter
|
|
||||||
private static VvmSyncAdapter sSyncAdapter = null;
|
|
||||||
// Object to use as a thread-safe lock
|
|
||||||
private static final Object sSyncAdapterLock = new Object();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
synchronized (sSyncAdapterLock) {
|
|
||||||
if (sSyncAdapter == null) {
|
|
||||||
sSyncAdapter = new VvmSyncAdapter(getApplicationContext(), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IBinder onBind(Intent intent) {
|
|
||||||
return sSyncAdapter.getSyncAdapterBinder();
|
|
||||||
}
|
|
||||||
|
|
||||||
public class VvmSyncAdapter extends AbstractThreadedSyncAdapter {
|
|
||||||
/** The key to get the extra designating the type of sync action to perform. */
|
|
||||||
public final static String SYNC_EXTRA_CODE = "sync_extra_code";
|
|
||||||
/** The key to get the {@code Voicemail} object for a new voicemail. */
|
|
||||||
public final static String NEW_VOICEMAIL_DATA = "extra_new_voicemail_data";
|
|
||||||
/** Sync a new voicemail from the carrier to the device. */
|
|
||||||
public final static int SYNC_EXTRA_NEW_VOICEMAIL = 1;
|
|
||||||
/** Sync all voicemails because the mailbox was changed remotely. */
|
|
||||||
public final static int SYNC_EXTRA_MAILBOX_UPDATE = 2;
|
|
||||||
|
|
||||||
private final Context mContext;
|
|
||||||
|
|
||||||
public VvmSyncAdapter(Context context, boolean autoInitialize) {
|
|
||||||
super(context, autoInitialize);
|
|
||||||
mContext = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPerformSync(Account account, Bundle extras, String authority,
|
|
||||||
ContentProviderClient provider, SyncResult syncResult) {
|
|
||||||
if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, false)) {
|
|
||||||
// notify server that voicemail has been changed
|
|
||||||
syncToServer();
|
|
||||||
}
|
|
||||||
|
|
||||||
final int syncAction = extras.getInt(SYNC_EXTRA_CODE);
|
|
||||||
switch (syncAction) {
|
|
||||||
/** sync from carrier */
|
|
||||||
case SYNC_EXTRA_NEW_VOICEMAIL:
|
|
||||||
// Log new voicemail in voicemail provider.
|
|
||||||
Voicemail newVoicemail = extras.getParcelable(NEW_VOICEMAIL_DATA);
|
|
||||||
VoicemailContract.Voicemails.insert(mContext, newVoicemail);
|
|
||||||
break;
|
|
||||||
case SYNC_EXTRA_MAILBOX_UPDATE:
|
|
||||||
// Clear and reload all voicemails because the mailbox was updated remotely.
|
|
||||||
VoicemailContract.Voicemails.deleteAll(mContext);
|
|
||||||
List<Voicemail> voicemails = downloadVoicemails();
|
|
||||||
VoicemailContract.Voicemails.insert(mContext, voicemails);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Subclasses should implement this method to sync changes to server */
|
|
||||||
protected void syncToServer() { }
|
|
||||||
|
|
||||||
/** Subclasses should implement this method to download voicemails */
|
|
||||||
protected List<Voicemail> downloadVoicemails() {
|
|
||||||
return new ArrayList<Voicemail>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user