diff --git a/CHANGELOG.md b/CHANGELOG.md
index 09d7bace6..bb7ca9226 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
# Changelog
+### 1.8.12 (TBD)
+
+* Fix bug that caused incorrect check marks to show after scrolling (#713)
+* Fix issue preventing widgets from updating at midnight (#680)
+
### 1.8.11 (Dev 29, 2020)
* Fix theme issues on Xiaomi phones
diff --git a/android/gradle.properties b/android/gradle.properties
index 0617454e0..870dacfa1 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
-VERSION_CODE = 10811
-VERSION_NAME = 1.8.11
+VERSION_CODE = 10812
+VERSION_NAME = 1.8.12
MIN_SDK_VERSION = 21
TARGET_SDK_VERSION = 29
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt
index df162766c..a2c2b0e99 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt
@@ -62,6 +62,7 @@ class HabitsApplication : Application() {
widgetUpdater = component.widgetUpdater
widgetUpdater.startListening()
+ widgetUpdater.scheduleStartDayWidgetUpdate()
reminderScheduler = component.reminderScheduler
reminderScheduler.startListening()
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java
index ad4f8013e..1b9d30a04 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java
@@ -206,7 +206,7 @@ public HabitCardViewHolder onCreateViewHolder(ViewGroup parent,
int viewType)
{
if (listView == null) return null;
- View view = listView.createHabitCardView();
+ HabitCardView view = listView.createHabitCardView();
return new HabitCardViewHolder(view);
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt
index 259d1f14a..211c436ed 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt
@@ -62,7 +62,7 @@ class HabitCardListView(
super.setAdapter(adapter)
}
- fun createHabitCardView(): View {
+ fun createHabitCardView(): HabitCardView {
return cardViewFactory.create()
}
@@ -91,6 +91,7 @@ class HabitCardListView(
}
fun attachCardView(holder: HabitCardViewHolder) {
+ (holder.itemView as HabitCardView).dataOffset = dataOffset
attachedHolders.add(holder)
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewHolder.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewHolder.kt
index 3f0b9d0ca..865c0d8f5 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewHolder.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewHolder.kt
@@ -19,8 +19,6 @@
package org.isoron.uhabits.activities.habits.list.views
-import androidx.appcompat.widget.*
-import android.view.*
import androidx.recyclerview.widget.RecyclerView
-class HabitCardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
+class HabitCardViewHolder(itemView: HabitCardView) : RecyclerView.ViewHolder(itemView)
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt
index 934942f15..2882d3022 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt
@@ -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)
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt
index 0901a0836..befdc7be0 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt
@@ -103,4 +103,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)
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
index e5dec0218..7320a40dd 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
@@ -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 dagger.*;
@@ -48,6 +49,9 @@ public class WidgetReceiver extends BroadcastReceiver
public static final String ACTION_TOGGLE_REPETITION =
"org.isoron.uhabits.ACTION_TOGGLE_REPETITION";
+ public static final String ACTION_UPDATE_WIDGETS_VALUE =
+ "org.isoron.uhabits.ACTION_UPDATE_WIDGETS_VALUE";
+
private static final String TAG = "WidgetReceiver";
@Override
@@ -64,13 +68,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())
{
@@ -100,6 +108,11 @@ public void onReceive(final Context context, Intent intent)
controller.onRemoveRepetition(data.getHabit(),
data.getTimestamp());
break;
+
+ case ACTION_UPDATE_WIDGETS_VALUE:
+ widgetUpdater.updateWidgets();
+ widgetUpdater.scheduleStartDayWidgetUpdate();
+ break;
}
}
catch (RuntimeException e)
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt
index b8293582a..3f84f4fc3 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt
@@ -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)
diff --git a/android/uhabits-android/src/main/play/release-notes/en-US/default.txt b/android/uhabits-android/src/main/play/release-notes/en-US/default.txt
index 98136243c..bbebfe656 100644
--- a/android/uhabits-android/src/main/play/release-notes/en-US/default.txt
+++ b/android/uhabits-android/src/main/play/release-notes/en-US/default.txt
@@ -1,2 +1,3 @@
-1.8.11:
-* Fix theme issues on Xiaomi phones
+1.8.12:
+* Fix bug that caused incorrect check marks to show after scrolling
+* Fix issue preventing widgets from updating at midnight
diff --git a/android/uhabits-android/src/main/res/layout/about.xml b/android/uhabits-android/src/main/res/layout/about.xml
index f36bd68d2..b86a1b931 100644
--- a/android/uhabits-android/src/main/res/layout/about.xml
+++ b/android/uhabits-android/src/main/res/layout/about.xml
@@ -129,6 +129,8 @@
+
+