Loading src/java/com/android/internal/telephony/ImsSmsDispatcher.java +20 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -173,7 +189,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { + e.getMessage()); } if (result.second) { mTrackers.remove(token); mTrackers.remove(key); } } Loading tests/telephonytests/src/com/android/internal/telephony/ImsSmsDispatcherTest.java +41 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading
src/java/com/android/internal/telephony/ImsSmsDispatcher.java +20 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -173,7 +189,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { + e.getMessage()); } if (result.second) { mTrackers.remove(token); mTrackers.remove(key); } } Loading
tests/telephonytests/src/com/android/internal/telephony/ImsSmsDispatcherTest.java +41 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading