docs: public synchronized void schedule(@NonNull JobRequest request) {
          // call must be synchronized, otherwise with isUpdateCurrent() true it's possible to end up in a race condition with multiple jobs scheduled
  
          if (mJobCreatorHolder.isEmpty()) {
              CAT.w("you haven't registered a JobCreator with addJobCreator(), it's likely that your job never will be executed");
          }
  
          if (request.getScheduledAt() > 0) {
              return;
          }
  
          if (request.isUpdateCurrent()) {
              cancelAllForTag(request.getTag());
          }
  
          JobProxy.Common.cleanUpOrphanedJob(mContext, request.getJobId());
  
          JobApi jobApi = request.getJobApi();
          boolean periodic = request.isPeriodic();
          boolean flexSupport = periodic && jobApi.isFlexSupport() && request.getFlexMs() < request.getIntervalMs();
  
          request.setScheduledAt(JobConfig.getClock().currentTimeMillis());
          request.setFlexSupport(flexSupport);
          getJobStorage().put(request);
  
          try {
              scheduleWithApi(request, jobApi, periodic, flexSupport);
              return;
          } catch (JobProxyIllegalStateException e) {
              // try again below, the other cases stop
  
          } catch (Exception e) {
              // if something fails, don't keep the job in the database, it would be rescheduled later
              getJobStorage().remove(request);
              throw e;
          }
  
          try {
              // try to reload the proxy
              jobApi.invalidateCachedProxy();
  
              scheduleWithApi(request, jobApi, periodic, flexSupport);
              return;
          } catch (Exception e) {
              if (jobApi == JobApi.V_14 || jobApi == JobApi.V_19) {
                  // at this stage we cannot do anything
                  getJobStorage().remove(request);
                  throw e;
              } else {
                  jobApi = JobApi.V_19.isSupported(mContext) ? JobApi.V_19 : JobApi.V_14; // try one last time
              }
          }
  
          try {
              scheduleWithApi(request, jobApi, periodic, flexSupport);
          } catch (Exception e) {
              // if something fails, don't keep the job in the database, it would be rescheduled later
              getJobStorage().remove(request);
              throw e;
          }
      }