diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt index fcabf7815..0a2dbe487 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt @@ -19,7 +19,15 @@ import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import org.json.JSONArray import org.json.JSONException +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter +import java.time.format.DateTimeFormatterBuilder +import java.time.temporal.TemporalAccessor +import java.util.Calendar import java.util.Date +import java.util.GregorianCalendar open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { override val realmClass: Class @@ -194,6 +202,46 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { fun checkIfDue(): Boolean = isDue == true + fun getNextReminderOccurence(oldTime: String?): ZonedDateTime? { + if (oldTime == null) { + return null + } + val nextDate = nextDue?.firstOrNull() + + return if (nextDate != null && !isDisplayedActive) { + val nextDueCalendar = GregorianCalendar() + nextDueCalendar.time = nextDate + parse(oldTime) + ?.withYear(nextDueCalendar.get(Calendar.YEAR)) + ?.withMonth(nextDueCalendar.get(Calendar.MONTH)) + ?.withDayOfMonth(nextDueCalendar.get(Calendar.DAY_OF_MONTH)) + } else if (isDisplayedActive) { + parse(oldTime) + } else { + null + } + } + + fun formatter(): DateTimeFormatter = + DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE) + .appendPattern("['T'][' ']") + .append(DateTimeFormatter.ISO_LOCAL_TIME) + .appendPattern("[XX]") + .toFormatter() + + fun parse(dateTime: String): ZonedDateTime? { + val parsed: TemporalAccessor = formatter().parseBest( + dateTime, + ZonedDateTime::from, LocalDateTime::from + ) + return if (parsed is ZonedDateTime) { + parsed + } else { + val defaultZone: ZoneId = ZoneId.of("UTC") + (parsed as LocalDateTime).atZone(defaultZone) + } + } + fun parseMarkdown() { parsedText = MarkdownParser.parseMarkdown(text) parsedNotes = MarkdownParser.parseMarkdown(notes) diff --git a/common/src/main/res/values/colors.xml b/common/src/main/res/values/colors.xml index c4523e3ea..adef2cfa0 100644 --- a/common/src/main/res/values/colors.xml +++ b/common/src/main/res/values/colors.xml @@ -1,5 +1,7 @@ + #ffffff + #000000 #ffffff #000000 diff --git a/version.properties b/version.properties index c7da5e74c..836b20a4b 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ NAME=4.0 -CODE=4040 \ No newline at end of file +CODE=4050 \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt index 9b2689c61..7c8a4d8ae 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt @@ -4,6 +4,7 @@ import android.app.Application import android.content.Intent import com.habitrpg.common.habitica.extensions.setupCoil import com.habitrpg.common.habitica.helpers.MarkdownParser +import com.habitrpg.common.habitica.models.tasks.TaskType import com.habitrpg.wearos.habitica.data.repositories.TaskRepository import com.habitrpg.wearos.habitica.data.repositories.UserRepository import com.habitrpg.wearos.habitica.ui.activities.BaseActivity @@ -13,6 +14,8 @@ import dagger.hilt.android.HiltAndroidApp import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import javax.inject.Inject @@ -35,6 +38,13 @@ class MainApplication : Application() { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(intent) } else if (it.needsCron && BaseActivity.currentActivityClassName != RYAActivity::class.java.name) { + val dueDailies = taskRepository.getTasks(TaskType.DAILY) + .map { it.filter { task -> task.isDisplayedActive } } + .first() + if (dueDailies.isEmpty()) { + userRepository.runCron() + return@onEach + } val intent = Intent(this@MainApplication, RYAActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(intent) diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt index 88f7765ab..b545318ba 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt @@ -123,10 +123,6 @@ open class Task constructor(): Parcelable, BaseTask { } } - - - - override fun equals(other: Any?): Boolean { if (other == null) { return false diff --git a/wearos/src/main/res/values-w450dp/dimens.xml b/wearos/src/main/res/values-w450dp/dimens.xml new file mode 100644 index 000000000..4c85590d2 --- /dev/null +++ b/wearos/src/main/res/values-w450dp/dimens.xml @@ -0,0 +1,4 @@ + + + 12dp + \ No newline at end of file