docs: public boolean scheduleJob() {
      long now = SystemClock.uptimeMillis();
      long when = 0;
      boolean shouldEnqueue = false;
      synchronized (this) {
        if (!shouldProcess(mEncodedImage, mStatus)) {
          return false;
        }
        switch (mJobState) {
          case IDLE:
            when = Math.max(mJobStartTime + mMinimumJobIntervalMs, now);
            shouldEnqueue = true;
            mJobSubmitTime = now;
            mJobState = JobState.QUEUED;
            break;
          case QUEUED:
            // do nothing, the job is already queued
            break;
          case RUNNING:
            mJobState = JobState.RUNNING_AND_PENDING;
            break;
          case RUNNING_AND_PENDING:
            // do nothing, the next job is already pending
            break;
        }
      }
      if (shouldEnqueue) {
        enqueueJob(when - now);
      }
      return true;
    }