package org.petabytes.awesomeblogs.digest;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import com.annimon.stream.Optional;
import com.f2prateek.rx.preferences.Preference;
import org.petabytes.awesomeblogs.util.Analytics;
import org.petabytes.awesomeblogs.util.Preferences;
import java.lang.annotation.Retention;
import java.util.Calendar;
import java.util.Random;
import hugo.weaving.DebugLog;
import static java.lang.annotation.RetentionPolicy.SOURCE;
public class Schedulers {
@Retention(SOURCE)
@IntDef({MORNING, EVENING})
@interface Type {}
public static final int MORNING = 0;
public static final int EVENING = 1;
public static void set(@NonNull Context context) {
set(context, getDigestAt(MORNING), MORNING);
set(context, getDigestAt(EVENING), EVENING);
}
@DebugLog
public static void set(@NonNull Context context, long digestAtMillis, @Type int type) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(
AlarmManager.RTC_WAKEUP, digestAtMillis, AlarmManager.INTERVAL_DAY,
PendingIntent.getService(context, type, DigestService.intent(context, type), PendingIntent.FLAG_UPDATE_CURRENT));
Analytics.event(Analytics.Event.SCHEDULE_DIGEST, Analytics.Param.TYPE, type == MORNING ? "morning" : "evening");
}
private static long getDigestAt(@Type int type) {
Calendar calendar = Calendar.getInstance();
Preference<Long> digestPreference = type == MORNING ? Preferences.morningDigestAt() : Preferences.eveningDigestAt();
long digest = Optional.ofNullable(digestPreference.get()).orElse(0L);
if (digest > System.currentTimeMillis()) {
calendar.setTimeInMillis(digest);
} else {
calendar.set(Calendar.HOUR_OF_DAY, type == MORNING ? 9 : 19);
calendar.set(Calendar.MINUTE, new Random().nextInt(30));
calendar.set(Calendar.SECOND, 0);
calendar.add(Calendar.DATE, calendar.before(Calendar.getInstance()) ? 1 : 0);
digestPreference.set(calendar.getTimeInMillis());
}
return calendar.getTimeInMillis();
}
}