package br.com.dgimenes.nasapic.service; import android.annotation.TargetApi; import android.app.job.JobInfo; import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.app.job.JobService; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Build; import android.preference.PreferenceManager; import android.util.Log; import android.widget.Toast; import java.util.Calendar; import br.com.dgimenes.nasapic.R; import br.com.dgimenes.nasapic.control.ErrorMessage; import br.com.dgimenes.nasapic.service.interactor.OnFinishListener; import br.com.dgimenes.nasapic.service.interactor.SpacePicInteractor; @TargetApi(Build.VERSION_CODES.LOLLIPOP) public class PeriodicWallpaperChangeService extends JobService { public static final int JOB_ID = 666; private static final String LAST_APOD_CHECK_DAY = "LAST_APOD_CHECK_DAY"; private static final String LOG_TAG = PeriodicWallpaperChangeService.class.getName(); private static final int PERIOD_IN_HOURS = 6; @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } public static void updatePeriodicWallpaperChangeSetup(Context context) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { Resources res = context.getResources(); boolean periodicChangeActivated = PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(res.getString(R.string.periodic_change_preference), res.getBoolean(R.bool.periodic_change_preference_default_value)); if (periodicChangeActivated) { setupIfNeededPeriodicWallpaperChange(context); } else { unschedulePeriodicWallpaperChange(context); } } } public static void setupIfNeededPeriodicWallpaperChange(Context context) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { Resources res = context.getResources(); JobScheduler scheduler = (JobScheduler) context .getSystemService(Context.JOB_SCHEDULER_SERVICE); if (scheduler.getAllPendingJobs().size() == 0) { ComponentName serviceEndpoint = new ComponentName(context, PeriodicWallpaperChangeService.class); JobInfo wallpaperChangeJob = new JobInfo.Builder( PeriodicWallpaperChangeService.JOB_ID, serviceEndpoint) .setRequiresCharging(false) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setPersisted(true) .setRequiresDeviceIdle(true) .setPeriodic(PERIOD_IN_HOURS * 60 * 60 * 1000) .build(); scheduler.schedule(wallpaperChangeJob); String scheduledMessage = res.getString(R.string.periodic_change_scheduled); Toast.makeText(context, scheduledMessage, Toast.LENGTH_SHORT).show(); } } } public static void unschedulePeriodicWallpaperChange(Context context) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { JobScheduler scheduler = (JobScheduler) context .getSystemService(Context.JOB_SCHEDULER_SERVICE); if (scheduler.getAllPendingJobs().size() > 0) { scheduler.cancelAll(); String unscheduledMessage = context.getResources() .getString(R.string.periodic_change_unscheduled); Toast.makeText(context, unscheduledMessage, Toast.LENGTH_SHORT).show(); } } } @Override public boolean onStartJob(JobParameters params) { EventsLogger.initialize(this); if (haventTriedChangedToday()) { new SpacePicInteractor(this).setTodaysApodAsWallpaper(new OnFinishListener<Void>() { @Override public void onSuccess(Void result) { EventsLogger.logEvent("Wallpaper set automatically"); SharedPreferences.Editor editor = PreferenceManager .getDefaultSharedPreferences(PeriodicWallpaperChangeService.this) .edit(); editor.putInt(LAST_APOD_CHECK_DAY, Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); editor.apply(); } @Override public void onError(Throwable throwable) { ErrorMessage error = ErrorMessage.SETTING_WALLPAPER_AUTO; EventsLogger.logError(error, throwable); String errorMessage = PeriodicWallpaperChangeService.this.getResources() .getString(error.userMessageRes); WallpaperChangeNotification.createChangedNotification( PeriodicWallpaperChangeService.this, errorMessage); } }); } else { Log.d(LOG_TAG, "Skipping periodic wallpaper change because already did it today."); } return false; // means everything is done } private boolean haventTriedChangedToday() { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); int dayOfMonth = preferences.getInt(LAST_APOD_CHECK_DAY, -1); int currentDayOfMonth = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); return dayOfMonth != currentDayOfMonth; } @Override public boolean onStopJob(JobParameters params) { WallpaperChangeNotification.createChangedNotification(this, "NasaPic PeriodicWallpaperChangeService stopping..."); return false; // means everything is done } }