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

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

Merge "Get a message reference from SMS-STATUS-REPORT PDU for IMS"

parents f9f3936c 561e927c
Loading
Loading
Loading
Loading
+20 −4
Original line number Diff line number Diff line
@@ -151,12 +151,28 @@ public class ImsSmsDispatcher extends SMSDispatcher {
        }

        @Override
        public void onSmsStatusReportReceived(int token, int messageRef, String format, byte[] pdu)
        public void onSmsStatusReportReceived(int token, String format, byte[] pdu)
                throws RemoteException {
            Rlog.d(TAG, "Status report received.");
            SmsTracker tracker = mTrackers.get(token);
            android.telephony.SmsMessage message =
                    android.telephony.SmsMessage.createFromPdu(pdu, format);
            if (message == null || message.mWrappedSmsMessage == null) {
                throw new RemoteException(
                        "Status report received with a PDU that could not be parsed.");
            }
            int messageRef = message.mWrappedSmsMessage.mMessageRef;
            SmsTracker tracker = null;
            int key = 0;
            for (Map.Entry<Integer, SmsTracker> entry : mTrackers.entrySet()) {
                if (messageRef == ((SmsTracker) entry.getValue()).mMessageRef) {
                    tracker = entry.getValue();
                    key = entry.getKey();
                    break;
                }
            }

            if (tracker == null) {
                throw new RemoteException("Invalid token.");
                throw new RemoteException("No tracker for messageRef " + messageRef);
            }
            Pair<Boolean, Boolean> result = mSmsDispatchersController.handleSmsStatusReport(
                    tracker, format, pdu);
@@ -173,7 +189,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                        + e.getMessage());
            }
            if (result.second) {
                mTrackers.remove(token);
                mTrackers.remove(key);
            }
        }

+41 −0
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@ import android.os.Looper;
import android.telephony.SmsMessage;
import android.telephony.ims.stub.ImsSmsImplBase;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Pair;

import com.android.internal.util.HexDump;

import org.junit.After;
import org.junit.Before;
@@ -137,6 +140,44 @@ public class ImsSmsDispatcherTest extends TelephonyTest {
        assertEquals(0x04, (pdu[0] & 0x04));
    }

    /**
     * Ensure that when a GSM status report is received, it calls acknowledgeSmsReport with correct
     * token and message reference.
     */
    @Test
    @SmallTest
    public void testReceiveGsmSmsStatusReport() throws Exception {
        int sentSmsToken = mImsSmsDispatcher.mNextToken.get();
        int statusReportToken = 456; // Generated by IMS providers
        int messageRef = 123; // TP-MR for sent SMS
        int trackersSize = mImsSmsDispatcher.mTrackers.size();
        // PDU for SMS-STATUS-REPORT
        byte[] pdu = HexDump.hexStringToByteArray("0006000681214365919061800000639190618000006300");

        // Set TP-MR
        pdu[2] = (byte) messageRef;
        mSmsTracker.mMessageRef = messageRef;

        mImsSmsDispatcher.mTrackers.put(sentSmsToken, mSmsTracker);
        when(mPhone.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_GSM);
        when(mSmsDispatchersController.handleSmsStatusReport(
                    eq(mSmsTracker), eq(SmsMessage.FORMAT_3GPP), eq(pdu)))
                .thenReturn(new Pair(true, true));

        // Receive the status report
        mImsSmsDispatcher
                .getSmsListener()
                .onSmsStatusReportReceived(statusReportToken, SmsMessage.FORMAT_3GPP, pdu);

        // Ensure it calls acknowledgeSmsReport with correct token and message reference
        verify(mImsManager)
                .acknowledgeSmsReport(
                        eq(statusReportToken),
                        eq(messageRef),
                        eq(ImsSmsImplBase.STATUS_REPORT_STATUS_OK));
        assertEquals(trackersSize, mImsSmsDispatcher.mTrackers.size());
    }

    @After
    public void tearDown() throws Exception {
        mImsSmsDispatcher = null;