mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Update widgets at midnight (#634)
This commit is contained in:
@@ -62,6 +62,7 @@ class HabitsApplication : Application() {
|
||||
|
||||
widgetUpdater = component.widgetUpdater
|
||||
widgetUpdater.startListening()
|
||||
widgetUpdater.scheduleStartDayWidgetUpdate()
|
||||
|
||||
reminderScheduler = component.reminderScheduler
|
||||
reminderScheduler.startListening()
|
||||
|
||||
@@ -45,7 +45,7 @@ class IntentScheduler
|
||||
private val manager =
|
||||
context.getSystemService(ALARM_SERVICE) as AlarmManager
|
||||
|
||||
fun schedule(timestamp: Long, intent: PendingIntent) {
|
||||
fun schedule(timestamp: Long, intent: PendingIntent, alarmType: Int) {
|
||||
Log.d("IntentScheduler",
|
||||
"timestamp=" + timestamp + " current=" + System.currentTimeMillis())
|
||||
if (timestamp < System.currentTimeMillis()) {
|
||||
@@ -54,19 +54,24 @@ class IntentScheduler
|
||||
return;
|
||||
}
|
||||
if (SDK_INT >= M)
|
||||
manager.setExactAndAllowWhileIdle(RTC_WAKEUP, timestamp, intent)
|
||||
manager.setExactAndAllowWhileIdle(alarmType, timestamp, intent)
|
||||
else
|
||||
manager.setExact(RTC_WAKEUP, timestamp, intent)
|
||||
manager.setExact(alarmType, timestamp, intent)
|
||||
}
|
||||
|
||||
override fun scheduleShowReminder(reminderTime: Long,
|
||||
habit: Habit,
|
||||
timestamp: Long) {
|
||||
val intent = pendingIntents.showReminder(habit, reminderTime, timestamp)
|
||||
schedule(reminderTime, intent)
|
||||
schedule(reminderTime, intent, RTC_WAKEUP)
|
||||
logReminderScheduled(habit, reminderTime)
|
||||
}
|
||||
|
||||
override fun scheduleWidgetUpdate(updateTime: Long) {
|
||||
val intent = pendingIntents.updateWidgets()
|
||||
schedule(updateTime, intent, RTC)
|
||||
}
|
||||
|
||||
override fun log(componentName: String, msg: String) {
|
||||
Log.d(componentName, msg)
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import org.isoron.androidbase.*
|
||||
import org.isoron.uhabits.core.*
|
||||
import org.isoron.uhabits.core.models.*
|
||||
import org.isoron.uhabits.receivers.*
|
||||
import org.isoron.uhabits.widgets.*
|
||||
import javax.inject.*
|
||||
|
||||
@AppScope
|
||||
@@ -118,4 +119,12 @@ class PendingIntentFactory
|
||||
if (timestamp != null) putExtra("timestamp", timestamp)
|
||||
},
|
||||
FLAG_UPDATE_CURRENT)
|
||||
|
||||
fun updateWidgets(): PendingIntent =
|
||||
PendingIntent.getBroadcast(
|
||||
context, 0,
|
||||
Intent(context, WidgetReceiver::class.java).apply {
|
||||
action = WidgetReceiver.ACTION_UPDATE_WIDGETS_VALUE
|
||||
},
|
||||
FLAG_UPDATE_CURRENT)
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.isoron.uhabits.*;
|
||||
import org.isoron.uhabits.core.preferences.*;
|
||||
import org.isoron.uhabits.core.ui.widgets.*;
|
||||
import org.isoron.uhabits.intents.*;
|
||||
import org.isoron.uhabits.widgets.*;
|
||||
import org.isoron.uhabits.widgets.activities.*;
|
||||
|
||||
import dagger.*;
|
||||
@@ -52,6 +53,9 @@ public class WidgetReceiver extends BroadcastReceiver
|
||||
public static final String ACTION_SET_NUMERICAL_VALUE =
|
||||
"org.isoron.uhabits.ACTION_SET_NUMERICAL_VALUE";
|
||||
|
||||
public static final String ACTION_UPDATE_WIDGETS_VALUE =
|
||||
"org.isoron.uhabits.ACTION_UPDATE_WIDGETS_VALUE";
|
||||
|
||||
private static final String TAG = "WidgetReceiver";
|
||||
|
||||
@Override
|
||||
@@ -68,13 +72,17 @@ public class WidgetReceiver extends BroadcastReceiver
|
||||
IntentParser parser = app.getComponent().getIntentParser();
|
||||
WidgetBehavior controller = component.getWidgetController();
|
||||
Preferences prefs = app.getComponent().getPreferences();
|
||||
WidgetUpdater widgetUpdater = app.getComponent().getWidgetUpdater();
|
||||
|
||||
Log.i(TAG, String.format("Received intent: %s", intent.toString()));
|
||||
|
||||
try
|
||||
{
|
||||
IntentParser.CheckmarkIntentData data;
|
||||
data = parser.parseCheckmarkIntent(intent);
|
||||
IntentParser.CheckmarkIntentData data = null;
|
||||
if (intent.getAction() != ACTION_UPDATE_WIDGETS_VALUE)
|
||||
{
|
||||
data = parser.parseCheckmarkIntent(intent);
|
||||
}
|
||||
|
||||
switch (intent.getAction())
|
||||
{
|
||||
@@ -112,6 +120,10 @@ public class WidgetReceiver extends BroadcastReceiver
|
||||
parser.copyIntentData(intent,numberSelectorIntent);
|
||||
context.startActivity(numberSelectorIntent);
|
||||
break;
|
||||
case ACTION_UPDATE_WIDGETS_VALUE:
|
||||
widgetUpdater.updateWidgets();
|
||||
widgetUpdater.scheduleStartDayWidgetUpdate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
|
||||
@@ -25,6 +25,8 @@ import org.isoron.androidbase.*
|
||||
import org.isoron.uhabits.core.commands.*
|
||||
import org.isoron.uhabits.core.preferences.*
|
||||
import org.isoron.uhabits.core.tasks.*
|
||||
import org.isoron.uhabits.core.utils.*
|
||||
import org.isoron.uhabits.intents.*
|
||||
import javax.inject.*
|
||||
|
||||
/**
|
||||
@@ -36,7 +38,8 @@ class WidgetUpdater
|
||||
@AppContext private val context: Context,
|
||||
private val commandRunner: CommandRunner,
|
||||
private val taskRunner: TaskRunner,
|
||||
private val widgetPrefs: WidgetPreferences
|
||||
private val widgetPrefs: WidgetPreferences,
|
||||
private val intentScheduler: IntentScheduler
|
||||
) : CommandRunner.Listener {
|
||||
|
||||
override fun onCommandExecuted(command: Command, refreshKey: Long?) {
|
||||
@@ -60,6 +63,11 @@ class WidgetUpdater
|
||||
commandRunner.removeListener(this)
|
||||
}
|
||||
|
||||
fun scheduleStartDayWidgetUpdate() {
|
||||
val timestamp = DateUtils.getStartOfTomorrow()
|
||||
intentScheduler.scheduleWidgetUpdate(timestamp);
|
||||
}
|
||||
|
||||
fun updateWidgets(modifiedHabitId: Long?) {
|
||||
taskRunner.execute {
|
||||
updateWidgets(modifiedHabitId, CheckmarkWidgetProvider::class.java)
|
||||
|
||||
Reference in New Issue
Block a user