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 @@ + +