package com.moez.QKSMS.receiver; import android.content.BroadcastReceiver; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import com.google.android.mms.MmsException; import com.moez.QKSMS.data.Conversation; import com.moez.QKSMS.mmssms.Message; import com.moez.QKSMS.mmssms.Transaction; import com.moez.QKSMS.transaction.SmsHelper; import com.moez.QKSMS.ui.messagelist.MessageColumns; import com.moez.QKSMS.ui.messagelist.MessageItem; /** * Listen for changes to the Airplane Mode status, so that we can attempt to re-send failed messages * once we have signal */ public class AirplaneModeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // If we're going into airplane mode, no need to do anything if (intent.getBooleanExtra("state", true)) { return; } // Cursor to find the conversations that contain failed messages Cursor conversationCursor = context.getContentResolver().query( SmsHelper.CONVERSATIONS_CONTENT_PROVIDER, Conversation.ALL_THREADS_PROJECTION, Conversation.FAILED_SELECTION, null, SmsHelper.sortDateDesc ); // Loop through each of the conversations while (conversationCursor.moveToNext()) { Uri uri = ContentUris.withAppendedId(SmsHelper.MMS_SMS_CONTENT_PROVIDER, conversationCursor.getLong(Conversation.ID)); // Find the failed messages within the conversation Cursor cursor = context.getContentResolver().query(uri, MessageColumns.PROJECTION, SmsHelper.FAILED_SELECTION, null, SmsHelper.sortDateAsc); // Map the cursor row to a MessageItem, then re-send it MessageColumns.ColumnsMap columnsMap = new MessageColumns.ColumnsMap(cursor); while (cursor.moveToNext()) { try { MessageItem message = new MessageItem(context, cursor.getString(columnsMap.mColumnMsgType), cursor, columnsMap, null, true); sendSms(context, message); } catch (MmsException e) { e.printStackTrace(); } } cursor.close(); } conversationCursor.close(); } private void sendSms(Context context, MessageItem messageItem) { Transaction sendTransaction = new Transaction(context, SmsHelper.getSendSettings(context)); Message message = new Message(messageItem.mBody, messageItem.mAddress); message.setType(Message.TYPE_SMSMMS); context.getContentResolver().delete(messageItem.mMessageUri, null, null); sendTransaction.sendNewMessage(message, 0); } }