From aa6b13f3a635574c0d9ca821ee7f54e342c89065 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 30 Mar 2019 20:36:14 -0500 Subject: [PATCH] Remove DateCalculator --- .gitignore | 13 +- core/build.gradle | 12 +- .../kotlin/org/isoron/platform/time/Dates.kt | 151 ++++++++++++++---- .../org/isoron/uhabits/backend/Backend.kt | 8 +- .../uhabits/components/CalendarChart.kt | 11 +- .../uhabits/components/HabitListHeader.kt | 5 +- .../isoron/uhabits/models/CheckmarkList.kt | 52 +++--- .../uhabits/models/CheckmarkRepository.kt | 14 +- .../org/isoron/platform/time/JavaDates.kt | 51 ++---- .../org/isoron/platform/JavaDatesTest.kt | 91 +++++++---- .../jvmTest/kotlin/org/isoron/uhabits/Base.kt | 2 - .../org/isoron/uhabits/backend/BackendTest.kt | 1 - .../uhabits/components/CalendarChartTest.kt | 1 - .../uhabits/components/HabitListHeaderTest.kt | 3 +- .../uhabits/models/CheckmarkListTest.kt | 26 ++- .../uhabits/models/CheckmarkRepositoryTest.kt | 2 +- ios/Application/AppDelegate.swift | 3 +- ...oller.swift => MainScreenController.swift} | 15 +- .../Frontend/ShowHabitController.swift | 1 - ios/Application/Platform/IosDates.swift | 32 ---- ios/uhabits.xcodeproj/project.pbxproj | 10 +- .../UserInterfaceState.xcuserstate | Bin 76200 -> 92828 bytes .../xcschemes/uhabits.xcscheme | 5 +- 23 files changed, 276 insertions(+), 233 deletions(-) rename ios/Application/Frontend/{ListHabitsController.swift => MainScreenController.swift} (94%) diff --git a/.gitignore b/.gitignore index 1e3603076..a8c758cef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,16 @@ *.iml +*.pbxuser +*.perspective +*.perspectivev3 +*.swp +*~.nib +.DS_Store +.externalNativeBuild .gradle -local.properties .idea -.DS_Store build +build/ captures -.externalNativeBuild +local.properties node_modules +*xcuserdata* diff --git a/core/build.gradle b/core/build.gradle index 8f9db33da..fc0db1931 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -26,7 +26,7 @@ buildscript { dependencies { classpath "com.android.tools.build:gradle:3.2.1" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.11" } } @@ -42,17 +42,11 @@ apply plugin:"kotlin-multiplatform" kotlin { targets { + def iosPreset = System.getenv('SDK_NAME')?.startsWith("iphoneos") ? presets.iosArm64 : presets.iosX64 fromPreset(presets.jvm, 'jvm') - - fromPreset(presets.iosX64, 'iOS') { + fromPreset(iosPreset, 'iOS') { compilations.main.outputKinds('FRAMEWORK') } - - // Replace the target above by the following one to produce a framework - // which can be installed on a real iPhone: - // fromPreset(presets.iosArm64, 'iOS') { - // compilations.main.outputKinds('FRAMEWORK') - // } } sourceSets { diff --git a/core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt b/core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt index d05fd2fb0..37ee103f3 100644 --- a/core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt +++ b/core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt @@ -31,48 +31,143 @@ enum class DayOfWeek(val index: Int) { SATURDAY(6), } -data class Timestamp(val unixTimeInMillis: Long) +data class Timestamp(val millisSince1970: Long) { + val localDate: LocalDate + get() { + val millisSince2000 = millisSince1970 - 946684800000 + val daysSince2000 = millisSince2000 / 86400000 + return LocalDate(daysSince2000.toInt()) + } +} + +data class LocalDate(val daysSince2000: Int) { + + var yearCache = -1 + var monthCache = -1 + var dayCache = -1 + + init { + if (daysSince2000 < 0) + throw IllegalArgumentException("$daysSince2000 < 0") + } + + constructor(year: Int, month: Int, day: Int) : + this(daysSince2000(year, month, day)) + + val dayOfWeek: DayOfWeek + get() { + return when (daysSince2000 % 7) { + 0 -> DayOfWeek.SATURDAY + 1 -> DayOfWeek.SUNDAY + 2 -> DayOfWeek.MONDAY + 3 -> DayOfWeek.TUESDAY + 4 -> DayOfWeek.WEDNESDAY + 5 -> DayOfWeek.THURSDAY + else -> DayOfWeek.FRIDAY + } + } + + val timestamp: Timestamp + get() { + return Timestamp(946684800000 + daysSince2000.toLong() * 86400000) + } + + val year: Int + get() { + if (yearCache < 0) updateYearMonthDayCache() + return yearCache + } + + val month: Int + get() { + if (monthCache < 0) updateYearMonthDayCache() + return monthCache + } + + val day: Int + get() { + if (dayCache < 0) updateYearMonthDayCache() + return dayCache + } + + private fun updateYearMonthDayCache() { + var currYear = 2000 + var currDay = 0 + + while (true) { + val currYearLength = if (isLeapYear(currYear)) 366 else 365 + if (daysSince2000 < currDay + currYearLength) { + yearCache = currYear + break + } else { + currYear++ + currDay += currYearLength + } + } + + var currMonth = 1 + val monthOffset = if (isLeapYear(currYear)) leapOffset else nonLeapOffset + + while (true) { + if (daysSince2000 < currDay + monthOffset[currMonth]) { + monthCache = currMonth + break + } else { + currMonth++ + } + } -data class LocalDate(val year: Int, - val month: Int, - val day: Int) { + currDay += monthOffset[currMonth - 1] + dayCache = daysSince2000 - currDay + 1 + + } fun isOlderThan(other: LocalDate): Boolean { - if (other.year != year) return other.year > year - if (other.month != month) return other.month > month - return other.day > day + return daysSince2000 < other.daysSince2000 } fun isNewerThan(other: LocalDate): Boolean { - if (this == other) return false - return other.isOlderThan(this) + return daysSince2000 > other.daysSince2000 } - init { - if ((month <= 0) or (month >= 13)) throw(IllegalArgumentException()) - if ((day <= 0) or (day >= 32)) throw(IllegalArgumentException()) + fun plus(days: Int): LocalDate { + return LocalDate(daysSince2000 + days) } -} -interface LocalDateCalculator { - fun plusDays(date: LocalDate, days: Int): LocalDate - fun dayOfWeek(date: LocalDate): DayOfWeek - fun toTimestamp(date: LocalDate): Timestamp - fun fromTimestamp(timestamp: Timestamp): LocalDate -} - -fun LocalDateCalculator.distanceInDays(d1: LocalDate, d2: LocalDate): Int { - val t1 = toTimestamp(d1) - val t2 = toTimestamp(d2) - val dayLength = 24 * 60 * 60 * 1000 - return abs((t2.unixTimeInMillis - t1.unixTimeInMillis) / dayLength).toInt() -} + fun minus(days: Int): LocalDate { + return LocalDate(daysSince2000 - days) + } -fun LocalDateCalculator.minusDays(date: LocalDate, days: Int): LocalDate { - return plusDays(date, -days) + fun distanceTo(other: LocalDate): Int { + return abs(daysSince2000 - other.daysSince2000) + } } interface LocalDateFormatter { fun shortWeekdayName(date: LocalDate): String fun shortMonthName(date: LocalDate): String +} + +private fun isLeapYear(year: Int): Boolean { + return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 +} + +val leapOffset = arrayOf(0, 31, 60, 91, 121, 152, 182, + 213, 244, 274, 305, 335, 366) +val nonLeapOffset = arrayOf(0, 31, 59, 90, 120, 151, 181, + 212, 243, 273, 304, 334, 365) + +private fun daysSince2000(year: Int, month: Int, day: Int): Int { + + var result = 365 * (year - 2000) + result += ceil((year - 2000) / 4.0).toInt() + result -= ceil((year - 2000) / 100.0).toInt() + result += ceil((year - 2000) / 400.0).toInt() + if (isLeapYear(year)) { + result += leapOffset[month - 1] + } else { + result += nonLeapOffset[month - 1] + } + result += (day - 1) + return result } \ No newline at end of file diff --git a/core/src/commonMain/kotlin/org/isoron/uhabits/backend/Backend.kt b/core/src/commonMain/kotlin/org/isoron/uhabits/backend/Backend.kt index 12310d3b9..53f2f3e56 100644 --- a/core/src/commonMain/kotlin/org/isoron/uhabits/backend/Backend.kt +++ b/core/src/commonMain/kotlin/org/isoron/uhabits/backend/Backend.kt @@ -30,7 +30,6 @@ class Backend(databaseName: String, databaseOpener: DatabaseOpener, fileOpener: FileOpener, val log: Log, - val dateCalculator: LocalDateCalculator, val taskRunner: TaskRunner) { val database: Database @@ -56,13 +55,12 @@ class Backend(databaseName: String, database = databaseOpener.open(dbFile) database.migrateTo(LOOP_DATABASE_VERSION, fileOpener, log) habitsRepository = HabitRepository(database) - checkmarkRepository = CheckmarkRepository(database, dateCalculator) + checkmarkRepository = CheckmarkRepository(database) taskRunner.runInBackground { habits.putAll(habitsRepository.findAll()) for ((key, habit) in habits) { val checks = checkmarkRepository.findAll(key) - checkmarks[habit] = CheckmarkList(habit.frequency, - dateCalculator) + checkmarks[habit] = CheckmarkList(habit.frequency) checkmarks[habit]?.setManualCheckmarks(checks) } } @@ -76,7 +74,7 @@ class Backend(databaseName: String, habit.id = id habit.position = habits.size habits[id] = habit - checkmarks[habit] = CheckmarkList(habit.frequency, dateCalculator) + checkmarks[habit] = CheckmarkList(habit.frequency) habitsRepository.insert(habit) mainScreenDataSource.requestData() } diff --git a/core/src/commonMain/kotlin/org/isoron/uhabits/components/CalendarChart.kt b/core/src/commonMain/kotlin/org/isoron/uhabits/components/CalendarChart.kt index 09c149830..02ba821c1 100644 --- a/core/src/commonMain/kotlin/org/isoron/uhabits/components/CalendarChart.kt +++ b/core/src/commonMain/kotlin/org/isoron/uhabits/components/CalendarChart.kt @@ -26,7 +26,6 @@ import kotlin.math.* class CalendarChart(var today: LocalDate, var color: Color, var theme: Theme, - var dateCalculator: LocalDateCalculator, var dateFormatter: LocalDateFormatter) : Component { var padding = 5.0 @@ -47,19 +46,19 @@ class CalendarChart(var today: LocalDate, canvas.setFontSize(height * 0.06) val nColumns = floor((width - 2 * padding) / squareSize).toInt() - 2 - val todayWeekday = dateCalculator.dayOfWeek(today) + val todayWeekday = today.dayOfWeek val topLeftOffset = (nColumns - 1 + scrollPosition) * 7 + todayWeekday.index - val topLeftDate = dateCalculator.minusDays(today, topLeftOffset) + val topLeftDate = today.minus(topLeftOffset) repeat(nColumns) { column -> val topOffset = topLeftOffset - 7 * column - val topDate = dateCalculator.plusDays(topLeftDate, 7 * column) + val topDate = topLeftDate.plus(7 * column) drawColumn(canvas, column, topDate, topOffset) } canvas.setColor(theme.mediumContrastTextColor) repeat(7) { row -> - val date = dateCalculator.plusDays(topLeftDate, row) + val date = topLeftDate.plus(row) canvas.setTextAlign(TextAlign.LEFT) canvas.drawText(dateFormatter.shortWeekdayName(date), padding + nColumns * squareSize + padding, @@ -74,7 +73,7 @@ class CalendarChart(var today: LocalDate, drawHeader(canvas, column, topDate) repeat(7) { row -> val offset = topOffset - row - val date = dateCalculator.plusDays(topDate, row) + val date = topDate.plus(row) if (offset < 0) return drawSquare(canvas, padding + column * squareSize, diff --git a/core/src/commonMain/kotlin/org/isoron/uhabits/components/HabitListHeader.kt b/core/src/commonMain/kotlin/org/isoron/uhabits/components/HabitListHeader.kt index 6d4ec6f28..f3e401fa4 100644 --- a/core/src/commonMain/kotlin/org/isoron/uhabits/components/HabitListHeader.kt +++ b/core/src/commonMain/kotlin/org/isoron/uhabits/components/HabitListHeader.kt @@ -25,8 +25,7 @@ import org.isoron.platform.time.* class HabitListHeader(private val today: LocalDate, private val nButtons: Int, private val theme: Theme, - private val fmt: LocalDateFormatter, - private val calc: LocalDateCalculator) : Component { + private val fmt: LocalDateFormatter) : Component { override fun draw(canvas: Canvas) { val width = canvas.getWidth() @@ -44,7 +43,7 @@ class HabitListHeader(private val today: LocalDate, canvas.setFontSize(theme.smallTextSize) repeat(nButtons) { index -> - val date = calc.minusDays(today, nButtons - index - 1) + val date = today.minus(nButtons - index - 1) val name = fmt.shortWeekdayName(date).toUpperCase() val number = date.day.toString() diff --git a/core/src/commonMain/kotlin/org/isoron/uhabits/models/CheckmarkList.kt b/core/src/commonMain/kotlin/org/isoron/uhabits/models/CheckmarkList.kt index 6856a3ae3..9a9be2b8d 100644 --- a/core/src/commonMain/kotlin/org/isoron/uhabits/models/CheckmarkList.kt +++ b/core/src/commonMain/kotlin/org/isoron/uhabits/models/CheckmarkList.kt @@ -24,8 +24,7 @@ import org.isoron.uhabits.models.Checkmark.Companion.CHECKED_AUTOMATIC import org.isoron.uhabits.models.Checkmark.Companion.CHECKED_MANUAL import org.isoron.uhabits.models.Checkmark.Companion.UNCHECKED -class CheckmarkList(private val frequency: Frequency, - private val dateCalculator: LocalDateCalculator) { +class CheckmarkList(private val frequency: Frequency) { private val manualCheckmarks = mutableListOf() private val automaticCheckmarks = mutableListOf() @@ -39,8 +38,7 @@ class CheckmarkList(private val frequency: Frequency, automaticCheckmarks.clear() manualCheckmarks.addAll(checks) automaticCheckmarks.addAll(computeAutomaticCheckmarks(checks, - frequency, - dateCalculator)) + frequency)) } /** @@ -56,7 +54,7 @@ class CheckmarkList(private val frequency: Frequency, val result = mutableListOf() val newest = automaticCheckmarks.first().date - val distToNewest = dateCalculator.distanceInDays(newest, date) + val distToNewest = newest.distanceTo(date) var fromIndex = 0 val toIndex = automaticCheckmarks.size @@ -75,13 +73,12 @@ class CheckmarkList(private val frequency: Frequency, * Computes the list of automatic checkmarks a list of manual ones. */ fun computeAutomaticCheckmarks(checks: List, - frequency: Frequency, - calc: LocalDateCalculator + frequency: Frequency ): MutableList { - val intervals = buildIntervals(checks, frequency, calc) - snapIntervalsTogether(intervals, calc) - return buildCheckmarksFromIntervals(checks, intervals, calc) + val intervals = buildIntervals(checks, frequency) + snapIntervalsTogether(intervals) + return buildCheckmarksFromIntervals(checks, intervals) } /** @@ -92,19 +89,17 @@ class CheckmarkList(private val frequency: Frequency, * the interval, however, still falls within the interval. The length of * the intervals are also not modified. */ - fun snapIntervalsTogether(intervals: MutableList, - calc: LocalDateCalculator) { + fun snapIntervalsTogether(intervals: MutableList) { for (i in 1 until intervals.size) { val (begin, center, end) = intervals[i] val (_, _, prevEnd) = intervals[i - 1] - val gap = calc.distanceInDays(prevEnd, begin) - 1 - val endMinusGap = calc.minusDays(end, gap) - if (gap <= 0 || endMinusGap.isOlderThan(center)) continue - intervals[i] = Interval(calc.minusDays(begin, gap), + val gap = prevEnd.distanceTo(begin) - 1 + if (gap <= 0 || end.minus(gap).isOlderThan(center)) continue + intervals[i] = Interval(begin.minus(gap), center, - calc.minusDays(end, gap)) + end.minus(gap)) } } @@ -119,8 +114,7 @@ class CheckmarkList(private val frequency: Frequency, * receive unchecked checkmarks. */ fun buildCheckmarksFromIntervals(checks: List, - intervals: List, - calc: LocalDateCalculator + intervals: List ): MutableList { if (checks.isEmpty()) throw IllegalArgumentException() @@ -137,25 +131,25 @@ class CheckmarkList(private val frequency: Frequency, if (check.date.isNewerThan(newest)) newest = check.date } - val distance = calc.distanceInDays(oldest, newest) + val distance = oldest.distanceTo(newest) val checkmarks = mutableListOf() for (offset in 0..distance) - checkmarks.add(Checkmark(calc.minusDays(newest, offset), + checkmarks.add(Checkmark(newest.minus(offset), UNCHECKED)) for (interval in intervals) { - val beginOffset = calc.distanceInDays(newest, interval.begin) - val endOffset = calc.distanceInDays(newest, interval.end) + val beginOffset = newest.distanceTo(interval.begin) + val endOffset = newest.distanceTo(interval.end) for (offset in endOffset..beginOffset) { checkmarks.set(offset, - Checkmark(calc.minusDays(newest, offset), + Checkmark(newest.minus(offset), CHECKED_AUTOMATIC)) } } for (check in checks) { - val offset = calc.distanceInDays(newest, check.date) + val offset = newest.distanceTo(check.date) checkmarks.set(offset, Checkmark(check.date, CHECKED_MANUAL)) } @@ -167,8 +161,7 @@ class CheckmarkList(private val frequency: Frequency, * checkmarks. */ fun buildIntervals(checks: List, - frequency: Frequency, - calc: LocalDateCalculator): MutableList { + frequency: Frequency): MutableList { val num = frequency.numerator val den = frequency.denominator @@ -178,10 +171,9 @@ class CheckmarkList(private val frequency: Frequency, val first = checks[i] val last = checks[i + num - 1] - val distance = calc.distanceInDays(first.date, last.date) - if (distance >= den) continue + if (first.date.distanceTo(last.date) >= den) continue - val end = calc.plusDays(first.date, den - 1) + val end = first.date.plus(den - 1) intervals.add(Interval(first.date, last.date, end)) } diff --git a/core/src/commonMain/kotlin/org/isoron/uhabits/models/CheckmarkRepository.kt b/core/src/commonMain/kotlin/org/isoron/uhabits/models/CheckmarkRepository.kt index 169ea4f0c..0b35bc275 100644 --- a/core/src/commonMain/kotlin/org/isoron/uhabits/models/CheckmarkRepository.kt +++ b/core/src/commonMain/kotlin/org/isoron/uhabits/models/CheckmarkRepository.kt @@ -22,8 +22,7 @@ package org.isoron.uhabits.models import org.isoron.platform.io.* import org.isoron.platform.time.* -class CheckmarkRepository(db: Database, - val dateCalculator: LocalDateCalculator) { +class CheckmarkRepository(db: Database) { private val findStatement = db.prepareStatement("select timestamp, value from Repetitions where habit = ? order by timestamp desc") private val insertStatement = db.prepareStatement("insert into Repetitions(habit, timestamp, value) values (?, ?, ?)") @@ -33,9 +32,8 @@ class CheckmarkRepository(db: Database, findStatement.bindInt(0, habitId) val result = mutableListOf() while (findStatement.step() == StepResult.ROW) { - val timestamp = Timestamp(findStatement.getLong(0)) + val date = Timestamp(findStatement.getLong(0)).localDate val value = findStatement.getInt(1) - val date = dateCalculator.fromTimestamp(timestamp) result.add(Checkmark(date, value)) } findStatement.reset() @@ -43,18 +41,18 @@ class CheckmarkRepository(db: Database, } fun insert(habitId: Int, checkmark: Checkmark) { - val timestamp = dateCalculator.toTimestamp(checkmark.date) + val timestamp = checkmark.date.timestamp insertStatement.bindInt(0, habitId) - insertStatement.bindLong(1, timestamp.unixTimeInMillis) + insertStatement.bindLong(1, timestamp.millisSince1970) insertStatement.bindInt(2, checkmark.value) insertStatement.step() insertStatement.reset() } fun delete(habitId: Int, date: LocalDate) { - val timestamp = dateCalculator.toTimestamp(date) + val timestamp = date.timestamp deleteStatement.bindInt(0, habitId) - deleteStatement.bindLong(1, timestamp.unixTimeInMillis) + deleteStatement.bindLong(1, timestamp.millisSince1970) deleteStatement.step() deleteStatement.reset() } diff --git a/core/src/jvmMain/kotlin/org/isoron/platform/time/JavaDates.kt b/core/src/jvmMain/kotlin/org/isoron/platform/time/JavaDates.kt index ae8c8e958..72a385aa3 100644 --- a/core/src/jvmMain/kotlin/org/isoron/platform/time/JavaDates.kt +++ b/core/src/jvmMain/kotlin/org/isoron/platform/time/JavaDates.kt @@ -19,19 +19,20 @@ package org.isoron.platform.time -import java.lang.Math.* import java.util.* import java.util.Calendar.* + fun LocalDate.toGregorianCalendar(): GregorianCalendar { - val cal = GregorianCalendar(TimeZone.getTimeZone("GMT")) - cal.set(Calendar.HOUR_OF_DAY, 0) - cal.set(Calendar.MINUTE, 0) - cal.set(Calendar.SECOND, 0) - cal.set(Calendar.MILLISECOND, 0) - cal.set(Calendar.YEAR, this.year) - cal.set(Calendar.MONTH, this.month - 1) - cal.set(Calendar.DAY_OF_MONTH, this.day) + val cal = GregorianCalendar() + cal.timeZone = TimeZone.getTimeZone("GMT") + cal.set(MILLISECOND, 0) + cal.set(SECOND, 0) + cal.set(MINUTE, 0) + cal.set(HOUR_OF_DAY, 0) + cal.set(YEAR, this.year) + cal.set(MONTH, this.month - 1) + cal.set(DAY_OF_MONTH, this.day) return cal } @@ -56,35 +57,3 @@ class JavaLocalDateFormatter(private val locale: Locale) : LocalDateFormatter { return cal.getDisplayName(DAY_OF_WEEK, SHORT, locale); } } - -class JavaLocalDateCalculator : LocalDateCalculator { - override fun toTimestamp(date: LocalDate): Timestamp { - val cal = date.toGregorianCalendar() - return Timestamp(cal.timeInMillis) - } - - override fun fromTimestamp(timestamp: Timestamp): LocalDate { - val cal = GregorianCalendar(TimeZone.getTimeZone("GMT")) - cal.timeInMillis = timestamp.unixTimeInMillis - return cal.toLocalDate() - } - - override fun dayOfWeek(date: LocalDate): DayOfWeek { - val cal = date.toGregorianCalendar() - return when (cal.get(DAY_OF_WEEK)) { - Calendar.SATURDAY -> DayOfWeek.SATURDAY - Calendar.SUNDAY -> DayOfWeek.SUNDAY - Calendar.MONDAY -> DayOfWeek.MONDAY - Calendar.TUESDAY -> DayOfWeek.TUESDAY - Calendar.WEDNESDAY -> DayOfWeek.WEDNESDAY - Calendar.THURSDAY -> DayOfWeek.THURSDAY - else -> DayOfWeek.FRIDAY - } - } - - override fun plusDays(date: LocalDate, days: Int): LocalDate { - val cal = date.toGregorianCalendar() - cal.add(Calendar.DAY_OF_MONTH, days) - return cal.toLocalDate() - } -} \ No newline at end of file diff --git a/core/src/jvmTest/kotlin/org/isoron/platform/JavaDatesTest.kt b/core/src/jvmTest/kotlin/org/isoron/platform/JavaDatesTest.kt index d88dfe577..e74d7b64c 100644 --- a/core/src/jvmTest/kotlin/org/isoron/platform/JavaDatesTest.kt +++ b/core/src/jvmTest/kotlin/org/isoron/platform/JavaDatesTest.kt @@ -23,10 +23,10 @@ import junit.framework.TestCase.* import org.isoron.platform.time.* import org.junit.* import java.util.* +import java.util.Calendar.* class JavaDatesTest { - private val calc = JavaLocalDateCalculator() private val d1 = LocalDate(2019, 3, 25) private val d2 = LocalDate(2019, 4, 4) private val d3 = LocalDate(2019, 5, 12) @@ -34,46 +34,46 @@ class JavaDatesTest { @Test fun plusMinusDays() { val today = LocalDate(2019, 3, 25) - assertEquals(calc.minusDays(today, 28), LocalDate(2019, 2, 25)) - assertEquals(calc.plusDays(today, 7), LocalDate(2019, 4, 1)) - assertEquals(calc.plusDays(today, 42), LocalDate(2019, 5, 6)) + assertEquals(today.minus(28), LocalDate(2019, 2, 25)) + assertEquals(today.plus(7), LocalDate(2019, 4, 1)) + assertEquals(today.plus(42), LocalDate(2019, 5, 6)) } @Test fun shortMonthName() { var fmt = JavaLocalDateFormatter(Locale.US) - assertEquals(fmt.shortWeekdayName(d1), "Mon") - assertEquals(fmt.shortWeekdayName(d2), "Thu") - assertEquals(fmt.shortWeekdayName(d3), "Sun") - assertEquals(fmt.shortMonthName(d1), "Mar") - assertEquals(fmt.shortMonthName(d2), "Apr") - assertEquals(fmt.shortMonthName(d3), "May") + assertEquals("Mon", fmt.shortWeekdayName(d1)) + assertEquals("Thu", fmt.shortWeekdayName(d2)) + assertEquals("Sun", fmt.shortWeekdayName(d3)) + assertEquals("Mar", fmt.shortMonthName(d1)) + assertEquals("Apr", fmt.shortMonthName(d2)) + assertEquals("May", fmt.shortMonthName(d3)) fmt = JavaLocalDateFormatter(Locale.JAPAN) - assertEquals(fmt.shortWeekdayName(d1), "月") - assertEquals(fmt.shortWeekdayName(d2), "木") - assertEquals(fmt.shortWeekdayName(d3), "日") - assertEquals(fmt.shortMonthName(d1), "3月") - assertEquals(fmt.shortMonthName(d2), "4月") - assertEquals(fmt.shortMonthName(d3), "5月") + assertEquals("月", fmt.shortWeekdayName(d1)) + assertEquals("木", fmt.shortWeekdayName(d2)) + assertEquals("日", fmt.shortWeekdayName(d3)) + assertEquals("3月", fmt.shortMonthName(d1)) + assertEquals("4月", fmt.shortMonthName(d2)) + assertEquals("5月", fmt.shortMonthName(d3)) } @Test fun weekDay() { - assertEquals(DayOfWeek.SUNDAY, calc.dayOfWeek(LocalDate(2015, 1, 25))) - assertEquals(DayOfWeek.MONDAY, calc.dayOfWeek(LocalDate(2017, 7, 3))) + assertEquals(DayOfWeek.SUNDAY, LocalDate(2015, 1, 25).dayOfWeek) + assertEquals(DayOfWeek.MONDAY, LocalDate(2017, 7, 3).dayOfWeek) } @Test fun timestamps() { val timestamps = listOf(Timestamp(1555977600000), Timestamp(968716800000), - Timestamp(0)) + Timestamp(946684800000)) val dates = listOf(LocalDate(2019, 4, 23), LocalDate(2000, 9, 12), - LocalDate(1970, 1, 1)) - assertEquals(timestamps, dates.map { d -> calc.toTimestamp(d) }) - assertEquals(dates, timestamps.map { t -> calc.fromTimestamp(t) }) + LocalDate(2000, 1, 1)) + assertEquals(timestamps, dates.map { d -> d.timestamp }) + assertEquals(dates, timestamps.map { t -> t.localDate }) } @Test @@ -96,10 +96,47 @@ class JavaDatesTest { val d2 = LocalDate(2019, 5, 30) val d3 = LocalDate(2019, 6, 5) - assertEquals(0, calc.distanceInDays(d1, d1)) - assertEquals(20, calc.distanceInDays(d1, d2)) - assertEquals(20, calc.distanceInDays(d2, d1)) - assertEquals(26, calc.distanceInDays(d1, d3)) - assertEquals(6, calc.distanceInDays(d2, d3)) + assertEquals(0, d1.distanceTo(d1)) + assertEquals(20, d1.distanceTo(d2)) + assertEquals(20, d2.distanceTo(d1)) + assertEquals(26, d1.distanceTo(d3)) + assertEquals(6, d2.distanceTo(d3)) + } + + @Test + fun gregorianCalendarConversion() { + fun check(cal: GregorianCalendar, daysSince2000: Int) { + val year = cal.get(YEAR) + val month = cal.get(MONTH) + 1 + val day = cal.get(DAY_OF_MONTH) + val weekday = cal.get(DAY_OF_WEEK) + val date = LocalDate(year, month, day) + val millisSince1970 = cal.timeInMillis + val msg = "date=$year-$month-$day offset=$daysSince2000" + + assertEquals(msg, daysSince2000, date.daysSince2000) + assertEquals(msg, year, date.year) + assertEquals(msg, month, date.month) + assertEquals(msg, day, date.day) + assertEquals(msg, weekday, date.dayOfWeek.index + 1) + assertEquals(msg, millisSince1970, date.timestamp.millisSince1970) + assertEquals(msg, date, date.timestamp.localDate) + } + + val cal = GregorianCalendar() + cal.timeZone = TimeZone.getTimeZone("GMT") + cal.set(MILLISECOND, 0) + cal.set(SECOND, 0) + cal.set(MINUTE, 0) + cal.set(HOUR_OF_DAY, 0) + cal.set(DAY_OF_MONTH, 1) + cal.set(MONTH, 0) + cal.set(YEAR, 2000) + + // Check all dates from year 2000 until 2400 + for(offset in 0..146097) { + check(cal, offset) + cal.add(DAY_OF_YEAR, 1) + } } } diff --git a/core/src/jvmTest/kotlin/org/isoron/uhabits/Base.kt b/core/src/jvmTest/kotlin/org/isoron/uhabits/Base.kt index e4a99dd18..75cbc83d7 100644 --- a/core/src/jvmTest/kotlin/org/isoron/uhabits/Base.kt +++ b/core/src/jvmTest/kotlin/org/isoron/uhabits/Base.kt @@ -38,8 +38,6 @@ open class BaseTest { val databaseOpener = JavaDatabaseOpener(log) - val dateCalculator = JavaLocalDateCalculator() - val taskRunner = SequentialTaskRunner() lateinit var db: Database diff --git a/core/src/jvmTest/kotlin/org/isoron/uhabits/backend/BackendTest.kt b/core/src/jvmTest/kotlin/org/isoron/uhabits/backend/BackendTest.kt index 5c845e194..3b9a4ff07 100644 --- a/core/src/jvmTest/kotlin/org/isoron/uhabits/backend/BackendTest.kt +++ b/core/src/jvmTest/kotlin/org/isoron/uhabits/backend/BackendTest.kt @@ -40,7 +40,6 @@ class BackendTest : BaseTest() { databaseOpener, fileOpener, log, - dateCalculator, taskRunner) } diff --git a/core/src/jvmTest/kotlin/org/isoron/uhabits/components/CalendarChartTest.kt b/core/src/jvmTest/kotlin/org/isoron/uhabits/components/CalendarChartTest.kt index 3474d0658..dae5670aa 100644 --- a/core/src/jvmTest/kotlin/org/isoron/uhabits/components/CalendarChartTest.kt +++ b/core/src/jvmTest/kotlin/org/isoron/uhabits/components/CalendarChartTest.kt @@ -32,7 +32,6 @@ class CalendarChartTest : BaseViewTest() { val component = CalendarChart(LocalDate(2015, 1, 25), theme.color(4), theme, - JavaLocalDateCalculator(), JavaLocalDateFormatter(Locale.US)) component.series = listOf(1.0, // today 0.2, 0.5, 0.7, 0.0, 0.3, 0.4, 0.6, diff --git a/core/src/jvmTest/kotlin/org/isoron/uhabits/components/HabitListHeaderTest.kt b/core/src/jvmTest/kotlin/org/isoron/uhabits/components/HabitListHeaderTest.kt index 6086575cc..3173328ca 100644 --- a/core/src/jvmTest/kotlin/org/isoron/uhabits/components/HabitListHeaderTest.kt +++ b/core/src/jvmTest/kotlin/org/isoron/uhabits/components/HabitListHeaderTest.kt @@ -30,8 +30,7 @@ class HabitListHeaderTest : BaseViewTest() { val header = HabitListHeader(LocalDate(2019, 3, 25), 5, theme, - JavaLocalDateFormatter(Locale.US), - JavaLocalDateCalculator()) + JavaLocalDateFormatter(Locale.US)) assertRenders(1200, 96, "components/HabitListHeader/light.png", header) diff --git a/core/src/jvmTest/kotlin/org/isoron/uhabits/models/CheckmarkListTest.kt b/core/src/jvmTest/kotlin/org/isoron/uhabits/models/CheckmarkListTest.kt index b85650784..6ecab8319 100644 --- a/core/src/jvmTest/kotlin/org/isoron/uhabits/models/CheckmarkListTest.kt +++ b/core/src/jvmTest/kotlin/org/isoron/uhabits/models/CheckmarkListTest.kt @@ -32,7 +32,7 @@ class CheckmarkListTest : BaseTest() { private val today = LocalDate(2019, 1, 30) private fun day(offset: Int): LocalDate { - return dateCalculator.minusDays(today, offset) + return today.minus(offset) } @Test @@ -45,8 +45,7 @@ class CheckmarkListTest : BaseTest() { CheckmarkList.Interval(day(18), day(18), day(12)), CheckmarkList.Interval(day(8), day(8), day(2))) val actual = CheckmarkList.buildIntervals(checks, - Frequency.WEEKLY, - dateCalculator) + Frequency.WEEKLY) assertEquals(expected, actual) } @@ -60,8 +59,7 @@ class CheckmarkListTest : BaseTest() { CheckmarkList.Interval(day(18), day(18), day(18)), CheckmarkList.Interval(day(8), day(8), day(8))) val actual = CheckmarkList.buildIntervals(checks, - Frequency.DAILY, - dateCalculator) + Frequency.DAILY) assertEquals(expected, actual) } @@ -77,8 +75,7 @@ class CheckmarkListTest : BaseTest() { CheckmarkList.Interval(day(22), day(18), day(16)), CheckmarkList.Interval(day(18), day(15), day(12))) val actual = CheckmarkList.buildIntervals(checks, - Frequency.TWO_TIMES_PER_WEEK, - dateCalculator) + Frequency.TWO_TIMES_PER_WEEK) assertEquals(expected, actual) } @@ -94,7 +91,7 @@ class CheckmarkListTest : BaseTest() { CheckmarkList.Interval(day(25), day(25), day(19)), CheckmarkList.Interval(day(18), day(16), day(12)), CheckmarkList.Interval(day(11), day(8), day(5))) - CheckmarkList.snapIntervalsTogether(original, dateCalculator) + CheckmarkList.snapIntervalsTogether(original) assertEquals(expected, original) } @@ -118,8 +115,7 @@ class CheckmarkListTest : BaseTest() { Checkmark(day(9), CHECKED_AUTOMATIC), Checkmark(day(10), CHECKED_MANUAL)) val actual = CheckmarkList.buildCheckmarksFromIntervals(checks, - intervals, - dateCalculator) + intervals) assertEquals(expected, actual) } @@ -134,8 +130,7 @@ class CheckmarkListTest : BaseTest() { Checkmark(day(4), CHECKED_AUTOMATIC), Checkmark(day(5), CHECKED_AUTOMATIC)) val actual = CheckmarkList.buildCheckmarksFromIntervals(reps, - intervals, - dateCalculator) + intervals) assertEquals(expected, actual) } @@ -158,14 +153,13 @@ class CheckmarkListTest : BaseTest() { Checkmark(day(9), CHECKED_AUTOMATIC), Checkmark(day(10), CHECKED_MANUAL)) val actual = CheckmarkList.computeAutomaticCheckmarks(checks, - Frequency(1, 3), - dateCalculator) + Frequency(1, 3)) assertEquals(expected, actual) } @Test fun testGetValuesUntil() { - val list = CheckmarkList(Frequency(1, 2), dateCalculator) + val list = CheckmarkList(Frequency(1, 2)) list.setManualCheckmarks(listOf(Checkmark(day(4), CHECKED_MANUAL), Checkmark(day(7), CHECKED_MANUAL))) val expected = listOf(UNCHECKED, @@ -188,7 +182,7 @@ class CheckmarkListTest : BaseTest() { @Test fun testGetValuesUntil2() { - val list = CheckmarkList(Frequency(1, 2), dateCalculator) + val list = CheckmarkList(Frequency(1, 2)) val expected = listOf() assertEquals(expected, list.getValuesUntil(day(0))) } diff --git a/core/src/jvmTest/kotlin/org/isoron/uhabits/models/CheckmarkRepositoryTest.kt b/core/src/jvmTest/kotlin/org/isoron/uhabits/models/CheckmarkRepositoryTest.kt index 8f8414621..55c09bf3f 100644 --- a/core/src/jvmTest/kotlin/org/isoron/uhabits/models/CheckmarkRepositoryTest.kt +++ b/core/src/jvmTest/kotlin/org/isoron/uhabits/models/CheckmarkRepositoryTest.kt @@ -39,7 +39,7 @@ class CheckmarkRepositoryTest : BaseTest() { Checkmark(LocalDate(2019, 1, 25), 450), Checkmark(LocalDate(2019, 1, 20), 1000)) - val repository = CheckmarkRepository(db, JavaLocalDateCalculator()) + val repository = CheckmarkRepository(db) for (c in checkmarksA) repository.insert(habitA, c) for (c in checkmarksB) repository.insert(habitB, c) diff --git a/ios/Application/AppDelegate.swift b/ios/Application/AppDelegate.swift index 5656064d4..436df40ba 100644 --- a/ios/Application/AppDelegate.swift +++ b/ios/Application/AppDelegate.swift @@ -26,7 +26,6 @@ import UIKit databaseOpener: IosDatabaseOpener(withLog: StandardLog()), fileOpener: IosFileOpener(), log: StandardLog(), - dateCalculator: IosLocalDateCalculator(), taskRunner: SequentialTaskRunner()) func application(_ application: UIApplication, @@ -35,7 +34,7 @@ import UIKit window = UIWindow(frame: UIScreen.main.bounds) if let window = window { let nav = UINavigationController() - nav.viewControllers = [ListHabitsController(withBackend: backend)] + nav.viewControllers = [MainScreenController(withBackend: backend)] window.backgroundColor = UIColor.white window.rootViewController = nav window.makeKeyAndVisible() diff --git a/ios/Application/Frontend/ListHabitsController.swift b/ios/Application/Frontend/MainScreenController.swift similarity index 94% rename from ios/Application/Frontend/ListHabitsController.swift rename to ios/Application/Frontend/MainScreenController.swift index 103885541..b5d1a36d7 100644 --- a/ios/Application/Frontend/ListHabitsController.swift +++ b/ios/Application/Frontend/MainScreenController.swift @@ -19,7 +19,7 @@ import UIKit -class ListHabitsCell : UITableViewCell { +class MainScreenCell : UITableViewCell { var ring: ComponentView var label = UILabel() var buttons: [ComponentView] = [] @@ -48,7 +48,7 @@ class ListHabitsCell : UITableViewCell { label.heightAnchor.constraint(equalToConstant: size).isActive = true stack.addArrangedSubview(label) - for _ in 1...4 { + for _ in 1...3 { let btn = ComponentView(frame: frame, component: nil) btn.backgroundColor = .white btn.widthAnchor.constraint(equalToConstant: size).isActive = true @@ -88,7 +88,7 @@ class ListHabitsCell : UITableViewCell { } } -class ListHabitsController: UITableViewController, MainScreenDataSourceListener { +class MainScreenController: UITableViewController, MainScreenDataSourceListener { var backend: Backend var dataSource: MainScreenDataSource var data: MainScreenDataSource.Data? @@ -119,7 +119,7 @@ class ListHabitsController: UITableViewController, MainScreenDataSourceListener target: self, action: #selector(self.onCreateHabitClicked)) ] - tableView.register(ListHabitsCell.self, forCellReuseIdentifier: "cell") + tableView.register(MainScreenCell.self, forCellReuseIdentifier: "cell") tableView.backgroundColor = theme.headerBackgroundColor.uicolor } @@ -140,7 +140,7 @@ class ListHabitsController: UITableViewController, MainScreenDataSourceListener override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row - let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ListHabitsCell + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MainScreenCell let color = theme.color(paletteIndex: data!.colors[row].index) cell.label.text = data!.names[row] cell.setColor(color) @@ -149,10 +149,9 @@ class ListHabitsController: UITableViewController, MainScreenDataSourceListener override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let component = HabitListHeader(today: LocalDate(year: 2019, month: 3, day: 24), - nButtons: 4, + nButtons: 3, theme: theme, - fmt: IosLocalDateFormatter(), - calc: IosLocalDateCalculator()) + fmt: IosLocalDateFormatter()) return ComponentView(frame: CGRect(x: 0, y: 0, width: 100, height: CGFloat(theme.checkmarkButtonSize)), component: component) } diff --git a/ios/Application/Frontend/ShowHabitController.swift b/ios/Application/Frontend/ShowHabitController.swift index 352f7170a..d85a7687a 100644 --- a/ios/Application/Frontend/ShowHabitController.swift +++ b/ios/Application/Frontend/ShowHabitController.swift @@ -47,7 +47,6 @@ class ShowHabitController : UITableViewController { let component = CalendarChart(today: LocalDate(year: 2019, month: 3, day: 15), color: color, theme: theme, - dateCalculator: IosLocalDateCalculator(), dateFormatter: IosLocalDateFormatter()) let cell = UITableViewCell() let view = ComponentView(frame: cell.frame, component: component) diff --git a/ios/Application/Platform/IosDates.swift b/ios/Application/Platform/IosDates.swift index 9c2da3be5..457f0878e 100644 --- a/ios/Application/Platform/IosDates.swift +++ b/ios/Application/Platform/IosDates.swift @@ -54,35 +54,3 @@ class IosLocalDateFormatter : NSObject, LocalDateFormatter { return fmt.string(from: date.iosDate) } } - -class IosLocalDateCalculator : NSObject, LocalDateCalculator { - func toTimestamp(date: LocalDate) -> Timestamp { - return Timestamp(unixTimeInMillis: Int64(date.iosDate.timeIntervalSince1970 * 1000)) - } - - func fromTimestamp(timestamp: Timestamp) -> LocalDate { - return Date.init(timeIntervalSince1970: Double(timestamp.unixTimeInMillis / 1000)).localDate - } - - let calendar = Calendar(identifier: .gregorian) - - func dayOfWeek(date: LocalDate) -> DayOfWeek { - let weekday = calendar.component(.weekday, from: date.iosDate) - switch(weekday) { - case 1: return DayOfWeek.sunday - case 2: return DayOfWeek.monday - case 3: return DayOfWeek.tuesday - case 4: return DayOfWeek.wednesday - case 5: return DayOfWeek.thursday - case 6: return DayOfWeek.friday - default: return DayOfWeek.saturday - } - } - - func plusDays(date: LocalDate, days: Int32) -> LocalDate { - let d2 = date.iosDate.addingTimeInterval(24.0 * 60 * 60 * Double(days)) - return LocalDate(year: Int32(calendar.component(.year, from: d2)), - month: Int32(calendar.component(.month, from: d2)), - day: Int32(calendar.component(.day, from: d2))) - } -} diff --git a/ios/uhabits.xcodeproj/project.pbxproj b/ios/uhabits.xcodeproj/project.pbxproj index d8e74fd21..85ffd573c 100644 --- a/ios/uhabits.xcodeproj/project.pbxproj +++ b/ios/uhabits.xcodeproj/project.pbxproj @@ -9,7 +9,7 @@ /* Begin PBXBuildFile section */ 0057EC2B224C4CDB00C49288 /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 0057EC2A224C4CDB00C49288 /* icons */; }; 00A5B42822009F590024E00C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A5B42722009F590024E00C /* AppDelegate.swift */; }; - 00A5B42A22009F590024E00C /* ListHabitsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A5B42922009F590024E00C /* ListHabitsController.swift */; }; + 00A5B42A22009F590024E00C /* MainScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A5B42922009F590024E00C /* MainScreenController.swift */; }; 00A5B42F22009F5A0024E00C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 00A5B42E22009F5A0024E00C /* Assets.xcassets */; }; 00C0C6A52246537A003D8AF0 /* IosFilesTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6A122465365003D8AF0 /* IosFilesTest.swift */; }; 00C0C6A62246537E003D8AF0 /* IosDatabaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6A222465365003D8AF0 /* IosDatabaseTest.swift */; }; @@ -59,7 +59,7 @@ 0057EC2A224C4CDB00C49288 /* icons */ = {isa = PBXFileReference; lastKnownFileType = folder; path = icons; sourceTree = ""; }; 00A5B42422009F590024E00C /* uhabits.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = uhabits.app; sourceTree = BUILT_PRODUCTS_DIR; }; 00A5B42722009F590024E00C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 00A5B42922009F590024E00C /* ListHabitsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListHabitsController.swift; sourceTree = ""; }; + 00A5B42922009F590024E00C /* MainScreenController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainScreenController.swift; sourceTree = ""; }; 00A5B42E22009F5A0024E00C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 00A5B43322009F5A0024E00C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00A5B43822009F5A0024E00C /* uhabitsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = uhabitsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -107,7 +107,7 @@ isa = PBXGroup; children = ( 00D48BD22200AC1600CC4527 /* EditHabitController.swift */, - 00A5B42922009F590024E00C /* ListHabitsController.swift */, + 00A5B42922009F590024E00C /* MainScreenController.swift */, 00C0C6DE224A35FC003D8AF0 /* ShowHabitController.swift */, ); path = Frontend; @@ -317,7 +317,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd ../core\n./gradlew linkDebugFrameworkIOS\n"; + shellScript = "cd ../core\n./gradlew linkIOS\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -332,7 +332,7 @@ 00C0C6E0224A3602003D8AF0 /* ShowHabitController.swift in Sources */, 00C0C6A8224654A2003D8AF0 /* IosDatabase.swift in Sources */, 00C0C6DB2247E6B0003D8AF0 /* IosDates.swift in Sources */, - 00A5B42A22009F590024E00C /* ListHabitsController.swift in Sources */, + 00A5B42A22009F590024E00C /* MainScreenController.swift in Sources */, 00A5B42822009F590024E00C /* AppDelegate.swift in Sources */, 00D48BD32200AC1600CC4527 /* EditHabitController.swift in Sources */, ); diff --git a/ios/uhabits.xcodeproj/project.xcworkspace/xcuserdata/isoron.xcuserdatad/UserInterfaceState.xcuserstate b/ios/uhabits.xcodeproj/project.xcworkspace/xcuserdata/isoron.xcuserdatad/UserInterfaceState.xcuserstate index 174c153cf8d918f85763d1ed68c3e0c8235489d6..767e37baf4e871818f9787c55fa0f92738f20804 100644 GIT binary patch literal 92828 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 - + - +