Loading src/java/com/android/internal/telephony/InboundSmsHandler.java +1 −43 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.app.BroadcastOptions; import android.app.Notification; import android.app.Notification; import android.app.NotificationManager; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ComponentName; import android.content.ContentResolver; import android.content.ContentResolver; Loading Loading @@ -146,7 +145,7 @@ public abstract class InboundSmsHandler extends StateMachine { /** Sent on exit from {@link WaitingState} to return to idle after sending all broadcasts. */ /** Sent on exit from {@link WaitingState} to return to idle after sending all broadcasts. */ private static final int EVENT_RETURN_TO_IDLE = 4; private static final int EVENT_RETURN_TO_IDLE = 4; /** Release wakelock after {@link mWakeLockTimeout} when returning to idle state. */ /** Release wakelock after {@link #mWakeLockTimeout} when returning to idle state. */ private static final int EVENT_RELEASE_WAKELOCK = 5; private static final int EVENT_RELEASE_WAKELOCK = 5; /** Sent by {@link SmsBroadcastUndelivered} after cleaning the raw table. */ /** Sent by {@link SmsBroadcastUndelivered} after cleaning the raw table. */ Loading @@ -158,17 +157,6 @@ public abstract class InboundSmsHandler extends StateMachine { /** New SMS received as an AsyncResult. */ /** New SMS received as an AsyncResult. */ public static final int EVENT_INJECT_SMS = 8; public static final int EVENT_INJECT_SMS = 8; /** Update tracker object; used only in waiting state */ private static final int EVENT_UPDATE_TRACKER = 9; /** Timeout in case state machine is stuck in a state for too long; used only in waiting * state */ private static final int EVENT_STATE_TIMEOUT = 10; /** Timeout duration for EVENT_STATE_TIMEOUT (5 minutes) */ @VisibleForTesting public static final int STATE_TIMEOUT = 5 * 60 * 1000; /** Wakelock release delay when returning to idle state. */ /** Wakelock release delay when returning to idle state. */ private static final int WAKELOCK_TIMEOUT = 3000; private static final int WAKELOCK_TIMEOUT = 3000; Loading Loading @@ -461,7 +449,6 @@ public abstract class InboundSmsHandler extends StateMachine { // if any broadcasts were sent, transition to waiting state // if any broadcasts were sent, transition to waiting state InboundSmsTracker inboundSmsTracker = (InboundSmsTracker) msg.obj; InboundSmsTracker inboundSmsTracker = (InboundSmsTracker) msg.obj; if (processMessagePart(inboundSmsTracker)) { if (processMessagePart(inboundSmsTracker)) { sendMessage(EVENT_UPDATE_TRACKER, inboundSmsTracker); transitionTo(mWaitingState); transitionTo(mWaitingState); } else { } else { // if event is sent from SmsBroadcastUndelivered.broadcastSms(), and // if event is sent from SmsBroadcastUndelivered.broadcastSms(), and Loading Loading @@ -505,13 +492,10 @@ public abstract class InboundSmsHandler extends StateMachine { * {@link IdleState} after any deferred {@link #EVENT_BROADCAST_SMS} messages are handled. * {@link IdleState} after any deferred {@link #EVENT_BROADCAST_SMS} messages are handled. */ */ private class WaitingState extends State { private class WaitingState extends State { private InboundSmsTracker mTracker; @Override @Override public void enter() { public void enter() { if (DBG) log("entering Waiting state"); if (DBG) log("entering Waiting state"); mTracker = null; sendMessageDelayed(EVENT_STATE_TIMEOUT, STATE_TIMEOUT); } } @Override @Override Loading @@ -520,26 +504,12 @@ public abstract class InboundSmsHandler extends StateMachine { // Before moving to idle state, set wakelock timeout to WAKE_LOCK_TIMEOUT milliseconds // Before moving to idle state, set wakelock timeout to WAKE_LOCK_TIMEOUT milliseconds // to give any receivers time to take their own wake locks // to give any receivers time to take their own wake locks setWakeLockTimeout(WAKELOCK_TIMEOUT); setWakeLockTimeout(WAKELOCK_TIMEOUT); if (VDBG) { if (hasMessages(EVENT_STATE_TIMEOUT)) { log("exiting Waiting state: removing EVENT_STATE_TIMEOUT from message queue"); } if (hasMessages(EVENT_UPDATE_TRACKER)) { log("exiting Waiting state: removing EVENT_UPDATE_TRACKER from message queue"); } } removeMessages(EVENT_STATE_TIMEOUT); removeMessages(EVENT_UPDATE_TRACKER); } } @Override @Override public boolean processMessage(Message msg) { public boolean processMessage(Message msg) { log("WaitingState.processMessage:" + msg.what); log("WaitingState.processMessage:" + msg.what); switch (msg.what) { switch (msg.what) { case EVENT_UPDATE_TRACKER: mTracker = (InboundSmsTracker) msg.obj; return HANDLED; case EVENT_BROADCAST_SMS: case EVENT_BROADCAST_SMS: // defer until the current broadcast completes // defer until the current broadcast completes deferMessage(msg); deferMessage(msg); Loading @@ -555,18 +525,6 @@ public abstract class InboundSmsHandler extends StateMachine { // not ready to return to idle; ignore // not ready to return to idle; ignore return HANDLED; return HANDLED; case EVENT_STATE_TIMEOUT: // stuck in WaitingState for too long; drop the message and exit this state if (mTracker != null) { log("WaitingState.processMessage: EVENT_STATE_TIMEOUT; dropping message"); dropSms(new SmsBroadcastReceiver(mTracker)); } else { log("WaitingState.processMessage: EVENT_STATE_TIMEOUT; mTracker is null " + "- sending EVENT_BROADCAST_COMPLETE"); sendMessage(EVENT_BROADCAST_COMPLETE); } return HANDLED; default: default: // parent state handles the other message types // parent state handles the other message types return NOT_HANDLED; return NOT_HANDLED; Loading tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java +0 −25 Original line number Original line Diff line number Diff line Loading @@ -47,7 +47,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.UserManager; import android.provider.Telephony; import android.provider.Telephony; import android.support.test.filters.FlakyTest; import android.support.test.filters.FlakyTest; import android.support.test.filters.LargeTest; import android.support.test.filters.MediumTest; import android.support.test.filters.MediumTest; import android.test.mock.MockContentResolver; import android.test.mock.MockContentResolver; Loading Loading @@ -782,28 +781,4 @@ public class GsmInboundSmsHandlerTest extends TelephonyTest { verifySmsIntentBroadcasts(0); verifySmsIntentBroadcasts(0); } } @FlakyTest @Ignore @Test @LargeTest public void testWaitingStateTimeout() throws Exception { transitionFromStartupToIdle(); // send new SMS to state machine and verify that triggers SMS_DELIVER_ACTION mGsmInboundSmsHandler.sendMessage(InboundSmsHandler.EVENT_NEW_SMS, new AsyncResult(null, mSmsMessage, null)); waitForMs(100); ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mContext, times(1)).sendBroadcast( intentArgumentCaptor.capture()); assertEquals(Telephony.Sms.Intents.SMS_DELIVER_ACTION, intentArgumentCaptor.getAllValues().get(0).getAction()); assertEquals("WaitingState", getCurrentState().getName()); waitForMs(InboundSmsHandler.STATE_TIMEOUT + 300); assertEquals("IdleState", getCurrentState().getName()); } } } Loading
src/java/com/android/internal/telephony/InboundSmsHandler.java +1 −43 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.app.BroadcastOptions; import android.app.Notification; import android.app.Notification; import android.app.NotificationManager; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ComponentName; import android.content.ContentResolver; import android.content.ContentResolver; Loading Loading @@ -146,7 +145,7 @@ public abstract class InboundSmsHandler extends StateMachine { /** Sent on exit from {@link WaitingState} to return to idle after sending all broadcasts. */ /** Sent on exit from {@link WaitingState} to return to idle after sending all broadcasts. */ private static final int EVENT_RETURN_TO_IDLE = 4; private static final int EVENT_RETURN_TO_IDLE = 4; /** Release wakelock after {@link mWakeLockTimeout} when returning to idle state. */ /** Release wakelock after {@link #mWakeLockTimeout} when returning to idle state. */ private static final int EVENT_RELEASE_WAKELOCK = 5; private static final int EVENT_RELEASE_WAKELOCK = 5; /** Sent by {@link SmsBroadcastUndelivered} after cleaning the raw table. */ /** Sent by {@link SmsBroadcastUndelivered} after cleaning the raw table. */ Loading @@ -158,17 +157,6 @@ public abstract class InboundSmsHandler extends StateMachine { /** New SMS received as an AsyncResult. */ /** New SMS received as an AsyncResult. */ public static final int EVENT_INJECT_SMS = 8; public static final int EVENT_INJECT_SMS = 8; /** Update tracker object; used only in waiting state */ private static final int EVENT_UPDATE_TRACKER = 9; /** Timeout in case state machine is stuck in a state for too long; used only in waiting * state */ private static final int EVENT_STATE_TIMEOUT = 10; /** Timeout duration for EVENT_STATE_TIMEOUT (5 minutes) */ @VisibleForTesting public static final int STATE_TIMEOUT = 5 * 60 * 1000; /** Wakelock release delay when returning to idle state. */ /** Wakelock release delay when returning to idle state. */ private static final int WAKELOCK_TIMEOUT = 3000; private static final int WAKELOCK_TIMEOUT = 3000; Loading Loading @@ -461,7 +449,6 @@ public abstract class InboundSmsHandler extends StateMachine { // if any broadcasts were sent, transition to waiting state // if any broadcasts were sent, transition to waiting state InboundSmsTracker inboundSmsTracker = (InboundSmsTracker) msg.obj; InboundSmsTracker inboundSmsTracker = (InboundSmsTracker) msg.obj; if (processMessagePart(inboundSmsTracker)) { if (processMessagePart(inboundSmsTracker)) { sendMessage(EVENT_UPDATE_TRACKER, inboundSmsTracker); transitionTo(mWaitingState); transitionTo(mWaitingState); } else { } else { // if event is sent from SmsBroadcastUndelivered.broadcastSms(), and // if event is sent from SmsBroadcastUndelivered.broadcastSms(), and Loading Loading @@ -505,13 +492,10 @@ public abstract class InboundSmsHandler extends StateMachine { * {@link IdleState} after any deferred {@link #EVENT_BROADCAST_SMS} messages are handled. * {@link IdleState} after any deferred {@link #EVENT_BROADCAST_SMS} messages are handled. */ */ private class WaitingState extends State { private class WaitingState extends State { private InboundSmsTracker mTracker; @Override @Override public void enter() { public void enter() { if (DBG) log("entering Waiting state"); if (DBG) log("entering Waiting state"); mTracker = null; sendMessageDelayed(EVENT_STATE_TIMEOUT, STATE_TIMEOUT); } } @Override @Override Loading @@ -520,26 +504,12 @@ public abstract class InboundSmsHandler extends StateMachine { // Before moving to idle state, set wakelock timeout to WAKE_LOCK_TIMEOUT milliseconds // Before moving to idle state, set wakelock timeout to WAKE_LOCK_TIMEOUT milliseconds // to give any receivers time to take their own wake locks // to give any receivers time to take their own wake locks setWakeLockTimeout(WAKELOCK_TIMEOUT); setWakeLockTimeout(WAKELOCK_TIMEOUT); if (VDBG) { if (hasMessages(EVENT_STATE_TIMEOUT)) { log("exiting Waiting state: removing EVENT_STATE_TIMEOUT from message queue"); } if (hasMessages(EVENT_UPDATE_TRACKER)) { log("exiting Waiting state: removing EVENT_UPDATE_TRACKER from message queue"); } } removeMessages(EVENT_STATE_TIMEOUT); removeMessages(EVENT_UPDATE_TRACKER); } } @Override @Override public boolean processMessage(Message msg) { public boolean processMessage(Message msg) { log("WaitingState.processMessage:" + msg.what); log("WaitingState.processMessage:" + msg.what); switch (msg.what) { switch (msg.what) { case EVENT_UPDATE_TRACKER: mTracker = (InboundSmsTracker) msg.obj; return HANDLED; case EVENT_BROADCAST_SMS: case EVENT_BROADCAST_SMS: // defer until the current broadcast completes // defer until the current broadcast completes deferMessage(msg); deferMessage(msg); Loading @@ -555,18 +525,6 @@ public abstract class InboundSmsHandler extends StateMachine { // not ready to return to idle; ignore // not ready to return to idle; ignore return HANDLED; return HANDLED; case EVENT_STATE_TIMEOUT: // stuck in WaitingState for too long; drop the message and exit this state if (mTracker != null) { log("WaitingState.processMessage: EVENT_STATE_TIMEOUT; dropping message"); dropSms(new SmsBroadcastReceiver(mTracker)); } else { log("WaitingState.processMessage: EVENT_STATE_TIMEOUT; mTracker is null " + "- sending EVENT_BROADCAST_COMPLETE"); sendMessage(EVENT_BROADCAST_COMPLETE); } return HANDLED; default: default: // parent state handles the other message types // parent state handles the other message types return NOT_HANDLED; return NOT_HANDLED; Loading
tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java +0 −25 Original line number Original line Diff line number Diff line Loading @@ -47,7 +47,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.UserManager; import android.provider.Telephony; import android.provider.Telephony; import android.support.test.filters.FlakyTest; import android.support.test.filters.FlakyTest; import android.support.test.filters.LargeTest; import android.support.test.filters.MediumTest; import android.support.test.filters.MediumTest; import android.test.mock.MockContentResolver; import android.test.mock.MockContentResolver; Loading Loading @@ -782,28 +781,4 @@ public class GsmInboundSmsHandlerTest extends TelephonyTest { verifySmsIntentBroadcasts(0); verifySmsIntentBroadcasts(0); } } @FlakyTest @Ignore @Test @LargeTest public void testWaitingStateTimeout() throws Exception { transitionFromStartupToIdle(); // send new SMS to state machine and verify that triggers SMS_DELIVER_ACTION mGsmInboundSmsHandler.sendMessage(InboundSmsHandler.EVENT_NEW_SMS, new AsyncResult(null, mSmsMessage, null)); waitForMs(100); ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mContext, times(1)).sendBroadcast( intentArgumentCaptor.capture()); assertEquals(Telephony.Sms.Intents.SMS_DELIVER_ACTION, intentArgumentCaptor.getAllValues().get(0).getAction()); assertEquals("WaitingState", getCurrentState().getName()); waitForMs(InboundSmsHandler.STATE_TIMEOUT + 300); assertEquals("IdleState", getCurrentState().getName()); } } }