mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 98abebe099 | |||
| 0f86cb4d53 | |||
|
|
4dd77463fb | ||
|
|
2cf3347f8c | ||
| 5516f40571 |
@@ -1,5 +1,10 @@
|
|||||||
# Changelog
|
# 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)
|
### 1.8.11 (Dev 29, 2020)
|
||||||
|
|
||||||
* Fix theme issues on Xiaomi phones
|
* Fix theme issues on Xiaomi phones
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
VERSION_CODE = 10811
|
VERSION_CODE = 10812
|
||||||
VERSION_NAME = 1.8.11
|
VERSION_NAME = 1.8.12
|
||||||
|
|
||||||
MIN_SDK_VERSION = 21
|
MIN_SDK_VERSION = 21
|
||||||
TARGET_SDK_VERSION = 29
|
TARGET_SDK_VERSION = 29
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ class HabitsApplication : Application() {
|
|||||||
|
|
||||||
widgetUpdater = component.widgetUpdater
|
widgetUpdater = component.widgetUpdater
|
||||||
widgetUpdater.startListening()
|
widgetUpdater.startListening()
|
||||||
|
widgetUpdater.scheduleStartDayWidgetUpdate()
|
||||||
|
|
||||||
reminderScheduler = component.reminderScheduler
|
reminderScheduler = component.reminderScheduler
|
||||||
reminderScheduler.startListening()
|
reminderScheduler.startListening()
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ public class HabitCardListAdapter
|
|||||||
int viewType)
|
int viewType)
|
||||||
{
|
{
|
||||||
if (listView == null) return null;
|
if (listView == null) return null;
|
||||||
View view = listView.createHabitCardView();
|
HabitCardView view = listView.createHabitCardView();
|
||||||
return new HabitCardViewHolder(view);
|
return new HabitCardViewHolder(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ class HabitCardListView(
|
|||||||
super.setAdapter(adapter)
|
super.setAdapter(adapter)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createHabitCardView(): View {
|
fun createHabitCardView(): HabitCardView {
|
||||||
return cardViewFactory.create()
|
return cardViewFactory.create()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,6 +91,7 @@ class HabitCardListView(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun attachCardView(holder: HabitCardViewHolder) {
|
fun attachCardView(holder: HabitCardViewHolder) {
|
||||||
|
(holder.itemView as HabitCardView).dataOffset = dataOffset
|
||||||
attachedHolders.add(holder)
|
attachedHolders.add(holder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
package org.isoron.uhabits.activities.habits.list.views
|
package org.isoron.uhabits.activities.habits.list.views
|
||||||
|
|
||||||
import androidx.appcompat.widget.*
|
|
||||||
import android.view.*
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
|
||||||
class HabitCardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
|
class HabitCardViewHolder(itemView: HabitCardView) : RecyclerView.ViewHolder(itemView)
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class IntentScheduler
|
|||||||
private val manager =
|
private val manager =
|
||||||
context.getSystemService(ALARM_SERVICE) as AlarmManager
|
context.getSystemService(ALARM_SERVICE) as AlarmManager
|
||||||
|
|
||||||
fun schedule(timestamp: Long, intent: PendingIntent) {
|
fun schedule(timestamp: Long, intent: PendingIntent, alarmType: Int) {
|
||||||
Log.d("IntentScheduler",
|
Log.d("IntentScheduler",
|
||||||
"timestamp=" + timestamp + " current=" + System.currentTimeMillis())
|
"timestamp=" + timestamp + " current=" + System.currentTimeMillis())
|
||||||
if (timestamp < System.currentTimeMillis()) {
|
if (timestamp < System.currentTimeMillis()) {
|
||||||
@@ -54,19 +54,24 @@ class IntentScheduler
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (SDK_INT >= M)
|
if (SDK_INT >= M)
|
||||||
manager.setExactAndAllowWhileIdle(RTC_WAKEUP, timestamp, intent)
|
manager.setExactAndAllowWhileIdle(alarmType, timestamp, intent)
|
||||||
else
|
else
|
||||||
manager.setExact(RTC_WAKEUP, timestamp, intent)
|
manager.setExact(alarmType, timestamp, intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun scheduleShowReminder(reminderTime: Long,
|
override fun scheduleShowReminder(reminderTime: Long,
|
||||||
habit: Habit,
|
habit: Habit,
|
||||||
timestamp: Long) {
|
timestamp: Long) {
|
||||||
val intent = pendingIntents.showReminder(habit, reminderTime, timestamp)
|
val intent = pendingIntents.showReminder(habit, reminderTime, timestamp)
|
||||||
schedule(reminderTime, intent)
|
schedule(reminderTime, intent, RTC_WAKEUP)
|
||||||
logReminderScheduled(habit, reminderTime)
|
logReminderScheduled(habit, reminderTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun scheduleWidgetUpdate(updateTime: Long) {
|
||||||
|
val intent = pendingIntents.updateWidgets()
|
||||||
|
schedule(updateTime, intent, RTC)
|
||||||
|
}
|
||||||
|
|
||||||
override fun log(componentName: String, msg: String) {
|
override fun log(componentName: String, msg: String) {
|
||||||
Log.d(componentName, msg)
|
Log.d(componentName, msg)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,4 +103,12 @@ class PendingIntentFactory
|
|||||||
if (timestamp != null) putExtra("timestamp", timestamp)
|
if (timestamp != null) putExtra("timestamp", timestamp)
|
||||||
},
|
},
|
||||||
FLAG_UPDATE_CURRENT)
|
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.preferences.*;
|
||||||
import org.isoron.uhabits.core.ui.widgets.*;
|
import org.isoron.uhabits.core.ui.widgets.*;
|
||||||
import org.isoron.uhabits.intents.*;
|
import org.isoron.uhabits.intents.*;
|
||||||
|
import org.isoron.uhabits.widgets.*;
|
||||||
|
|
||||||
import dagger.*;
|
import dagger.*;
|
||||||
|
|
||||||
@@ -48,6 +49,9 @@ public class WidgetReceiver extends BroadcastReceiver
|
|||||||
public static final String ACTION_TOGGLE_REPETITION =
|
public static final String ACTION_TOGGLE_REPETITION =
|
||||||
"org.isoron.uhabits.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";
|
private static final String TAG = "WidgetReceiver";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -64,13 +68,17 @@ public class WidgetReceiver extends BroadcastReceiver
|
|||||||
IntentParser parser = app.getComponent().getIntentParser();
|
IntentParser parser = app.getComponent().getIntentParser();
|
||||||
WidgetBehavior controller = component.getWidgetController();
|
WidgetBehavior controller = component.getWidgetController();
|
||||||
Preferences prefs = app.getComponent().getPreferences();
|
Preferences prefs = app.getComponent().getPreferences();
|
||||||
|
WidgetUpdater widgetUpdater = app.getComponent().getWidgetUpdater();
|
||||||
|
|
||||||
Log.i(TAG, String.format("Received intent: %s", intent.toString()));
|
Log.i(TAG, String.format("Received intent: %s", intent.toString()));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
IntentParser.CheckmarkIntentData data;
|
IntentParser.CheckmarkIntentData data = null;
|
||||||
data = parser.parseCheckmarkIntent(intent);
|
if (intent.getAction() != ACTION_UPDATE_WIDGETS_VALUE)
|
||||||
|
{
|
||||||
|
data = parser.parseCheckmarkIntent(intent);
|
||||||
|
}
|
||||||
|
|
||||||
switch (intent.getAction())
|
switch (intent.getAction())
|
||||||
{
|
{
|
||||||
@@ -100,6 +108,11 @@ public class WidgetReceiver extends BroadcastReceiver
|
|||||||
controller.onRemoveRepetition(data.getHabit(),
|
controller.onRemoveRepetition(data.getHabit(),
|
||||||
data.getTimestamp());
|
data.getTimestamp());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ACTION_UPDATE_WIDGETS_VALUE:
|
||||||
|
widgetUpdater.updateWidgets();
|
||||||
|
widgetUpdater.scheduleStartDayWidgetUpdate();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RuntimeException e)
|
catch (RuntimeException e)
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ import org.isoron.androidbase.*
|
|||||||
import org.isoron.uhabits.core.commands.*
|
import org.isoron.uhabits.core.commands.*
|
||||||
import org.isoron.uhabits.core.preferences.*
|
import org.isoron.uhabits.core.preferences.*
|
||||||
import org.isoron.uhabits.core.tasks.*
|
import org.isoron.uhabits.core.tasks.*
|
||||||
|
import org.isoron.uhabits.core.utils.*
|
||||||
|
import org.isoron.uhabits.intents.*
|
||||||
import javax.inject.*
|
import javax.inject.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,7 +38,8 @@ class WidgetUpdater
|
|||||||
@AppContext private val context: Context,
|
@AppContext private val context: Context,
|
||||||
private val commandRunner: CommandRunner,
|
private val commandRunner: CommandRunner,
|
||||||
private val taskRunner: TaskRunner,
|
private val taskRunner: TaskRunner,
|
||||||
private val widgetPrefs: WidgetPreferences
|
private val widgetPrefs: WidgetPreferences,
|
||||||
|
private val intentScheduler: IntentScheduler
|
||||||
) : CommandRunner.Listener {
|
) : CommandRunner.Listener {
|
||||||
|
|
||||||
override fun onCommandExecuted(command: Command, refreshKey: Long?) {
|
override fun onCommandExecuted(command: Command, refreshKey: Long?) {
|
||||||
@@ -60,6 +63,11 @@ class WidgetUpdater
|
|||||||
commandRunner.removeListener(this)
|
commandRunner.removeListener(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun scheduleStartDayWidgetUpdate() {
|
||||||
|
val timestamp = DateUtils.getStartOfTomorrow()
|
||||||
|
intentScheduler.scheduleWidgetUpdate(timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
fun updateWidgets(modifiedHabitId: Long?) {
|
fun updateWidgets(modifiedHabitId: Long?) {
|
||||||
taskRunner.execute {
|
taskRunner.execute {
|
||||||
updateWidgets(modifiedHabitId, CheckmarkWidgetProvider::class.java)
|
updateWidgets(modifiedHabitId, CheckmarkWidgetProvider::class.java)
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
1.8.11:
|
1.8.12:
|
||||||
* Fix theme issues on Xiaomi phones
|
* Fix bug that caused incorrect check marks to show after scrolling
|
||||||
|
* Fix issue preventing widgets from updating at midnight
|
||||||
|
|||||||
@@ -129,6 +129,8 @@
|
|||||||
<TextView style="@style/About.Item" android:text="Nikhil (regularcoder)"/>
|
<TextView style="@style/About.Item" android:text="Nikhil (regularcoder)"/>
|
||||||
<TextView style="@style/About.Item" android:text="JanetQC"/>
|
<TextView style="@style/About.Item" android:text="JanetQC"/>
|
||||||
<TextView style="@style/About.Item" android:text="olegivo"/>
|
<TextView style="@style/About.Item" android:text="olegivo"/>
|
||||||
|
<TextView style="@style/About.Item" android:text="Kristian Tashkov"/>
|
||||||
|
<TextView style="@style/About.Item" android:text="Quentin Hibon (hiqua)"/>
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tvContributors"
|
android:id="@+id/tvContributors"
|
||||||
style="@style/About.Item.Clickable"
|
style="@style/About.Item.Clickable"
|
||||||
|
|||||||
@@ -164,6 +164,8 @@ public class ReminderScheduler implements CommandRunner.Listener
|
|||||||
{
|
{
|
||||||
void scheduleShowReminder(long reminderTime, Habit habit, long timestamp);
|
void scheduleShowReminder(long reminderTime, Habit habit, long timestamp);
|
||||||
|
|
||||||
|
void scheduleWidgetUpdate(long updateTime);
|
||||||
|
|
||||||
void log(String componentName, String msg);
|
void log(String componentName, String msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -175,9 +175,14 @@ public abstract class DateUtils
|
|||||||
return getStartOfDay(getLocalTime());
|
return getStartOfDay(getLocalTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long getStartOfTomorrow()
|
||||||
|
{
|
||||||
|
return getUpcomingTimeInMillis(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
public static long millisecondsUntilTomorrow()
|
public static long millisecondsUntilTomorrow()
|
||||||
{
|
{
|
||||||
return getStartOfToday() + DAY_LENGTH - getLocalTime();
|
return getStartOfTomorrow() - getLocalTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static GregorianCalendar getStartOfTodayCalendar()
|
public static GregorianCalendar getStartOfTodayCalendar()
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ public class DateUtilsTest extends BaseUnitTest
|
|||||||
@Test
|
@Test
|
||||||
public void testMillisecondsUntilTomorrow() throws Exception
|
public void testMillisecondsUntilTomorrow() throws Exception
|
||||||
{
|
{
|
||||||
|
DateUtils.setFixedTimeZone(TimeZone.getTimeZone("GMT"));
|
||||||
DateUtils.setFixedLocalTime(unixTime(2017, JANUARY, 1, 23, 59));
|
DateUtils.setFixedLocalTime(unixTime(2017, JANUARY, 1, 23, 59));
|
||||||
assertThat(DateUtils.millisecondsUntilTomorrow(), equalTo(60000L));
|
assertThat(DateUtils.millisecondsUntilTomorrow(), equalTo(60000L));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user