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

Commit 1861ea9d authored by Etan Cohen's avatar Etan Cohen
Browse files

Add Runnable mechanism to WakeupMessage

The WakeupMessage object provides a mechanism to create an Alarm
which will wake-up the device and deliver a message to a Handler.

Add a Runnable mechanism as an alternative to the message.

Bug: 67276378
Test: unit test
Change-Id: Icf5f03b2b25a340273f9d3fcd09f182216ea6238
parent fb7c0e8c
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();
    }

}