Merge "Add Runnable mechanism to WakeupMessage"

This commit is contained in:
Etan Cohen
2017-10-21 02:04:50 +00:00
committed by Gerrit Code Review
2 changed files with 42 additions and 5 deletions

View File

@@ -47,17 +47,19 @@ public class WakeupMessage implements AlarmManager.OnAlarmListener {
protected final int mCmd, mArg1, mArg2;
@VisibleForTesting
protected final Object mObj;
private final Runnable mRunnable;
private boolean mScheduled;
public WakeupMessage(Context context, Handler handler,
String cmdName, int cmd, int arg1, int arg2, Object obj) {
mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mAlarmManager = getAlarmManager(context);
mHandler = handler;
mCmdName = cmdName;
mCmd = cmd;
mArg1 = arg1;
mArg2 = arg2;
mObj = obj;
mRunnable = null;
}
public WakeupMessage(Context context, Handler handler, String cmdName, int cmd, int arg1) {
@@ -73,6 +75,21 @@ public class WakeupMessage implements AlarmManager.OnAlarmListener {
this(context, handler, cmdName, cmd, 0, 0, null);
}
public WakeupMessage(Context context, Handler handler, String cmdName, Runnable runnable) {
mAlarmManager = getAlarmManager(context);
mHandler = handler;
mCmdName = cmdName;
mCmd = 0;
mArg1 = 0;
mArg2 = 0;
mObj = null;
mRunnable = runnable;
}
private static AlarmManager getAlarmManager(Context context) {
return (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
}
/**
* Schedule the message to be delivered at the time in milliseconds of the
* {@link android.os.SystemClock#elapsedRealtime SystemClock.elapsedRealtime()} clock and wakeup
@@ -107,7 +124,12 @@ public class WakeupMessage implements AlarmManager.OnAlarmListener {
mScheduled = false;
}
if (stillScheduled) {
Message msg = mHandler.obtainMessage(mCmd, mArg1, mArg2, mObj);
Message msg;
if (mRunnable == null) {
msg = mHandler.obtainMessage(mCmd, mArg1, mArg2, mObj);
} else {
msg = Message.obtain(mHandler, mRunnable);
}
mHandler.dispatchMessage(msg);
msg.recycle();
}

View File

@@ -47,6 +47,7 @@ public class WakeupMessageTest {
private static final int TEST_ARG2 = 182;
private static final Object TEST_OBJ = "hello";
@Mock Context mContext;
@Mock AlarmManager mAlarmManager;
WakeupMessage mMessage;
// Make a spy so that we can verify calls to it
@@ -86,13 +87,12 @@ public class WakeupMessageTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
Context context = mock(Context.class);
when(context.getSystemService(Context.ALARM_SERVICE)).thenReturn(mAlarmManager);
when(mContext.getSystemService(Context.ALARM_SERVICE)).thenReturn(mAlarmManager);
// capture the listener for each AlarmManager.setExact call
doNothing().when(mAlarmManager).setExact(anyInt(), anyLong(), any(String.class),
mListenerCaptor.capture(), any(Handler.class));
mMessage = new WakeupMessage(context, mHandler, TEST_CMD_NAME, TEST_CMD, TEST_ARG1,
mMessage = new WakeupMessage(mContext, mHandler, TEST_CMD_NAME, TEST_CMD, TEST_ARG1,
TEST_ARG2, TEST_OBJ);
}
@@ -168,4 +168,19 @@ public class WakeupMessageTest {
verifyMessageDispatchedOnce();
}
/**
* Verify that a Runnable is scheduled and dispatched.
*/
@Test
public void scheduleRunnable() {
final long when = 1011;
final Runnable runnable = mock(Runnable.class);
WakeupMessage dut = new WakeupMessage(mContext, mHandler, TEST_CMD_NAME, runnable);
dut.schedule(when);
verify(mAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME_WAKEUP), eq(when),
eq(TEST_CMD_NAME), any(AlarmManager.OnAlarmListener.class), eq(mHandler));
mListenerCaptor.getValue().onAlarm();
verify(runnable, times(1)).run();
}
}