diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java | 170 |
1 files changed, 122 insertions, 48 deletions
diff --git a/src/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java b/src/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java index 8a41f4a..ecbec10 100644 --- a/src/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java +++ b/src/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java @@ -24,12 +24,14 @@ import android.net.ConnectivityManager; import android.os.Parcel; import android.os.Parcelable; import android.telephony.ServiceState; +import android.telephony.SubscriptionInfo; import com.android.messaging.Factory; import com.android.messaging.datamodel.BugleDatabaseOperations; import com.android.messaging.datamodel.DataModel; import com.android.messaging.datamodel.DatabaseHelper; import com.android.messaging.datamodel.DatabaseHelper.MessageColumns; +import com.android.messaging.datamodel.DatabaseHelper.ParticipantColumns; import com.android.messaging.datamodel.DatabaseWrapper; import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.datamodel.data.MessageData; @@ -45,6 +47,7 @@ import com.android.messaging.util.OsUtil; import com.android.messaging.util.PhoneUtils; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -218,13 +221,15 @@ public class ProcessPendingMessagesAction extends Action implements Parcelable { final DatabaseWrapper db = DataModel.get().getDatabase(); final long now = System.currentTimeMillis(); - final String toSendMessageId = findNextMessageToSend(db, now); - if (toSendMessageId != null) { - return true; - } else { - final String toDownloadMessageId = findNextMessageToDownload(db, now); - if (toDownloadMessageId != null) { + for (int subId : getActiveSubscriptionIds()) { + final String toSendMessageId = findNextMessageToSend(db, now, subId); + if (toSendMessageId != null) { return true; + } else { + final String toDownloadMessageId = findNextMessageToDownload(db, now, subId); + if (toDownloadMessageId != null) { + return true; + } } } // Messages may be in the process of sending/downloading even when there are no pending @@ -232,6 +237,21 @@ public class ProcessPendingMessagesAction extends Action implements Parcelable { return false; } + private static int[] getActiveSubscriptionIds() { + if (!OsUtil.isAtLeastL_MR1()) { + return new int[] { ParticipantData.DEFAULT_SELF_SUB_ID }; + } + List<SubscriptionInfo> subscriptions = PhoneUtils.getDefault().toLMr1() + .getActiveSubscriptionInfoList(); + + int numSubs = subscriptions.size(); + int[] result = new int[numSubs]; + for (int i = 0; i < numSubs; i++) { + result[i] = subscriptions.get(i).getSubscriptionId(); + } + return result; + } + /** * Queue any pending actions * @param actionState @@ -240,37 +260,44 @@ public class ProcessPendingMessagesAction extends Action implements Parcelable { private boolean queueActions(final Action processingAction) { final DatabaseWrapper db = DataModel.get().getDatabase(); final long now = System.currentTimeMillis(); - boolean succeeded = true; + boolean succeeded = false; - // Will queue no more than one message to send plus one message to download + // Will queue no more than one message per subscription to send plus one message to download // This keeps outgoing messages "in order" but allow downloads to happen even if sending // gets blocked until messages time out. Manual resend bumps messages to head of queue. - final String toSendMessageId = findNextMessageToSend(db, now); - final String toDownloadMessageId = findNextMessageToDownload(db, now); - if (toSendMessageId != null) { - LogUtil.i(TAG, "ProcessPendingMessagesAction: Queueing message " + toSendMessageId - + " for sending"); - // This could queue nothing - if (!SendMessageAction.queueForSendInBackground(toSendMessageId, processingAction)) { - LogUtil.w(TAG, "ProcessPendingMessagesAction: Failed to queue message " - + toSendMessageId + " for sending"); - succeeded = false; + for (int subId : getActiveSubscriptionIds()) { + final String toSendMessageId = findNextMessageToSend(db, now, subId); + final String toDownloadMessageId = findNextMessageToDownload(db, now, subId); + if (toSendMessageId != null) { + LogUtil.i(TAG, "ProcessPendingMessagesAction: Queueing message " + toSendMessageId + + " for sending"); + // This could queue nothing + if (!SendMessageAction.queueForSendInBackground(toSendMessageId, + processingAction)) { + LogUtil.w(TAG, "ProcessPendingMessagesAction: Failed to queue message " + + toSendMessageId + " for sending"); + } else { + succeeded = true; + } } - } - if (toDownloadMessageId != null) { - LogUtil.i(TAG, "ProcessPendingMessagesAction: Queueing message " + toDownloadMessageId - + " for download"); - // This could queue nothing - if (!DownloadMmsAction.queueMmsForDownloadInBackground(toDownloadMessageId, - processingAction)) { - LogUtil.w(TAG, "ProcessPendingMessagesAction: Failed to queue message " + if (toDownloadMessageId != null) { + LogUtil.i(TAG, "ProcessPendingMessagesAction: Queueing message " + toDownloadMessageId + " for download"); - succeeded = false; + // This could queue nothing + if (!DownloadMmsAction.queueMmsForDownloadInBackground(toDownloadMessageId, + processingAction)) { + LogUtil.w(TAG, "ProcessPendingMessagesAction: Failed to queue message " + + toDownloadMessageId + " for download"); + } else { + succeeded = true; + } + } - } - if (toSendMessageId == null && toDownloadMessageId == null) { - if (LogUtil.isLoggable(TAG, LogUtil.DEBUG)) { - LogUtil.d(TAG, "ProcessPendingMessagesAction: No messages to send or download"); + if (toSendMessageId == null && toDownloadMessageId == null) { + if (LogUtil.isLoggable(TAG, LogUtil.DEBUG)) { + LogUtil.d(TAG, "ProcessPendingMessagesAction: No messages to send or download"); + } + succeeded = true; } } return succeeded; @@ -293,7 +320,21 @@ public class ProcessPendingMessagesAction extends Action implements Parcelable { return null; } - private static String findNextMessageToSend(final DatabaseWrapper db, final long now) { + private static String prefixColumnWithTable(final String tableName, final String column) { + return tableName + "." + column; + } + + private static String[] prefixProjectionWithTable(final String tableName, + final String[] projection) { + String[] result = new String[projection.length]; + for (int i = 0; i < projection.length; i++) { + result[i] = prefixColumnWithTable(tableName, projection[i]); + } + return result; + } + + private static String findNextMessageToSend(final DatabaseWrapper db, final long now, + final int subId) { String toSendMessageId = null; db.beginTransaction(); Cursor sending = null; @@ -302,12 +343,25 @@ public class ProcessPendingMessagesAction extends Action implements Parcelable { int pendingCnt = 0; int failedCnt = 0; try { + String[] projection = prefixProjectionWithTable(DatabaseHelper.MESSAGES_TABLE, + MessageData.getProjection()); + String subIdClause = + prefixColumnWithTable(DatabaseHelper.MESSAGES_TABLE, + MessageColumns.SELF_PARTICIPANT_ID) + + " = " + + prefixColumnWithTable(DatabaseHelper.PARTICIPANTS_TABLE, + ParticipantColumns._ID) + + " AND " + ParticipantColumns.SUB_ID + " =?"; + // First check to see if we have any messages already sending - sending = db.query(DatabaseHelper.MESSAGES_TABLE, - MessageData.getProjection(), - DatabaseHelper.MessageColumns.STATUS + " IN (?, ?)", + sending = db.query(DatabaseHelper.MESSAGES_TABLE + "," + + DatabaseHelper.PARTICIPANTS_TABLE, + projection, + DatabaseHelper.MessageColumns.STATUS + " IN (?, ?)" + + " AND " + subIdClause, new String[]{Integer.toString(MessageData.BUGLE_STATUS_OUTGOING_SENDING), - Integer.toString(MessageData.BUGLE_STATUS_OUTGOING_RESENDING)}, + Integer.toString(MessageData.BUGLE_STATUS_OUTGOING_RESENDING), + Integer.toString(subId)}, null, null, DatabaseHelper.MessageColumns.RECEIVED_TIMESTAMP + " ASC"); @@ -317,12 +371,14 @@ public class ProcessPendingMessagesAction extends Action implements Parcelable { final ContentValues values = new ContentValues(); values.put(DatabaseHelper.MessageColumns.STATUS, MessageData.BUGLE_STATUS_OUTGOING_FAILED); - cursor = db.query(DatabaseHelper.MESSAGES_TABLE, - MessageData.getProjection(), + cursor = db.query(DatabaseHelper.MESSAGES_TABLE + "," + + DatabaseHelper.PARTICIPANTS_TABLE, + projection, DatabaseHelper.MessageColumns.STATUS + " IN (" + MessageData.BUGLE_STATUS_OUTGOING_YET_TO_SEND + "," - + MessageData.BUGLE_STATUS_OUTGOING_AWAITING_RETRY + ")", - null, + + MessageData.BUGLE_STATUS_OUTGOING_AWAITING_RETRY + ")" + + " AND " + subIdClause, + new String[]{Integer.toString(subId)}, null, null, DatabaseHelper.MessageColumns.RECEIVED_TIMESTAMP + " ASC"); @@ -388,31 +444,49 @@ public class ProcessPendingMessagesAction extends Action implements Parcelable { return toSendMessageId; } - private static String findNextMessageToDownload(final DatabaseWrapper db, final long now) { + private static String findNextMessageToDownload(final DatabaseWrapper db, final long now, + final int subId) { String toDownloadMessageId = null; db.beginTransaction(); Cursor cursor = null; int downloadingCnt = 0; int pendingCnt = 0; try { + String[] projection = prefixProjectionWithTable(DatabaseHelper.MESSAGES_TABLE, + MessageData.getProjection()); + String subIdClause = + prefixColumnWithTable(DatabaseHelper.MESSAGES_TABLE, + MessageColumns.SELF_PARTICIPANT_ID) + + " = " + + prefixColumnWithTable(DatabaseHelper.PARTICIPANTS_TABLE, + ParticipantColumns._ID) + + " AND " + ParticipantColumns.SUB_ID + " =?"; + // First check if we have any messages already downloading - downloadingCnt = (int) db.queryNumEntries(DatabaseHelper.MESSAGES_TABLE, - DatabaseHelper.MessageColumns.STATUS + " IN (?, ?)", + downloadingCnt = (int) db.queryNumEntries(DatabaseHelper.MESSAGES_TABLE + + "," + DatabaseHelper.PARTICIPANTS_TABLE, + DatabaseHelper.MessageColumns.STATUS + " IN (?, ?)" + + " AND " + subIdClause, new String[] { Integer.toString(MessageData.BUGLE_STATUS_INCOMING_AUTO_DOWNLOADING), - Integer.toString(MessageData.BUGLE_STATUS_INCOMING_MANUAL_DOWNLOADING) + Integer.toString(MessageData.BUGLE_STATUS_INCOMING_MANUAL_DOWNLOADING), + Integer.toString(subId) }); // TODO: This query is not actually needed if downloadingCnt == 0. - cursor = db.query(DatabaseHelper.MESSAGES_TABLE, - MessageData.getProjection(), + cursor = db.query(DatabaseHelper.MESSAGES_TABLE + "," + + DatabaseHelper.PARTICIPANTS_TABLE, + projection, DatabaseHelper.MessageColumns.STATUS + " =? OR " - + DatabaseHelper.MessageColumns.STATUS + " =?", + + DatabaseHelper.MessageColumns.STATUS + " =?" + + " AND " + subIdClause, new String[]{ Integer.toString( MessageData.BUGLE_STATUS_INCOMING_RETRYING_AUTO_DOWNLOAD), Integer.toString( - MessageData.BUGLE_STATUS_INCOMING_RETRYING_MANUAL_DOWNLOAD) + MessageData.BUGLE_STATUS_INCOMING_RETRYING_MANUAL_DOWNLOAD), + Integer.toString( + subId) }, null, null, |