package com.novoda.magicmirror.facerecognition; public class KeyboardFaceSource implements FaceReactionSource { private static final FaceExpression NEUTRAL_EXPRESSION = FaceExpression.LOOKING; private final FaceTracker.FaceListener faceListener; private final KeyToFaceMappings mappings; private FaceExpression currentExpression = FaceExpression.LOOKING; public KeyboardFaceSource(FaceTracker.FaceListener faceListener, KeyToFaceMappings mappings) { this.faceListener = faceListener; this.mappings = mappings; } public boolean onKeyDown(int keyCode) { if (sameKeyCodeIsTriggered(keyCode)) { return false; } FaceExpression faceExpression = mappings.getFaceFromKeyCode(keyCode); if (faceExpression != null) { currentExpression = faceExpression; faceListener.onNewFace(faceExpression); return true; } currentExpression = NEUTRAL_EXPRESSION; return false; } private boolean sameKeyCodeIsTriggered(int keyCode) { FaceExpression mappedExpression = mappings.getFaceFromKeyCode(keyCode); if (mappedExpression == null) { return currentExpression == NEUTRAL_EXPRESSION; } return currentExpression == mappedExpression; } public boolean onKeyUp(int keyCode) { if (holdsAnExpression() && sameKeyCodeIsTriggered(keyCode)) { faceListener.onNewFace(NEUTRAL_EXPRESSION); currentExpression = NEUTRAL_EXPRESSION; } return true; } private boolean holdsAnExpression() { return currentExpression != NEUTRAL_EXPRESSION; } @Override public void start() { // no-op } @Override public void release() { // no-op } }