Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44ae58ae authored by Moez Bhatti's avatar Moez Bhatti
Browse files

Resend failed messages when exiting airplane mode

parent a638ba7f
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -62,11 +62,10 @@ public class Conversation {
            Threads.READ
    };

    private static final String UNREAD_SELECTION = "(read=0 OR seen=0)";
    public static final String UNREAD_SELECTION = "(read=0 OR seen=0)";
    public static final String FAILED_SELECTION = "error != 0";

    private static final String[] SEEN_PROJECTION = new String[]{
            "seen"
    };
    public static final String[] SEEN_PROJECTION = new String[]{"seen"};

    public static final int ID = 0;
    public static final int DATE = 1;
+34 −9
Original line number Diff line number Diff line
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) {
        Cursor cursor = context.getContentResolver().query(
                SmsHelper.MMS_SMS_CONTENT_PROVIDER,
                MessageColumns.PROJECTION,
                SmsHelper.FAILED_SELECTION,
                null, SmsHelper.sortDateDesc
        // 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
        );

        if (cursor.moveToFirst()) {
        // 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);
            for (int i = 0; i < cursor.getCount(); i++) {
            while (cursor.moveToNext()) {
                try {
                    MessageItem message = new MessageItem(context, cursor.getString(columnsMap.mColumnMsgType), cursor, columnsMap, null, true);
                    MessageItem message = new MessageItem(context, cursor.getString(columnsMap.mColumnMsgType),
                            cursor, columnsMap, null, true);
                    sendSms(context, message);
                } catch (MmsException e) {
                    e.printStackTrace();
                }
            }
            cursor.close();
        }

        cursor.close();
        conversationCursor.close();
    }

    private void sendSms(Context context, MessageItem messageItem) {
@@ -43,6 +66,8 @@ public class AirplaneModeReceiver extends BroadcastReceiver {
        Message message = new Message(messageItem.mBody, messageItem.mAddress);
        message.setType(Message.TYPE_SMSMMS);

        context.getContentResolver().delete(messageItem.mMessageUri, null, null);

        sendTransaction.sendNewMessage(message, 0);
    }
}