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

Commit c12a8744 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Handle a status report over CS even if SMS was sent over IMS"

parents e3da1fb3 3b307f71
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;

/**
 *
@@ -747,6 +748,30 @@ public class SmsDispatchersController extends Handler {
        return mUsageMonitor;
    }

    /**
     * Handles the sms status report for the sent sms through ImsSmsDispatcher. Carriers can send
     * the report over CS even if the previously submitted SMS-SUBMIT was sent over IMS. For this
     * case, finds a corresponding tracker from the tracker map in ImsSmsDispatcher and handles it.
     *
     * @param messageRef the TP-MR of the previously submitted SMS-SUBMIT in the report.
     * @param format the format.
     * @param pdu the pdu of the report.
     */
    public void handleSentOverImsStatusReport(int messageRef, String format, byte[] pdu) {
        for (Entry<Integer, SMSDispatcher.SmsTracker> entry :
                mImsSmsDispatcher.mTrackers.entrySet()) {
            int token = entry.getKey();
            SMSDispatcher.SmsTracker tracker = entry.getValue();
            if (tracker.mMessageRef == messageRef) {
                Pair<Boolean, Boolean> result = handleSmsStatusReport(tracker, format, pdu);
                if (result.second) {
                    mImsSmsDispatcher.mTrackers.remove(token);
                }
                return;
            }
        }
    }

    /**
     * Triggers the correct method for handling the sms status report based on the format.
     *
+11 −4
Original line number Diff line number Diff line
@@ -102,18 +102,25 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
     */
    @UnsupportedAppUsage
    private void handleCdmaStatusReport(SmsMessage sms) {
        byte[] pdu = sms.getPdu();
        int messageRef = sms.mMessageRef;
        boolean handled = false;
        for (int i = 0, count = deliveryPendingList.size(); i < count; i++) {
            SmsTracker tracker = deliveryPendingList.get(i);
            if (tracker.mMessageRef == sms.mMessageRef) {
            if (tracker.mMessageRef == messageRef) {
                Pair<Boolean, Boolean> result =
                        mSmsDispatchersController.handleSmsStatusReport(tracker, getFormat(),
                                sms.getPdu());
                        mSmsDispatchersController.handleSmsStatusReport(tracker, getFormat(), pdu);
                if (result.second) {
                    deliveryPendingList.remove(i);
                }
                handled = true;
                break; // Only expect to see one tracker matching this message.
            }
        }
        if (!handled) {
            // Try to find the sent SMS from the map in ImsSmsDispatcher.
            mSmsDispatchersController.handleSentOverImsStatusReport(messageRef, getFormat(), pdu);
        }
    }

    /** {@inheritDoc} */
+8 −2
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
    private void handleStatusReport(AsyncResult ar) {
        byte[] pdu = (byte[]) ar.result;
        SmsMessage sms = SmsMessage.newFromCDS(pdu);
        boolean handled = false;

        if (sms != null) {
            int messageRef = sms.mMessageRef;
@@ -151,9 +152,14 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
                    if (result.second) {
                        deliveryPendingList.remove(i);
                    }
                    // Only expect to see one tracker matching this messageref
                    break;
                    handled = true;
                    break; // Only expect to see one tracker matching this messageref
                }
            }
            if (!handled) {
                // Try to find the sent SMS from the map in ImsSmsDispatcher.
                mSmsDispatchersController.handleSentOverImsStatusReport(
                        messageRef, getFormat(), pdu);
            }
        }
        mCi.acknowledgeLastIncomingGsmSms(true, Intents.RESULT_SMS_HANDLED, null);