Exemplo n.º 1
0
        public override bool OnStopJob(JobParameters @params)
        {
            // Called when a requierment not met any more (ex. idle became not-idle...)

            bool shouldJobContinue = false; // Once requirement met again
            bool invokeErrors      = false;

            int jobID = @params.JobId;

            try
            {
                JobCallbacks callbacks = allJobs[jobID];

                callbacks.onJobRequirementAbort?.Invoke();
                shouldJobContinue = callbacks.shouldRetryAfterAbort?.Invoke() ?? shouldJobContinue;
            }
            catch (Exception ex)
            {
                invokeErrors = true;
                AndroidLevelLogger.e(TAG, ex);
            }

            if (invokeErrors || !shouldJobContinue)
            {
                shouldJobContinue = false;
                if (allJobs.ContainsKey(jobID))
                {
                    allJobs.Remove(jobID);
                }
            }

            return(shouldJobContinue);
        }
Exemplo n.º 2
0
 public static void cancelJobById(Context ctx, int jobID)
 {
     try
     {
         if (allJobs.ContainsKey(jobID))
         {
             JobCallbacks job     = allJobs[jobID];
             var          manager = (JobSchedulerType)ctx.GetSystemService(Context.JobSchedulerService);
             manager.Cancel(job.JobUniqueID);
             allJobs.Remove(jobID);
         }
     }
     catch (Exception ex)
     {
         AndroidLevelLogger.e(TAG, ex);
     }
 }
Exemplo n.º 3
0
        public override bool OnStartJob(JobParameters @params)
        {
            bool shouldJobContinue = false;

            int  jobID           = @params.JobId;
            bool hasUserFinished = false;
            bool invokeErrors    = false;

            try
            {
                JobCallbacks  callbacks        = allJobs[jobID];
                Action <bool> jobFinishedProxy =
                    (bool wantsReschedule) => {
                    hasUserFinished = true;
                    JobFinished(@params, wantsReschedule);
                };

                callbacks.onJob?.Invoke(jobFinishedProxy);
                shouldJobContinue = callbacks.shouldContinue?.Invoke() ?? shouldJobContinue;
            }
            catch (Exception ex)
            {
                invokeErrors = true;
                AndroidLevelLogger.e(TAG, ex);
            }

            if (invokeErrors || (hasUserFinished && !shouldJobContinue))
            {
                shouldJobContinue = false;
                if (allJobs.ContainsKey(jobID))
                {
                    allJobs.Remove(jobID);
                }
            }

            return(shouldJobContinue);
        }
Exemplo n.º 4
0
        public static bool scheduleJob(Context ctx, JobCallbacks callbacks, TimeSpan?minLatency, TimeSpan?maxLatency, TimeSpan?interval = null,
                                       bool requireIdle            = false, bool requireCharger = false, NetworkType requiredNet = NetworkType.Any,
                                       bool requireAboveLowBattery = false, bool requireAboveLowStorage = false)
        {
            int  jobID   = -1;
            bool success = false;

            jobID = callbacks.JobUniqueID;
            allJobs.Add(jobID, callbacks);

            try
            {
                ComponentName JobServiceComponent = new ComponentName(ctx, Java.Lang.Class.FromType(typeof(PeriodicTask)));

                var jobBuilder = new JobInfo
                                 .Builder(jobID, JobServiceComponent)

                                 .SetRequiresDeviceIdle(requireIdle)
                                 .SetRequiresCharging(requireCharger)
                                 .SetRequiredNetworkType(requiredNet)
                                 .SetRequiresBatteryNotLow(requireAboveLowBattery)
                                 .SetRequiresStorageNotLow(requireAboveLowStorage)
                ;

                long intervalMillisecond = (long)(interval?.TotalMilliseconds ?? 0);
                if (intervalMillisecond > 0L)
                {
                    if (intervalMillisecond < JobInfo.MinPeriodMillis)
                    {
                        throw new Exception("Period interval must be at least: " + JobInfo.MinPeriodMillis);
                    }
                    jobBuilder.SetPeriodic(intervalMillisecond);
                }
                else
                {
                    jobBuilder.SetMinimumLatency((long)(minLatency?.TotalMilliseconds ?? 0L));
                    jobBuilder.SetOverrideDeadline((long)(maxLatency?.TotalMilliseconds ?? 0L));
                }

                JobInfo job = jobBuilder.Build();

                var manager = (JobSchedulerType)ctx.GetSystemService(Context.JobSchedulerService);
                var status  = manager.Schedule(job);

                if (status != JobSchedulerType.ResultSuccess)
                {
                    AndroidLevelLogger.e(TAG, "Job schedule failed for id: " + jobID);
                    success = false;
                }
                else
                {
                    success = true;
                }
            }
            catch (Exception ex)
            {
                AndroidLevelLogger.e(TAG, ex);
            }

            if (!success && allJobs.ContainsKey(jobID))
            {
                allJobs.Remove(jobID);
            }

            return(success);
        }