/**
   * Updates the positions and state of eyes to the underlying graphic, according to the most recent
   * face detection results. The graphic will render the eyes and simulate the motion of the iris
   * based upon these changes over time.
   */
  @Override
  public void onUpdate(FaceDetector.Detections<Face> detectionResults, Face face) {
    mOverlay.add(mEyesGraphic);

    updatePreviousProportions(face);

    PointF leftPosition = getLandmarkPosition(face, Landmark.LEFT_EYE);
    PointF rightPosition = getLandmarkPosition(face, Landmark.RIGHT_EYE);

    float leftOpenScore = face.getIsLeftEyeOpenProbability();
    boolean isLeftOpen;
    if (leftOpenScore == Face.UNCOMPUTED_PROBABILITY) {
      isLeftOpen = mPreviousIsLeftOpen;
    } else {
      isLeftOpen = (leftOpenScore > EYE_CLOSED_THRESHOLD);
      mPreviousIsLeftOpen = isLeftOpen;
    }

    float rightOpenScore = face.getIsRightEyeOpenProbability();
    boolean isRightOpen;
    if (rightOpenScore == Face.UNCOMPUTED_PROBABILITY) {
      isRightOpen = mPreviousIsRightOpen;
    } else {
      isRightOpen = (rightOpenScore > EYE_CLOSED_THRESHOLD);
      mPreviousIsRightOpen = isRightOpen;
    }

    mEyesGraphic.updateEyes(leftPosition, isLeftOpen, rightPosition, isRightOpen);
  }
 private void updatePreviousProportions(Face face) {
   for (Landmark landmark : face.getLandmarks()) {
     PointF position = landmark.getPosition();
     float xProp = (position.x - face.getPosition().x) / face.getWidth();
     float yProp = (position.y - face.getPosition().y) / face.getHeight();
     mPreviousProportions.put(landmark.getType(), new PointF(xProp, yProp));
   }
 }
  /**
   * Finds a specific landmark position, or approximates the position based on past observations if
   * it is not present.
   */
  private PointF getLandmarkPosition(Face face, int landmarkId) {
    for (Landmark landmark : face.getLandmarks()) {
      if (landmark.getType() == landmarkId) {
        return landmark.getPosition();
      }
    }

    PointF prop = mPreviousProportions.get(landmarkId);
    if (prop == null) {
      return null;
    }

    float x = face.getPosition().x + (prop.x * face.getWidth());
    float y = face.getPosition().y + (prop.y * face.getHeight());
    return new PointF(x, y);
  }