Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update widgets at midnight #634

Merged
merged 2 commits into from
Sep 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class HabitsApplication : Application() {

widgetUpdater = component.widgetUpdater
widgetUpdater.startListening()
widgetUpdater.scheduleStartDayWidgetUpdate()

reminderScheduler = component.reminderScheduler
reminderScheduler.startListening()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand All @@ -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)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
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.*;
Expand All @@ -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
Expand All @@ -68,13 +72,17 @@ public void onReceive(final Context context, Intent intent)
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())
{
Expand Down Expand Up @@ -112,6 +120,10 @@ public void onReceive(final Context context, Intent intent)
parser.copyIntentData(intent,numberSelectorIntent);
context.startActivity(numberSelectorIntent);
break;
case ACTION_UPDATE_WIDGETS_VALUE:
widgetUpdater.updateWidgets();
widgetUpdater.scheduleStartDayWidgetUpdate();
break;
}
}
catch (RuntimeException e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*

/**
Expand All @@ -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?) {
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ public interface SystemScheduler
{
void scheduleShowReminder(long reminderTime, Habit habit, long timestamp);

void scheduleWidgetUpdate(long updateTime);

void log(String componentName, String msg);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,14 @@ public static long getStartOfToday()
return getStartOfDay(getLocalTime());
}

public static long getStartOfTomorrow()
{
return getUpcomingTimeInMillis(0, 0);
}

public static long millisecondsUntilTomorrow()
{
return getStartOfToday() + DAY_LENGTH - getLocalTime();
return getStartOfTomorrow() - getLocalTime();
}

public static GregorianCalendar getStartOfTodayCalendar()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ public void testTruncate_year()
@Test
public void testMillisecondsUntilTomorrow() throws Exception
{
DateUtils.setFixedTimeZone(TimeZone.getTimeZone("GMT"));
iSoron marked this conversation as resolved.
Show resolved Hide resolved
DateUtils.setFixedLocalTime(unixTime(2017, JANUARY, 1, 23, 59));
assertThat(DateUtils.millisecondsUntilTomorrow(), equalTo(60000L));

Expand Down