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

Commit 5964b556 authored by Etan Cohen's avatar Etan Cohen Committed by Gerrit Code Review
Browse files

Merge "Add Runnable mechanism to WakeupMessage"

parents b6c4bc31 1861ea9d
Loading
Loading
Loading
Loading
+24 −2
Original line number Diff line number Diff line
@@ -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();
        }
+18 −3
Original line number Diff line number Diff line
@@ -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();
    }

}