/** * Check all registered triggers to see if their respective conditions are met. For every trigger whose condition is * true, perform the associated action. * * @param tpf * time per frame in seconds */ @MainThread public synchronized void checkTriggers(final double tpf) { for (final InputSource is : _inputs) { is.physicalLayer.readState(); final List<InputState> newStates = is.physicalLayer.drainAvailableStates(); if (newStates.isEmpty()) { _applier.checkAndPerformTriggers(_triggers, is.source, new TwoInputStates(is.lastState, is.lastState), tpf); } else { // used to spread tpf evenly among triggered actions final double time = newStates.size() > 1 ? tpf / newStates.size() : tpf; for (final InputState inputState : newStates) { // no trigger is valid in the LOST_FOCUS state, so don't bother checking them if (inputState != InputState.LOST_FOCUS) { _applier.checkAndPerformTriggers(_triggers, is.source, new TwoInputStates(is.lastState, inputState), time); } is.lastState = inputState; } } } }
init(); readKeyboardState(); readMouseState(); readControllerState(); readGestureState(); lostFocus();
@Test public void testTooManyChanges1() throws Exception { final PeekingIterator<KeyEvent> iter = new NeverEndingKeyIterator(); keyboardWrapper.init(); mouseWrapper.init(); controllerWrapper.init(); gestureWrapper.init(); focusWrapper.init(); expect(keyboardWrapper.getEvents()).andReturn(iter).atLeastOnce(); expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).atLeastOnce(); expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).atLeastOnce(); expect(gestureWrapper.getEvents()).andReturn(Iterators.peekingIterator(noGestures.iterator())).atLeastOnce(); expect(focusWrapper.getAndClearFocusLost()).andReturn(false).atLeastOnce(); replay(mocks); pl.readState(); }
@Before public void setup() throws Exception { keyboardWrapper = createMock("KeyboardWrapper", KeyboardWrapper.class); mouseWrapper = createMock("MouseWrapper", MouseWrapper.class); controllerWrapper = createMock("ControllerWrapper", ControllerWrapper.class); gestureWrapper = createMock("GestureWrapper", GestureWrapper.class); focusWrapper = createMock("FocusWrapper", FocusWrapper.class); pl = new PhysicalLayer(keyboardWrapper, mouseWrapper, controllerWrapper, gestureWrapper, focusWrapper); mocks = new Object[] { keyboardWrapper, mouseWrapper, controllerWrapper, gestureWrapper, focusWrapper }; Adown.add(new KeyEvent(Key.A, KeyState.DOWN, 'a')); AdownBdown.add(new KeyEvent(Key.A, KeyState.DOWN, 'a')); AdownBdown.add(new KeyEvent(Key.B, KeyState.DOWN, 'b')); AdownAup.add(new KeyEvent(Key.A, KeyState.DOWN, 'a')); AdownAup.add(new KeyEvent(Key.A, KeyState.UP, 'a')); buttonDown.add(new MouseState(0, 0, 0, 0, 0, MouseButton.makeMap(ButtonState.DOWN, ButtonState.UP, ButtonState.UP), null)); }
@Test public void testTooManyChanges2() throws Exception { final PeekingIterator<MouseState> iter = new NeverEndingMouseIterator(); keyboardWrapper.init(); mouseWrapper.init(); controllerWrapper.init(); gestureWrapper.init(); focusWrapper.init(); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())).atLeastOnce(); expect(mouseWrapper.getEvents()).andReturn(iter).atLeastOnce(); expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).atLeastOnce(); expect(gestureWrapper.getEvents()).andReturn(Iterators.peekingIterator(noGestures.iterator())).atLeastOnce(); expect(focusWrapper.getAndClearFocusLost()).andReturn(false).atLeastOnce(); replay(mocks); pl.readState(); }
/** * Check all registered triggers to see if their respective conditions are met. For every trigger whose condition is * true, perform the associated action. * * @param tpf * time per frame in seconds */ @MainThread public synchronized void checkTriggers(final double tpf) { for (final InputSource is : _inputs) { is.physicalLayer.readState(); final List<InputState> newStates = is.physicalLayer.drainAvailableStates(); if (newStates.isEmpty()) { _applier.checkAndPerformTriggers(_triggers, is.source, new TwoInputStates(is.lastState, is.lastState), tpf); } else { // used to spread tpf evenly among triggered actions final double time = newStates.size() > 1 ? tpf / newStates.size() : tpf; for (final InputState inputState : newStates) { // no trigger is valid in the LOST_FOCUS state, so don't bother checking them if (inputState != InputState.LOST_FOCUS) { _applier.checkAndPerformTriggers(_triggers, is.source, new TwoInputStates(is.lastState, inputState), time); } is.lastState = inputState; } } } }
init(); readKeyboardState(); readMouseState(); readControllerState(); lostFocus();
@Test public void testTriggers1() throws Exception { final InputState state1 = new InputState(ks, ms, cs, gs); final InputState state2 = new InputState(ks, ms, cs, gs); final double tpf = 14; final LinkedList<InputState> states1 = new LinkedList<InputState>(); final LinkedList<InputState> states2 = new LinkedList<InputState>(); states1.add(state1); states2.add(state2); pl.readState(); pl.readState(); expect(pl.drainAvailableStates()).andReturn(states1); expect(pl.drainAvailableStates()).andReturn(states2); expect(p1.apply(isA(TwoInputStates.class))).andReturn(false); expect(p1.apply(isA(TwoInputStates.class))).andReturn(true); ta1.perform(canvas, new TwoInputStates(state1, state2), tpf); replay(mocks); ll.registerTrigger(new InputTrigger(p1, ta1)); ll.checkTriggers(tpf); ll.checkTriggers(tpf); }
states2.add(state2); pl.readState(); pl.readState(); expect(pl.drainAvailableStates()).andReturn(states1); expect(pl.drainAvailableStates()).andReturn(states2); expect(p1.apply(isA(TwoInputStates.class))).andReturn(true); expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
@Test public void testTriggers4() throws Exception { final InputState state1 = new InputState(ks, ms, cs, gs); final double tpf = 14; final LinkedList<InputState> states1 = new LinkedList<InputState>(); final LinkedList<InputState> states2 = new LinkedList<InputState>(); states1.add(state1); pl.readState(); pl.readState(); expect(pl.drainAvailableStates()).andReturn(states1); expect(pl.drainAvailableStates()).andReturn(states2); expect(p1.apply(isA(TwoInputStates.class))).andReturn(false); expect(p1.apply(isA(TwoInputStates.class))).andReturn(true); expect(p2.apply(isA(TwoInputStates.class))).andReturn(true); expect(p2.apply(isA(TwoInputStates.class))).andReturn(true); ta1.perform(canvas, new TwoInputStates(state1, state1), tpf); ta2.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf); ta2.perform(canvas, new TwoInputStates(state1, state1), tpf); replay(mocks); final InputTrigger trigger2 = new InputTrigger(p2, ta2); ll.registerTrigger(new InputTrigger(p1, ta1)); ll.registerTrigger(trigger2); ll.checkTriggers(tpf); ll.checkTriggers(tpf); }
@Test public void testTriggers3() throws Exception { final InputState state1 = new InputState(ks, ms, cs, gs); final InputState state2 = new InputState(ks, ms, cs, gs); final double tpf = 14; final LinkedList<InputState> states1 = new LinkedList<InputState>(); final LinkedList<InputState> states2 = new LinkedList<InputState>(); states1.add(state1); states2.add(state2); pl.readState(); pl.readState(); expect(pl.drainAvailableStates()).andReturn(states1); expect(pl.drainAvailableStates()).andReturn(states2); expect(p1.apply(isA(TwoInputStates.class))).andReturn(false); expect(p1.apply(isA(TwoInputStates.class))).andReturn(true); expect(p2.apply(isA(TwoInputStates.class))).andReturn(true); ta1.perform(canvas, new TwoInputStates(state1, state2), tpf); ta2.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf); replay(mocks); final InputTrigger trigger2 = new InputTrigger(p2, ta2); ll.registerTrigger(new InputTrigger(p1, ta1)); ll.registerTrigger(trigger2); ll.checkTriggers(tpf); ll.deregisterTrigger(trigger2); ll.checkTriggers(tpf); }
@Test public void testTriggers2() throws Exception { final InputState state1 = new InputState(ks, ms, cs, gs); final InputState state2 = new InputState(ks, ms, cs, gs); final double tpf = 14; final LinkedList<InputState> states1 = new LinkedList<InputState>(); final LinkedList<InputState> states2 = new LinkedList<InputState>(); states1.add(state1); states2.add(state2); pl.readState(); pl.readState(); expect(pl.drainAvailableStates()).andReturn(states1); expect(pl.drainAvailableStates()).andReturn(states2); expect(p1.apply(isA(TwoInputStates.class))).andReturn(false); expect(p1.apply(isA(TwoInputStates.class))).andReturn(true); expect(p2.apply(isA(TwoInputStates.class))).andReturn(true); expect(p2.apply(isA(TwoInputStates.class))).andReturn(true); ta1.perform(canvas, new TwoInputStates(state1, state2), tpf); ta2.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf); ta2.perform(canvas, new TwoInputStates(state1, state2), tpf); replay(mocks); ll.registerTrigger(new InputTrigger(p1, ta1)); ll.registerTrigger(new InputTrigger(p2, ta2)); ll.checkTriggers(tpf); ll.checkTriggers(tpf); }
@Test public void testKeyboardBasic1() throws Exception { keyboardWrapper.init(); mouseWrapper.init(); controllerWrapper.init(); gestureWrapper.init(); focusWrapper.init(); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(Adown.iterator())); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())); expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(3); expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(3); expect(gestureWrapper.getEvents()).andReturn(Iterators.peekingIterator(noGestures.iterator())).times(3); expect(focusWrapper.getAndClearFocusLost()).andReturn(false).atLeastOnce(); replay(mocks); pl.readState(); inputStates = pl.drainAvailableStates(); assertEquals("1 state", 1, inputStates.size()); is = inputStates.get(0); assertTrue("a down", is.getKeyboardState().isDown(Key.A)); assertFalse("b down", is.getKeyboardState().isDown(Key.B)); pl.readState(); inputStates = pl.drainAvailableStates(); assertEquals("0 states", 0, inputStates.size()); }
@Test public void testLostFocus1() throws Exception { keyboardWrapper.init(); mouseWrapper.init(); controllerWrapper.init(); gestureWrapper.init(); focusWrapper.init(); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(Adown.iterator())); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())); expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(2); expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(2); expect(gestureWrapper.getEvents()).andReturn(Iterators.peekingIterator(noGestures.iterator())).times(2); expect(focusWrapper.getAndClearFocusLost()).andReturn(true); replay(mocks); pl.readState(); inputStates = pl.drainAvailableStates(); assertEquals("2 states", 2, inputStates.size()); is = inputStates.get(0); assertTrue("a down", is.getKeyboardState().isDown(Key.A)); assertFalse("b down", is.getKeyboardState().isDown(Key.B)); assertTrue("lost focus", InputState.LOST_FOCUS == inputStates.get(1)); }
@Test public void testKeyboardBasic2() throws Exception { final PeekingIterator<KeyEvent> adau = Iterators.peekingIterator(AdownAup.iterator()); keyboardWrapper.init(); mouseWrapper.init(); controllerWrapper.init(); gestureWrapper.init(); focusWrapper.init(); expect(keyboardWrapper.getEvents()).andReturn(adau); expect(keyboardWrapper.getEvents()).andReturn(adau); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())); expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(4); expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(4); expect(gestureWrapper.getEvents()).andReturn(Iterators.peekingIterator(noGestures.iterator())).times(4); expect(focusWrapper.getAndClearFocusLost()).andReturn(false).times(2); replay(mocks); pl.readState(); inputStates = pl.drainAvailableStates(); assertEquals("2 states", 2, inputStates.size()); is = inputStates.get(0); assertTrue("a down", is.getKeyboardState().isDown(Key.A)); assertFalse("b down", is.getKeyboardState().isDown(Key.B)); is = inputStates.get(1); assertFalse("a down", is.getKeyboardState().isDown(Key.A)); assertFalse("b down", is.getKeyboardState().isDown(Key.B)); pl.readState(); inputStates = pl.drainAvailableStates(); assertEquals("0 states", 0, inputStates.size()); }
@Test public void testLostFocus2() throws Exception { keyboardWrapper.init(); mouseWrapper.init(); controllerWrapper.init(); gestureWrapper.init(); focusWrapper.init(); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(Adown.iterator())); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())); expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(3); expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(3); expect(gestureWrapper.getEvents()).andReturn(Iterators.peekingIterator(noGestures.iterator())).times(3); expect(focusWrapper.getAndClearFocusLost()).andReturn(false); expect(focusWrapper.getAndClearFocusLost()).andReturn(true); replay(mocks); pl.readState(); pl.readState(); inputStates = pl.drainAvailableStates(); assertEquals("2 states", 2, inputStates.size()); is = inputStates.get(0); assertTrue("a down", is.getKeyboardState().isDown(Key.A)); assertFalse("b down", is.getKeyboardState().isDown(Key.B)); is = inputStates.get(1); assertEquals("lost focus", InputState.LOST_FOCUS, is); assertFalse("a down", is.getKeyboardState().isDown(Key.A)); assertFalse("b down", is.getKeyboardState().isDown(Key.B)); }
@Test public void testKeyboardBasic3() throws Exception { keyboardWrapper.init(); mouseWrapper.init(); controllerWrapper.init(); gestureWrapper.init(); focusWrapper.init(); final PeekingIterator<KeyEvent> keyIterator = Iterators.peekingIterator(AdownBdown.iterator()); expect(keyboardWrapper.getEvents()).andReturn(keyIterator).times(4); expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(4); expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(4); expect(gestureWrapper.getEvents()).andReturn(Iterators.peekingIterator(noGestures.iterator())).times(4); expect(focusWrapper.getAndClearFocusLost()).andReturn(false).times(2); replay(mocks); pl.readState(); inputStates = pl.drainAvailableStates(); assertEquals("2 states", 2, inputStates.size()); is = inputStates.get(0); assertTrue("a down", is.getKeyboardState().isDown(Key.A)); assertFalse("b down", is.getKeyboardState().isDown(Key.B)); is = inputStates.get(1); assertTrue("a down", is.getKeyboardState().isDown(Key.A)); assertTrue("b down", is.getKeyboardState().isDown(Key.B)); pl.readState(); inputStates = pl.drainAvailableStates(); assertEquals("0 states", 0, inputStates.size()); }
@Test public void testLostFocus3() throws Exception { keyboardWrapper.init(); mouseWrapper.init(); controllerWrapper.init(); gestureWrapper.init(); focusWrapper.init(); expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())).times(3); expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(buttonDown.iterator())); expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(2); expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(3); expect(gestureWrapper.getEvents()).andReturn(Iterators.peekingIterator(noGestures.iterator())).times(3); expect(focusWrapper.getAndClearFocusLost()).andReturn(false); expect(focusWrapper.getAndClearFocusLost()).andReturn(true); replay(mocks); pl.readState(); pl.readState(); inputStates = pl.drainAvailableStates(); assertEquals("2 states", 2, inputStates.size()); is = inputStates.get(0); assertFalse("a down", is.getKeyboardState().isDown(Key.A)); assertFalse("b down", is.getKeyboardState().isDown(Key.B)); assertEquals("mb down", ButtonState.DOWN, is.getMouseState().getButtonState(MouseButton.LEFT)); is = inputStates.get(1); assertEquals("lost focus", InputState.LOST_FOCUS, is); assertFalse("a down", is.getKeyboardState().isDown(Key.A)); assertFalse("b down", is.getKeyboardState().isDown(Key.B)); assertEquals("mb up", ButtonState.UP, is.getMouseState().getButtonState(MouseButton.LEFT)); }