From 9fd36d8d5326e00290c75cce6c6caa8075438101 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 3 Jan 2021 13:21:02 -0600 Subject: [PATCH] Move uhabits-core to top level; all Java files to uhabits-core:jvmMain/jvmTest --- android/gradle.properties | 2 +- android/settings.gradle | 2 +- android/uhabits-android/build.gradle | 5 +- android/uhabits-core-legacy/.gitignore | 1 - android/uhabits-core-legacy/build.gradle | 32 --- android/uhabits-core/build.gradle | 61 ------ .../assets/main/fonts/FontAwesome.ttf | Bin .../assets/main/fonts/NotoSans-Bold.ttf | Bin .../assets/main/fonts/NotoSans-Regular.ttf | Bin .../assets/test}/databases/021.db | Bin .../assets/test}/databases/022.db | Bin .../assets/test}/habitbull.csv | 0 .../assets/test/hello.txt | 0 .../assets/test}/loop.db | Bin .../assets/test}/rewire.db | Bin .../assets/test}/tickmate.db | Bin .../assets/test/views/BarChart/base.png | Bin .../assets/test/views/BarChart/offset.png | Bin .../assets/test/views/BarChart/themeDark.png | Bin .../test/views/BarChart/themeWidget.png | Bin .../assets/test/views/CanvasTest.png | Bin .../test/views/CheckmarkButton/explicit.png | Bin .../test/views/CheckmarkButton/implicit.png | Bin .../test/views/CheckmarkButton/unchecked.png | Bin .../test/views/HabitListHeader/light.png | Bin .../assets/test/views/HistoryChart/base.png | Bin .../assets/test/views/HistoryChart/scroll.png | Bin .../assets/test/views/HistoryChart/small.png | Bin .../test/views/HistoryChart/themeDark.png | Bin .../test/views/HistoryChart/themeWidget.png | Bin .../test/views/HistoryChart/weekday.png | Bin .../test/views/NumberButton/render_above.png | Bin .../test/views/NumberButton/render_below.png | Bin .../test/views/NumberButton/render_zero.png | Bin .../assets/test/views/Ring/draw1.png | Bin uhabits-core/build.gradle | 97 ++++++++++ uhabits-core/gradle.properties | 21 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58702 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + uhabits-core/gradlew | 183 ++++++++++++++++++ uhabits-core/gradlew.bat | 100 ++++++++++ .../kotlin/org/isoron/platform/gui/Canvas.kt | 0 .../kotlin/org/isoron/platform/gui/Color.kt | 0 .../org/isoron/platform/gui/FontAwesome.kt | 0 .../kotlin/org/isoron/platform/gui/Image.kt | 0 .../kotlin/org/isoron/platform/gui/View.kt | 0 .../kotlin/org/isoron/platform/io/Files.kt | 0 .../kotlin/org/isoron/platform/time/Dates.kt | 0 .../org/isoron/platform/gui/JavaCanvas.kt | 0 .../org/isoron/platform/gui/JavaImage.kt | 0 .../java}/org/isoron/platform/io/JavaFiles.kt | 0 .../java}/org/isoron/time/JavaDates.kt | 0 .../java/org/isoron/uhabits/core/AppScope.kt | 0 .../java/org/isoron/uhabits/core/Constants.kt | 0 .../core/commands/ArchiveHabitsCommand.kt | 0 .../core/commands/ChangeHabitColorCommand.kt | 0 .../isoron/uhabits/core/commands/Command.kt | 0 .../uhabits/core/commands/CommandRunner.kt | 0 .../core/commands/CreateHabitCommand.kt | 0 .../core/commands/CreateRepetitionCommand.kt | 0 .../core/commands/DeleteHabitsCommand.kt | 0 .../uhabits/core/commands/EditHabitCommand.kt | 0 .../core/commands/UnarchiveHabitsCommand.kt | 0 .../isoron/uhabits/core/database/Column.kt | 0 .../isoron/uhabits/core/database/Cursor.kt | 0 .../isoron/uhabits/core/database/Database.kt | 0 .../uhabits/core/database/DatabaseOpener.kt | 0 .../uhabits/core/database/JdbcCursor.kt | 0 .../uhabits/core/database/JdbcDatabase.kt | 0 .../uhabits/core/database/MigrationHelper.kt | 0 .../uhabits/core/database/Repository.kt | 0 .../isoron/uhabits/core/database/SQLParser.kt | 0 .../org/isoron/uhabits/core/database/Table.kt | 0 .../UnsupportedDatabaseVersionException.kt | 0 .../uhabits/core/io/AbstractImporter.kt | 0 .../isoron/uhabits/core/io/GenericImporter.kt | 0 .../uhabits/core/io/HabitBullCSVImporter.kt | 0 .../uhabits/core/io/HabitsCSVExporter.kt | 0 .../org/isoron/uhabits/core/io/Logging.kt | 0 .../isoron/uhabits/core/io/LoopDBImporter.kt | 0 .../uhabits/core/io/RewireDBImporter.kt | 0 .../uhabits/core/io/TickmateDBImporter.kt | 0 .../org/isoron/uhabits/core/models/Entry.kt | 0 .../isoron/uhabits/core/models/EntryList.kt | 0 .../isoron/uhabits/core/models/Frequency.kt | 0 .../org/isoron/uhabits/core/models/Habit.kt | 0 .../isoron/uhabits/core/models/HabitList.java | 0 .../uhabits/core/models/HabitMatcher.kt | 0 .../core/models/HabitMatcherBuilder.kt | 0 .../core/models/HabitNotFoundException.kt | 0 .../uhabits/core/models/ModelFactory.kt | 0 .../uhabits/core/models/ModelObservable.java | 0 .../uhabits/core/models/PaletteColor.kt | 0 .../isoron/uhabits/core/models/Reminder.kt | 0 .../org/isoron/uhabits/core/models/Score.kt | 0 .../isoron/uhabits/core/models/ScoreList.kt | 0 .../org/isoron/uhabits/core/models/Streak.kt | 0 .../isoron/uhabits/core/models/StreakList.kt | 0 .../isoron/uhabits/core/models/Timestamp.java | 0 .../uhabits/core/models/WeekdayList.java | 0 .../core/models/memory/MemoryHabitList.java | 0 .../core/models/memory/MemoryModelFactory.kt | 0 .../core/models/memory/package-info.java | 0 .../core/models/sqlite/SQLModelFactory.kt | 0 .../core/models/sqlite/SQLiteEntryList.kt | 0 .../core/models/sqlite/SQLiteHabitList.java | 0 .../core/models/sqlite/package-info.java | 0 .../models/sqlite/records/EntryRecord.java | 0 .../models/sqlite/records/HabitRecord.java | 0 .../uhabits/core/preferences/Preferences.java | 0 .../core/preferences/PropertiesStorage.java | 0 .../core/preferences/WidgetPreferences.java | 0 .../core/reminders/ReminderScheduler.java | 0 .../uhabits/core/sync/AbstractSyncServer.kt | 0 .../isoron/uhabits/core/sync/EncryptionExt.kt | 0 .../uhabits/core/sync/NetworkManager.kt | 0 .../org/isoron/uhabits/core/sync/SyncData.kt | 0 .../isoron/uhabits/core/sync/SyncException.kt | 0 .../isoron/uhabits/core/sync/SyncManager.kt | 0 .../uhabits/core/tasks/ExportCSVTask.java | 0 .../core/tasks/ExportCSVTaskFactory.kt | 0 .../core/tasks/SingleThreadTaskRunner.java | 0 .../org/isoron/uhabits/core/tasks/Task.java | 0 .../isoron/uhabits/core/tasks/TaskRunner.java | 0 .../uhabits/core/test/HabitFixtures.java | 0 .../uhabits/core/ui/NotificationTray.java | 0 .../isoron/uhabits/core/ui/ThemeSwitcher.java | 0 .../ui/callbacks/OnColorPickedCallback.java | 0 .../ui/callbacks/OnConfirmedCallback.java | 0 .../core/ui/callbacks/OnFinishedCallback.java | 0 .../ui/callbacks/OnToggleCheckmarkListener.kt | 0 .../habits/list/HabitCardListCache.java | 0 .../core/ui/screens/habits/list/HintList.java | 0 .../ui/screens/habits/list/HintListFactory.kt | 0 .../habits/list/ListHabitsBehavior.java | 0 .../habits/list/ListHabitsMenuBehavior.java | 0 .../list/ListHabitsSelectionMenuBehavior.java | 0 .../core/ui/screens/habits/show/ShowHabit.kt | 0 .../habits/show/ShowHabitMenuPresenter.kt | 0 .../ui/screens/habits/show/views/BarCard.kt | 0 .../habits/show/views/FrequencyCard.kt | 0 .../screens/habits/show/views/HistoryCard.kt | 0 .../ui/screens/habits/show/views/NotesCard.kt | 0 .../screens/habits/show/views/OverviewCard.kt | 0 .../ui/screens/habits/show/views/ScoreCard.kt | 0 .../screens/habits/show/views/StreakCart.kt | 0 .../screens/habits/show/views/SubtitleCard.kt | 0 .../screens/habits/show/views/TargetCard.kt | 0 .../core/ui/screens/sync/SyncBehavior.kt | 0 .../isoron/uhabits/core/ui/views/BarChart.kt | 0 .../uhabits/core/ui/views/CheckmarkButton.kt | 0 .../uhabits/core/ui/views/HabitListHeader.kt | 0 .../uhabits/core/ui/views/HistoryChart.kt | 0 .../uhabits/core/ui/views/NumberButton.kt | 0 .../org/isoron/uhabits/core/ui/views/Ring.kt | 0 .../isoron/uhabits/core/ui/views/Themes.kt | 0 .../core/ui/widgets/WidgetBehavior.java | 0 .../uhabits/core/utils/DateFormats.java | 0 .../isoron/uhabits/core/utils/DateUtils.java | 0 .../uhabits/core/utils/FileExtensions.kt | 0 .../uhabits/core/utils/MidnightTimer.java | 0 .../uhabits/core/utils/StringUtils.java | 0 .../src/jvmMain}/resources/migrations/09.sql | 0 .../src/jvmMain}/resources/migrations/10.sql | 0 .../src/jvmMain}/resources/migrations/11.sql | 0 .../src/jvmMain}/resources/migrations/12.sql | 0 .../src/jvmMain}/resources/migrations/13.sql | 0 .../src/jvmMain}/resources/migrations/14.sql | 0 .../src/jvmMain}/resources/migrations/15.sql | 0 .../src/jvmMain}/resources/migrations/16.sql | 0 .../src/jvmMain}/resources/migrations/17.sql | 0 .../src/jvmMain}/resources/migrations/18.sql | 0 .../src/jvmMain}/resources/migrations/19.sql | 0 .../src/jvmMain}/resources/migrations/20.sql | 0 .../src/jvmMain}/resources/migrations/21.sql | 0 .../src/jvmMain}/resources/migrations/22.sql | 0 .../src/jvmMain}/resources/migrations/23.sql | 0 .../src/jvmMain}/resources/migrations/24.sql | 0 .../org/isoron/platform/gui/JavaCanvasTest.kt | 0 .../org/isoron/uhabits/core/BaseUnitTest.java | 13 +- .../commands/ArchiveHabitsCommandTest.java | 0 .../commands/ChangeHabitColorCommandTest.java | 0 .../core/commands/CreateHabitCommandTest.java | 0 .../commands/CreateRepetitionCommandTest.java | 0 .../commands/DeleteHabitsCommandTest.java | 0 .../core/commands/EditHabitCommandTest.java | 0 .../commands/UnarchiveHabitsCommandTest.java | 0 .../uhabits/core/database/RepositoryTest.java | 0 .../database/migrations/Version22Test.java | 8 +- .../core/database/migrations/Version23Test.kt | 6 +- .../core/io/HabitsCSVExporterTest.java | 0 .../isoron/uhabits/core/io/ImportTest.java | 0 .../uhabits/core/models/EntryListTest.kt | 0 .../uhabits/core/models/HabitListTest.java | 0 .../isoron/uhabits/core/models/HabitTest.java | 0 .../uhabits/core/models/ScoreListTest.java | 0 .../isoron/uhabits/core/models/ScoreTest.java | 0 .../uhabits/core/models/StreakListTest.java | 0 .../uhabits/core/models/TimestampTest.java | 0 .../uhabits/core/models/WeekdayListTest.java | 0 .../core/models/sqlite/SQLiteEntryListTest.kt | 0 .../models/sqlite/SQLiteHabitListTest.java | 0 .../sqlite/records/EntryRecordTest.java | 0 .../sqlite/records/HabitRecordTest.java | 0 .../core/preferences/PreferencesTest.java | 0 .../preferences/PropertiesStorageTest.java | 0 .../core/reminders/ReminderSchedulerTest.java | 0 .../uhabits/core/sync/EncryptionExtTest.kt | 4 +- .../tasks/SingleThreadTaskRunnerTest.java | 0 .../habits/list/HabitCardListCacheTest.java | 0 .../ui/screens/habits/list/HintListTest.java | 0 .../habits/list/ListHabitsBehaviorTest.java | 0 .../list/ListHabitsMenuBehaviorTest.java | 0 .../ListHabitsSelectionMenuBehaviorTest.java | 0 .../show/ShowHabitMenuPresenterTest.java | 0 .../uhabits/core/ui/views/BarChartTest.kt | 0 .../uhabits/core/ui/views/HistoryChartTest.kt | 0 .../core/ui/widgets/WidgetBehaviorTest.java | 0 .../uhabits/core/utils/DateUtilsTest.java | 0 .../src/jvmTest/resources/databases/021.db | Bin 0 -> 32768 bytes .../src/jvmTest/resources/databases/022.db | Bin 0 -> 32768 bytes .../src/jvmTest/resources/habitbull.csv | 19 ++ uhabits-core/src/jvmTest/resources/loop.db | Bin 0 -> 53248 bytes uhabits-core/src/jvmTest/resources/rewire.db | Bin 0 -> 57344 bytes .../src/jvmTest/resources/tickmate.db | Bin 0 -> 32768 bytes 225 files changed, 444 insertions(+), 116 deletions(-) delete mode 100644 android/uhabits-core-legacy/.gitignore delete mode 100644 android/uhabits-core-legacy/build.gradle delete mode 100644 android/uhabits-core/build.gradle rename {android/uhabits-core-legacy => uhabits-core}/assets/main/fonts/FontAwesome.ttf (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/main/fonts/NotoSans-Bold.ttf (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/main/fonts/NotoSans-Regular.ttf (100%) rename {android/uhabits-core-legacy/src/test/resources => uhabits-core/assets/test}/databases/021.db (100%) rename {android/uhabits-core-legacy/src/test/resources => uhabits-core/assets/test}/databases/022.db (100%) rename {android/uhabits-core-legacy/src/test/resources => uhabits-core/assets/test}/habitbull.csv (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/hello.txt (100%) rename {android/uhabits-core-legacy/src/test/resources => uhabits-core/assets/test}/loop.db (100%) rename {android/uhabits-core-legacy/src/test/resources => uhabits-core/assets/test}/rewire.db (100%) rename {android/uhabits-core-legacy/src/test/resources => uhabits-core/assets/test}/tickmate.db (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/BarChart/base.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/BarChart/offset.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/BarChart/themeDark.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/BarChart/themeWidget.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/CanvasTest.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/CheckmarkButton/explicit.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/CheckmarkButton/implicit.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/CheckmarkButton/unchecked.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/HabitListHeader/light.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/HistoryChart/base.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/HistoryChart/scroll.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/HistoryChart/small.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/HistoryChart/themeDark.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/HistoryChart/themeWidget.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/HistoryChart/weekday.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/NumberButton/render_above.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/NumberButton/render_below.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/NumberButton/render_zero.png (100%) rename {android/uhabits-core-legacy => uhabits-core}/assets/test/views/Ring/draw1.png (100%) create mode 100644 uhabits-core/build.gradle create mode 100644 uhabits-core/gradle.properties create mode 100644 uhabits-core/gradle/wrapper/gradle-wrapper.jar create mode 100644 uhabits-core/gradle/wrapper/gradle-wrapper.properties create mode 100755 uhabits-core/gradlew create mode 100644 uhabits-core/gradlew.bat rename {android/uhabits-core => uhabits-core}/src/commonMain/kotlin/org/isoron/platform/gui/Canvas.kt (100%) rename {android/uhabits-core => uhabits-core}/src/commonMain/kotlin/org/isoron/platform/gui/Color.kt (100%) rename {android/uhabits-core => uhabits-core}/src/commonMain/kotlin/org/isoron/platform/gui/FontAwesome.kt (100%) rename {android/uhabits-core => uhabits-core}/src/commonMain/kotlin/org/isoron/platform/gui/Image.kt (100%) rename {android/uhabits-core => uhabits-core}/src/commonMain/kotlin/org/isoron/platform/gui/View.kt (100%) rename {android/uhabits-core => uhabits-core}/src/commonMain/kotlin/org/isoron/platform/io/Files.kt (100%) rename {android/uhabits-core => uhabits-core}/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt (100%) rename {android/uhabits-core/src/jvmMain/kotlin => uhabits-core/src/jvmMain/java}/org/isoron/platform/gui/JavaCanvas.kt (100%) rename {android/uhabits-core/src/jvmMain/kotlin => uhabits-core/src/jvmMain/java}/org/isoron/platform/gui/JavaImage.kt (100%) rename {android/uhabits-core/src/jvmMain/kotlin => uhabits-core/src/jvmMain/java}/org/isoron/platform/io/JavaFiles.kt (100%) rename {android/uhabits-core/src/jvmMain/kotlin => uhabits-core/src/jvmMain/java}/org/isoron/time/JavaDates.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/AppScope.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/Constants.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommand.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommand.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/commands/Command.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/commands/CommandRunner.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/commands/CreateHabitCommand.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/commands/DeleteHabitsCommand.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/commands/EditHabitCommand.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommand.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/Column.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/Cursor.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/Database.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/DatabaseOpener.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/JdbcCursor.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/JdbcDatabase.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/MigrationHelper.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/Repository.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/SQLParser.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/Table.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/database/UnsupportedDatabaseVersionException.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/io/AbstractImporter.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/io/GenericImporter.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/io/HabitBullCSVImporter.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/io/Logging.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/io/LoopDBImporter.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/io/RewireDBImporter.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/io/TickmateDBImporter.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/Entry.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/EntryList.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/Frequency.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/Habit.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/HabitList.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/HabitMatcher.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/HabitNotFoundException.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/ModelFactory.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/ModelObservable.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/PaletteColor.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/Reminder.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/Score.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/ScoreList.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/Streak.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/StreakList.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/Timestamp.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/WeekdayList.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/memory/package-info.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryList.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/sqlite/package-info.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecord.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecord.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/preferences/Preferences.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/preferences/PropertiesStorage.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/preferences/WidgetPreferences.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/reminders/ReminderScheduler.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/sync/AbstractSyncServer.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/sync/EncryptionExt.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/sync/NetworkManager.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/sync/SyncData.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/sync/SyncException.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/sync/SyncManager.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/tasks/ExportCSVTask.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/tasks/ExportCSVTaskFactory.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/tasks/Task.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/tasks/TaskRunner.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/test/HabitFixtures.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/NotificationTray.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/callbacks/OnColorPickedCallback.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/callbacks/OnConfirmedCallback.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/callbacks/OnFinishedCallback.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/callbacks/OnToggleCheckmarkListener.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/list/HintList.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListFactory.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabit.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenter.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/views/BarCard.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/views/FrequencyCard.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/views/NotesCard.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/views/OverviewCard.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/views/ScoreCard.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/views/StreakCart.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/views/SubtitleCard.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/habits/show/views/TargetCard.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/screens/sync/SyncBehavior.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/views/BarChart.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/views/CheckmarkButton.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/views/HabitListHeader.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/views/NumberButton.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/views/Ring.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/views/Themes.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/utils/DateFormats.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/utils/DateUtils.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/utils/FileExtensions.kt (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/utils/MidnightTimer.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/java/org/isoron/uhabits/core/utils/StringUtils.java (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/09.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/10.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/11.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/12.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/13.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/14.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/15.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/16.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/17.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/18.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/19.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/20.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/21.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/22.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/23.sql (100%) rename {android/uhabits-core-legacy/src/main => uhabits-core/src/jvmMain}/resources/migrations/24.sql (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/platform/gui/JavaCanvasTest.kt (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/BaseUnitTest.java (92%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommandTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommandTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/commands/CreateHabitCommandTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/commands/CreateRepetitionCommandTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/commands/DeleteHabitsCommandTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommandTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/database/RepositoryTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/database/migrations/Version22Test.java (98%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/database/migrations/Version23Test.kt (89%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/io/ImportTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/EntryListTest.kt (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/HabitListTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/HabitTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/ScoreListTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/ScoreTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/StreakListTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/TimestampTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/WeekdayListTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryListTest.kt (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecordTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecordTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/preferences/PreferencesTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/preferences/PropertiesStorageTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/sync/EncryptionExtTest.kt (95%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCacheTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehaviorTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenterTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/ui/views/BarChartTest.kt (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/ui/widgets/WidgetBehaviorTest.java (100%) rename {android/uhabits-core-legacy/src/test => uhabits-core/src/jvmTest}/java/org/isoron/uhabits/core/utils/DateUtilsTest.java (100%) create mode 100644 uhabits-core/src/jvmTest/resources/databases/021.db create mode 100644 uhabits-core/src/jvmTest/resources/databases/022.db create mode 100644 uhabits-core/src/jvmTest/resources/habitbull.csv create mode 100644 uhabits-core/src/jvmTest/resources/loop.db create mode 100644 uhabits-core/src/jvmTest/resources/rewire.db create mode 100644 uhabits-core/src/jvmTest/resources/tickmate.db diff --git a/android/gradle.properties b/android/gradle.properties index f5b9c95aa..87da1ae2b 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -10,7 +10,7 @@ KOTLIN_VERSION = 1.4.10 KX_COROUTINES_VERSION = 1.4.2 SUPPORT_LIBRARY_VERSION = 28.0.0 AUTO_FACTORY_VERSION = 1.0-beta6 -BUILD_TOOLS_VERSION = 4.1.0 +BUILD_TOOLS_VERSION = 4.0.0 KTOR_VERSION=1.4.2 ESPRESSO_VERSION=3.3.0 diff --git a/android/settings.gradle b/android/settings.gradle index fce649473..c32440e2f 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1 +1 @@ -include ':uhabits-android', ':uhabits-core-legacy', ':android-pickers', ':uhabits-core' +include ':uhabits-android', ':android-pickers' diff --git a/android/uhabits-android/build.gradle b/android/uhabits-android/build.gradle index 00f663580..320b4ace4 100644 --- a/android/uhabits-android/build.gradle +++ b/android/uhabits-android/build.gradle @@ -90,8 +90,6 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' androidTestImplementation 'androidx.test:rules:1.3.0' - androidTestImplementation project(':uhabits-core-legacy') - androidTestImplementation project(':uhabits-core') compileOnly "javax.annotation:jsr250-api:1.0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' implementation "com.github.paolorotolo:appintro:3.4.0" @@ -111,9 +109,8 @@ dependencies { implementation 'com.google.android.material:material:1.2.1' implementation 'com.google.zxing:core:3.4.1' implementation 'com.opencsv:opencsv:3.10' - implementation project(':uhabits-core-legacy') - implementation project(':uhabits-core') implementation project(":android-pickers") + implementation files("../../uhabits-core/build/libs/uhabits-core-jvm.jar") kapt "com.google.dagger:dagger-compiler:$DAGGER_VERSION" kaptAndroidTest "com.google.dagger:dagger-compiler:$DAGGER_VERSION" testImplementation "com.google.dagger:dagger:$DAGGER_VERSION" diff --git a/android/uhabits-core-legacy/.gitignore b/android/uhabits-core-legacy/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/android/uhabits-core-legacy/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/android/uhabits-core-legacy/build.gradle b/android/uhabits-core-legacy/build.gradle deleted file mode 100644 index f8c6dc82c..000000000 --- a/android/uhabits-core-legacy/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -apply plugin: 'idea' -apply plugin: 'java' -apply plugin: 'kotlin' - -dependencies { - annotationProcessor "com.google.auto.factory:auto-factory:$AUTO_FACTORY_VERSION" - annotationProcessor "com.google.dagger:dagger:$DAGGER_VERSION" - compileOnly "com.google.auto.factory:auto-factory:$AUTO_FACTORY_VERSION" - compileOnly "com.google.dagger:dagger:$DAGGER_VERSION" - compileOnly 'javax.annotation:jsr250-api:1.0' - compileOnly 'org.jetbrains:annotations:18.0.0' - implementation "com.google.guava:guava:30.0-jre" - implementation "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:$KX_COROUTINES_VERSION" - implementation 'androidx.annotation:annotation:1.1.0' - implementation 'com.google.code.findbugs:jsr305:3.0.2' - implementation 'commons-codec:commons-codec:1.15' - implementation 'org.apache.commons:commons-lang3:3.5' - implementation 'com.opencsv:opencsv:3.10' - implementation project(':uhabits-core') - testImplementation "org.jetbrains.kotlin:kotlin-reflect:$KOTLIN_VERSION" - testImplementation "org.jetbrains.kotlin:kotlin-test:$KOTLIN_VERSION" - testImplementation 'junit:junit:4.12' - testImplementation 'nl.jqno.equalsverifier:equalsverifier:2.4.8' - testImplementation 'org.apache.commons:commons-io:1.3.2' - testImplementation 'org.hamcrest:hamcrest-library:1.4-atlassian-1' - testImplementation 'org.mockito:mockito-core:2.28.2' - testImplementation 'org.xerial:sqlite-jdbc:3.18.0' -} - -sourceCompatibility = "1.8" -targetCompatibility = "1.8" diff --git a/android/uhabits-core/build.gradle b/android/uhabits-core/build.gradle deleted file mode 100644 index f6f16dafb..000000000 --- a/android/uhabits-core/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2016-2019 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -plugins { - id 'kotlin-multiplatform' -} - -repositories { - mavenCentral() -} - -kotlin { - jvm() - - sourceSets { - commonMain { - dependencies { - implementation kotlin('stdlib-common') - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.8" - } - } - - commonTest { - dependencies { - implementation kotlin('test-common') - implementation kotlin('test-annotations-common') - } - } - - jvmMain { - dependencies { - implementation kotlin('stdlib-jdk8') - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$KX_COROUTINES_VERSION" - } - } - - jvmTest { - dependencies { - implementation kotlin('test') - implementation kotlin('test-junit') - implementation 'org.xerial:sqlite-jdbc:3.25.2' - } - } - } -} diff --git a/android/uhabits-core-legacy/assets/main/fonts/FontAwesome.ttf b/uhabits-core/assets/main/fonts/FontAwesome.ttf similarity index 100% rename from android/uhabits-core-legacy/assets/main/fonts/FontAwesome.ttf rename to uhabits-core/assets/main/fonts/FontAwesome.ttf diff --git a/android/uhabits-core-legacy/assets/main/fonts/NotoSans-Bold.ttf b/uhabits-core/assets/main/fonts/NotoSans-Bold.ttf similarity index 100% rename from android/uhabits-core-legacy/assets/main/fonts/NotoSans-Bold.ttf rename to uhabits-core/assets/main/fonts/NotoSans-Bold.ttf diff --git a/android/uhabits-core-legacy/assets/main/fonts/NotoSans-Regular.ttf b/uhabits-core/assets/main/fonts/NotoSans-Regular.ttf similarity index 100% rename from android/uhabits-core-legacy/assets/main/fonts/NotoSans-Regular.ttf rename to uhabits-core/assets/main/fonts/NotoSans-Regular.ttf diff --git a/android/uhabits-core-legacy/src/test/resources/databases/021.db b/uhabits-core/assets/test/databases/021.db similarity index 100% rename from android/uhabits-core-legacy/src/test/resources/databases/021.db rename to uhabits-core/assets/test/databases/021.db diff --git a/android/uhabits-core-legacy/src/test/resources/databases/022.db b/uhabits-core/assets/test/databases/022.db similarity index 100% rename from android/uhabits-core-legacy/src/test/resources/databases/022.db rename to uhabits-core/assets/test/databases/022.db diff --git a/android/uhabits-core-legacy/src/test/resources/habitbull.csv b/uhabits-core/assets/test/habitbull.csv similarity index 100% rename from android/uhabits-core-legacy/src/test/resources/habitbull.csv rename to uhabits-core/assets/test/habitbull.csv diff --git a/android/uhabits-core-legacy/assets/test/hello.txt b/uhabits-core/assets/test/hello.txt similarity index 100% rename from android/uhabits-core-legacy/assets/test/hello.txt rename to uhabits-core/assets/test/hello.txt diff --git a/android/uhabits-core-legacy/src/test/resources/loop.db b/uhabits-core/assets/test/loop.db similarity index 100% rename from android/uhabits-core-legacy/src/test/resources/loop.db rename to uhabits-core/assets/test/loop.db diff --git a/android/uhabits-core-legacy/src/test/resources/rewire.db b/uhabits-core/assets/test/rewire.db similarity index 100% rename from android/uhabits-core-legacy/src/test/resources/rewire.db rename to uhabits-core/assets/test/rewire.db diff --git a/android/uhabits-core-legacy/src/test/resources/tickmate.db b/uhabits-core/assets/test/tickmate.db similarity index 100% rename from android/uhabits-core-legacy/src/test/resources/tickmate.db rename to uhabits-core/assets/test/tickmate.db diff --git a/android/uhabits-core-legacy/assets/test/views/BarChart/base.png b/uhabits-core/assets/test/views/BarChart/base.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/BarChart/base.png rename to uhabits-core/assets/test/views/BarChart/base.png diff --git a/android/uhabits-core-legacy/assets/test/views/BarChart/offset.png b/uhabits-core/assets/test/views/BarChart/offset.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/BarChart/offset.png rename to uhabits-core/assets/test/views/BarChart/offset.png diff --git a/android/uhabits-core-legacy/assets/test/views/BarChart/themeDark.png b/uhabits-core/assets/test/views/BarChart/themeDark.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/BarChart/themeDark.png rename to uhabits-core/assets/test/views/BarChart/themeDark.png diff --git a/android/uhabits-core-legacy/assets/test/views/BarChart/themeWidget.png b/uhabits-core/assets/test/views/BarChart/themeWidget.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/BarChart/themeWidget.png rename to uhabits-core/assets/test/views/BarChart/themeWidget.png diff --git a/android/uhabits-core-legacy/assets/test/views/CanvasTest.png b/uhabits-core/assets/test/views/CanvasTest.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/CanvasTest.png rename to uhabits-core/assets/test/views/CanvasTest.png diff --git a/android/uhabits-core-legacy/assets/test/views/CheckmarkButton/explicit.png b/uhabits-core/assets/test/views/CheckmarkButton/explicit.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/CheckmarkButton/explicit.png rename to uhabits-core/assets/test/views/CheckmarkButton/explicit.png diff --git a/android/uhabits-core-legacy/assets/test/views/CheckmarkButton/implicit.png b/uhabits-core/assets/test/views/CheckmarkButton/implicit.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/CheckmarkButton/implicit.png rename to uhabits-core/assets/test/views/CheckmarkButton/implicit.png diff --git a/android/uhabits-core-legacy/assets/test/views/CheckmarkButton/unchecked.png b/uhabits-core/assets/test/views/CheckmarkButton/unchecked.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/CheckmarkButton/unchecked.png rename to uhabits-core/assets/test/views/CheckmarkButton/unchecked.png diff --git a/android/uhabits-core-legacy/assets/test/views/HabitListHeader/light.png b/uhabits-core/assets/test/views/HabitListHeader/light.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/HabitListHeader/light.png rename to uhabits-core/assets/test/views/HabitListHeader/light.png diff --git a/android/uhabits-core-legacy/assets/test/views/HistoryChart/base.png b/uhabits-core/assets/test/views/HistoryChart/base.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/HistoryChart/base.png rename to uhabits-core/assets/test/views/HistoryChart/base.png diff --git a/android/uhabits-core-legacy/assets/test/views/HistoryChart/scroll.png b/uhabits-core/assets/test/views/HistoryChart/scroll.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/HistoryChart/scroll.png rename to uhabits-core/assets/test/views/HistoryChart/scroll.png diff --git a/android/uhabits-core-legacy/assets/test/views/HistoryChart/small.png b/uhabits-core/assets/test/views/HistoryChart/small.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/HistoryChart/small.png rename to uhabits-core/assets/test/views/HistoryChart/small.png diff --git a/android/uhabits-core-legacy/assets/test/views/HistoryChart/themeDark.png b/uhabits-core/assets/test/views/HistoryChart/themeDark.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/HistoryChart/themeDark.png rename to uhabits-core/assets/test/views/HistoryChart/themeDark.png diff --git a/android/uhabits-core-legacy/assets/test/views/HistoryChart/themeWidget.png b/uhabits-core/assets/test/views/HistoryChart/themeWidget.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/HistoryChart/themeWidget.png rename to uhabits-core/assets/test/views/HistoryChart/themeWidget.png diff --git a/android/uhabits-core-legacy/assets/test/views/HistoryChart/weekday.png b/uhabits-core/assets/test/views/HistoryChart/weekday.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/HistoryChart/weekday.png rename to uhabits-core/assets/test/views/HistoryChart/weekday.png diff --git a/android/uhabits-core-legacy/assets/test/views/NumberButton/render_above.png b/uhabits-core/assets/test/views/NumberButton/render_above.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/NumberButton/render_above.png rename to uhabits-core/assets/test/views/NumberButton/render_above.png diff --git a/android/uhabits-core-legacy/assets/test/views/NumberButton/render_below.png b/uhabits-core/assets/test/views/NumberButton/render_below.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/NumberButton/render_below.png rename to uhabits-core/assets/test/views/NumberButton/render_below.png diff --git a/android/uhabits-core-legacy/assets/test/views/NumberButton/render_zero.png b/uhabits-core/assets/test/views/NumberButton/render_zero.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/NumberButton/render_zero.png rename to uhabits-core/assets/test/views/NumberButton/render_zero.png diff --git a/android/uhabits-core-legacy/assets/test/views/Ring/draw1.png b/uhabits-core/assets/test/views/Ring/draw1.png similarity index 100% rename from android/uhabits-core-legacy/assets/test/views/Ring/draw1.png rename to uhabits-core/assets/test/views/Ring/draw1.png diff --git a/uhabits-core/build.gradle b/uhabits-core/build.gradle new file mode 100644 index 000000000..01a543383 --- /dev/null +++ b/uhabits-core/build.gradle @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2016-2019 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +//buildscript { +// repositories { +// google() +// jcenter() +// maven { url "https://plugins.gradle.org/m2/" } +// maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } +// } +// +// dependencies { +// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21" +// classpath "org.jlleitschuh.gradle:ktlint-gradle:9.4.1" +// } +//} + +plugins { + id "org.jetbrains.kotlin.multiplatform" version "1.4.21" +} + +repositories { + google() + jcenter() + mavenCentral() + maven { url "https://plugins.gradle.org/m2/" } + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } +} + +kotlin { + jvm { + withJava() + } + + sourceSets { + commonMain { + dependencies { + implementation kotlin('stdlib-common') + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.8" + } + } + + commonTest { + dependencies { + implementation kotlin('test-common') + implementation kotlin('test-annotations-common') + } + } + + jvmMain { + dependencies { + implementation kotlin('stdlib-jdk8') +// annotationProcessor "com.google.dagger:dagger:$DAGGER_VERSION" + compileOnly "com.google.dagger:dagger:$DAGGER_VERSION" +// compileOnly 'javax.annotation:jsr250-api:1.0' +// compileOnly 'org.jetbrains:annotations:18.0.0' + implementation "com.google.guava:guava:30.0-jre" + implementation "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:$KX_COROUTINES_VERSION" + implementation 'androidx.annotation:annotation:1.1.0' + implementation 'com.google.code.findbugs:jsr305:3.0.2' + implementation 'com.opencsv:opencsv:3.10' + implementation 'commons-codec:commons-codec:1.15' + implementation 'org.apache.commons:commons-lang3:3.5' + + } + } + + jvmTest { + dependencies { + implementation kotlin('test') + implementation kotlin('test-junit') + implementation 'org.xerial:sqlite-jdbc:3.25.2' + implementation 'org.hamcrest:hamcrest:2.1' + implementation 'nl.jqno.equalsverifier:equalsverifier:2.4.8' + implementation 'org.apache.commons:commons-io:1.3.2' + implementation 'org.mockito:mockito-core:2.28.2' + } + } + } +} diff --git a/uhabits-core/gradle.properties b/uhabits-core/gradle.properties new file mode 100644 index 000000000..87da1ae2b --- /dev/null +++ b/uhabits-core/gradle.properties @@ -0,0 +1,21 @@ +VERSION_CODE = 20001 +VERSION_NAME = 2.0.1-alpha + +MIN_SDK_VERSION = 23 +TARGET_SDK_VERSION = 29 +COMPILE_SDK_VERSION = 29 + +DAGGER_VERSION = 2.25.4 +KOTLIN_VERSION = 1.4.10 +KX_COROUTINES_VERSION = 1.4.2 +SUPPORT_LIBRARY_VERSION = 28.0.0 +AUTO_FACTORY_VERSION = 1.0-beta6 +BUILD_TOOLS_VERSION = 4.0.0 +KTOR_VERSION=1.4.2 +ESPRESSO_VERSION=3.3.0 + +org.gradle.parallel=false +org.gradle.daemon=true +org.gradle.jvmargs=-Xms2048m -Xmx2048m -XX:MaxPermSize=2048m +android.useAndroidX=true +android.enableJetifier=true diff --git a/uhabits-core/gradle/wrapper/gradle-wrapper.jar b/uhabits-core/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cc4fdc293d0e50b0ad9b65c16e7ddd1db2f6025b GIT binary patch literal 58702 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

@up^y4&I8N>~wvL%f(S2W%NN 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 D613UA literal 0 HcmV?d00001 diff --git a/uhabits-core/gradle/wrapper/gradle-wrapper.properties b/uhabits-core/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..2aa714b7c --- /dev/null +++ b/uhabits-core/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Nov 28 09:55:24 CST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip diff --git a/uhabits-core/gradlew b/uhabits-core/gradlew new file mode 100755 index 000000000..2fe81a7d9 --- /dev/null +++ b/uhabits-core/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/uhabits-core/gradlew.bat b/uhabits-core/gradlew.bat new file mode 100644 index 000000000..9618d8d96 --- /dev/null +++ b/uhabits-core/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Canvas.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Canvas.kt similarity index 100% rename from android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Canvas.kt rename to uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Canvas.kt diff --git a/android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Color.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Color.kt similarity index 100% rename from android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Color.kt rename to uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Color.kt diff --git a/android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/FontAwesome.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/FontAwesome.kt similarity index 100% rename from android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/FontAwesome.kt rename to uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/FontAwesome.kt diff --git a/android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Image.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Image.kt similarity index 100% rename from android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Image.kt rename to uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/Image.kt diff --git a/android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/View.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/View.kt similarity index 100% rename from android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/View.kt rename to uhabits-core/src/commonMain/kotlin/org/isoron/platform/gui/View.kt diff --git a/android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/io/Files.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/io/Files.kt similarity index 100% rename from android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/io/Files.kt rename to uhabits-core/src/commonMain/kotlin/org/isoron/platform/io/Files.kt diff --git a/android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt similarity index 100% rename from android/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt rename to uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt diff --git a/android/uhabits-core/src/jvmMain/kotlin/org/isoron/platform/gui/JavaCanvas.kt b/uhabits-core/src/jvmMain/java/org/isoron/platform/gui/JavaCanvas.kt similarity index 100% rename from android/uhabits-core/src/jvmMain/kotlin/org/isoron/platform/gui/JavaCanvas.kt rename to uhabits-core/src/jvmMain/java/org/isoron/platform/gui/JavaCanvas.kt diff --git a/android/uhabits-core/src/jvmMain/kotlin/org/isoron/platform/gui/JavaImage.kt b/uhabits-core/src/jvmMain/java/org/isoron/platform/gui/JavaImage.kt similarity index 100% rename from android/uhabits-core/src/jvmMain/kotlin/org/isoron/platform/gui/JavaImage.kt rename to uhabits-core/src/jvmMain/java/org/isoron/platform/gui/JavaImage.kt diff --git a/android/uhabits-core/src/jvmMain/kotlin/org/isoron/platform/io/JavaFiles.kt b/uhabits-core/src/jvmMain/java/org/isoron/platform/io/JavaFiles.kt similarity index 100% rename from android/uhabits-core/src/jvmMain/kotlin/org/isoron/platform/io/JavaFiles.kt rename to uhabits-core/src/jvmMain/java/org/isoron/platform/io/JavaFiles.kt diff --git a/android/uhabits-core/src/jvmMain/kotlin/org/isoron/time/JavaDates.kt b/uhabits-core/src/jvmMain/java/org/isoron/time/JavaDates.kt similarity index 100% rename from android/uhabits-core/src/jvmMain/kotlin/org/isoron/time/JavaDates.kt rename to uhabits-core/src/jvmMain/java/org/isoron/time/JavaDates.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/AppScope.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/AppScope.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/AppScope.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/AppScope.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/Constants.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/Constants.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/Constants.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/Constants.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommand.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommand.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommand.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommand.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommand.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommand.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommand.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommand.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/Command.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/Command.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/Command.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/Command.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/CommandRunner.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CommandRunner.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/CommandRunner.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CommandRunner.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/CreateHabitCommand.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CreateHabitCommand.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/CreateHabitCommand.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CreateHabitCommand.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/DeleteHabitsCommand.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/DeleteHabitsCommand.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/DeleteHabitsCommand.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/DeleteHabitsCommand.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/EditHabitCommand.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/EditHabitCommand.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/EditHabitCommand.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/EditHabitCommand.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommand.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommand.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommand.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommand.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Column.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Column.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Column.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Column.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Cursor.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Cursor.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Cursor.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Cursor.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Database.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Database.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Database.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Database.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/DatabaseOpener.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/DatabaseOpener.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/DatabaseOpener.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/DatabaseOpener.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/JdbcCursor.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/JdbcCursor.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/JdbcCursor.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/JdbcCursor.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/JdbcDatabase.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/JdbcDatabase.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/JdbcDatabase.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/JdbcDatabase.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/MigrationHelper.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/MigrationHelper.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/MigrationHelper.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/MigrationHelper.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Repository.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Repository.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Repository.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Repository.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/SQLParser.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/SQLParser.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/SQLParser.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/SQLParser.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Table.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Table.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/Table.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/Table.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/UnsupportedDatabaseVersionException.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/UnsupportedDatabaseVersionException.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/database/UnsupportedDatabaseVersionException.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/database/UnsupportedDatabaseVersionException.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/AbstractImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/AbstractImporter.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/AbstractImporter.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/AbstractImporter.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/GenericImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/GenericImporter.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/GenericImporter.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/GenericImporter.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/HabitBullCSVImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitBullCSVImporter.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/HabitBullCSVImporter.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitBullCSVImporter.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/Logging.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/Logging.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/Logging.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/Logging.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/LoopDBImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/LoopDBImporter.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/RewireDBImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/RewireDBImporter.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/RewireDBImporter.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/RewireDBImporter.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/TickmateDBImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/TickmateDBImporter.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/io/TickmateDBImporter.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/TickmateDBImporter.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Entry.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Entry.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Entry.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Entry.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/EntryList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/EntryList.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/EntryList.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/EntryList.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Frequency.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Frequency.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Frequency.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Frequency.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Habit.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Habit.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/HabitList.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/HabitList.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/HabitMatcher.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/HabitMatcher.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/HabitNotFoundException.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitNotFoundException.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/HabitNotFoundException.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitNotFoundException.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ModelFactory.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ModelFactory.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/ModelObservable.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ModelObservable.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/ModelObservable.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ModelObservable.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/PaletteColor.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/PaletteColor.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/PaletteColor.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/PaletteColor.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Reminder.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Reminder.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Reminder.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Reminder.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Score.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Score.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Score.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Score.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/ScoreList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/ScoreList.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Streak.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Streak.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Streak.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Streak.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/StreakList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/StreakList.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/StreakList.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/StreakList.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Timestamp.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Timestamp.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/Timestamp.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Timestamp.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/WeekdayList.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/WeekdayList.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/WeekdayList.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/WeekdayList.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/memory/package-info.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/package-info.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/memory/package-info.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/package-info.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryList.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryList.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryList.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/package-info.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/package-info.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/package-info.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/package-info.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecord.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecord.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecord.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecord.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecord.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecord.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecord.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecord.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/Preferences.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/Preferences.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/preferences/PropertiesStorage.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/PropertiesStorage.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/preferences/PropertiesStorage.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/PropertiesStorage.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/preferences/WidgetPreferences.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/WidgetPreferences.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/preferences/WidgetPreferences.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/WidgetPreferences.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/reminders/ReminderScheduler.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/reminders/ReminderScheduler.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/AbstractSyncServer.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/AbstractSyncServer.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/AbstractSyncServer.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/AbstractSyncServer.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/EncryptionExt.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/EncryptionExt.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/EncryptionExt.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/EncryptionExt.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/NetworkManager.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/NetworkManager.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/NetworkManager.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/NetworkManager.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/SyncData.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/SyncData.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/SyncData.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/SyncData.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/SyncException.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/SyncException.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/SyncException.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/SyncException.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/SyncManager.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/SyncManager.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/sync/SyncManager.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/sync/SyncManager.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/ExportCSVTask.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/ExportCSVTask.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/ExportCSVTask.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/ExportCSVTask.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/ExportCSVTaskFactory.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/ExportCSVTaskFactory.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/ExportCSVTaskFactory.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/ExportCSVTaskFactory.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/Task.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/Task.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/Task.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/Task.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/TaskRunner.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/TaskRunner.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/tasks/TaskRunner.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/TaskRunner.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/test/HabitFixtures.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/test/HabitFixtures.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/NotificationTray.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/NotificationTray.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/NotificationTray.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/NotificationTray.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnColorPickedCallback.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/callbacks/OnColorPickedCallback.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnColorPickedCallback.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/callbacks/OnColorPickedCallback.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnConfirmedCallback.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/callbacks/OnConfirmedCallback.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnConfirmedCallback.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/callbacks/OnConfirmedCallback.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnFinishedCallback.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/callbacks/OnFinishedCallback.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnFinishedCallback.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/callbacks/OnFinishedCallback.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnToggleCheckmarkListener.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/callbacks/OnToggleCheckmarkListener.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnToggleCheckmarkListener.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/callbacks/OnToggleCheckmarkListener.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HintList.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HintList.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HintList.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HintList.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListFactory.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListFactory.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListFactory.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListFactory.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabit.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabit.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabit.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabit.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenter.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenter.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenter.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/BarCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/BarCard.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/BarCard.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/BarCard.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/FrequencyCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/FrequencyCard.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/FrequencyCard.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/FrequencyCard.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/NotesCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/NotesCard.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/NotesCard.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/NotesCard.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/OverviewCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/OverviewCard.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/OverviewCard.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/OverviewCard.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/ScoreCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/ScoreCard.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/ScoreCard.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/ScoreCard.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/StreakCart.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/StreakCart.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/StreakCart.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/StreakCart.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/SubtitleCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/SubtitleCard.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/SubtitleCard.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/SubtitleCard.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/TargetCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/TargetCard.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/TargetCard.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/TargetCard.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/sync/SyncBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/sync/SyncBehavior.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/screens/sync/SyncBehavior.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/sync/SyncBehavior.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/BarChart.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/BarChart.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/BarChart.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/BarChart.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/CheckmarkButton.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/CheckmarkButton.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/CheckmarkButton.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/CheckmarkButton.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/HabitListHeader.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/HabitListHeader.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/HabitListHeader.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/HabitListHeader.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/NumberButton.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/NumberButton.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/NumberButton.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/NumberButton.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/Ring.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/Ring.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/Ring.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/Ring.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/Themes.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/Themes.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/views/Themes.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/Themes.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/DateFormats.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateFormats.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/DateFormats.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateFormats.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/DateUtils.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/DateUtils.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/FileExtensions.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/FileExtensions.kt similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/FileExtensions.kt rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/FileExtensions.kt diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/MidnightTimer.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/MidnightTimer.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.java diff --git a/android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/StringUtils.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/StringUtils.java similarity index 100% rename from android/uhabits-core-legacy/src/main/java/org/isoron/uhabits/core/utils/StringUtils.java rename to uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/StringUtils.java diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/09.sql b/uhabits-core/src/jvmMain/resources/migrations/09.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/09.sql rename to uhabits-core/src/jvmMain/resources/migrations/09.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/10.sql b/uhabits-core/src/jvmMain/resources/migrations/10.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/10.sql rename to uhabits-core/src/jvmMain/resources/migrations/10.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/11.sql b/uhabits-core/src/jvmMain/resources/migrations/11.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/11.sql rename to uhabits-core/src/jvmMain/resources/migrations/11.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/12.sql b/uhabits-core/src/jvmMain/resources/migrations/12.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/12.sql rename to uhabits-core/src/jvmMain/resources/migrations/12.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/13.sql b/uhabits-core/src/jvmMain/resources/migrations/13.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/13.sql rename to uhabits-core/src/jvmMain/resources/migrations/13.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/14.sql b/uhabits-core/src/jvmMain/resources/migrations/14.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/14.sql rename to uhabits-core/src/jvmMain/resources/migrations/14.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/15.sql b/uhabits-core/src/jvmMain/resources/migrations/15.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/15.sql rename to uhabits-core/src/jvmMain/resources/migrations/15.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/16.sql b/uhabits-core/src/jvmMain/resources/migrations/16.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/16.sql rename to uhabits-core/src/jvmMain/resources/migrations/16.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/17.sql b/uhabits-core/src/jvmMain/resources/migrations/17.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/17.sql rename to uhabits-core/src/jvmMain/resources/migrations/17.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/18.sql b/uhabits-core/src/jvmMain/resources/migrations/18.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/18.sql rename to uhabits-core/src/jvmMain/resources/migrations/18.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/19.sql b/uhabits-core/src/jvmMain/resources/migrations/19.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/19.sql rename to uhabits-core/src/jvmMain/resources/migrations/19.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/20.sql b/uhabits-core/src/jvmMain/resources/migrations/20.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/20.sql rename to uhabits-core/src/jvmMain/resources/migrations/20.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/21.sql b/uhabits-core/src/jvmMain/resources/migrations/21.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/21.sql rename to uhabits-core/src/jvmMain/resources/migrations/21.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/22.sql b/uhabits-core/src/jvmMain/resources/migrations/22.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/22.sql rename to uhabits-core/src/jvmMain/resources/migrations/22.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/23.sql b/uhabits-core/src/jvmMain/resources/migrations/23.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/23.sql rename to uhabits-core/src/jvmMain/resources/migrations/23.sql diff --git a/android/uhabits-core-legacy/src/main/resources/migrations/24.sql b/uhabits-core/src/jvmMain/resources/migrations/24.sql similarity index 100% rename from android/uhabits-core-legacy/src/main/resources/migrations/24.sql rename to uhabits-core/src/jvmMain/resources/migrations/24.sql diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/platform/gui/JavaCanvasTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/platform/gui/JavaCanvasTest.kt similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/platform/gui/JavaCanvasTest.kt rename to uhabits-core/src/jvmTest/java/org/isoron/platform/gui/JavaCanvasTest.kt diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/BaseUnitTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.java similarity index 92% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/BaseUnitTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.java index bf34936aa..3bd132e53 100644 --- a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/BaseUnitTest.java +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.java @@ -35,6 +35,7 @@ import org.junit.runner.*; import org.mockito.junit.*; import java.io.*; +import java.nio.file.Paths; import java.sql.*; import java.util.*; @@ -149,17 +150,13 @@ public class BaseUnitTest InputStream in = getClass().getResourceAsStream(assetPath); if (in != null) return in; - String basePath = "uhabits-core/src/test/resources/"; - File file = new File(basePath + assetPath); + String pwd = Paths.get(".").toAbsolutePath().normalize().toString(); + String fullPath = pwd + "/assets/test/" + assetPath; + File file = new File(fullPath); if (file.exists() && file.canRead()) in = new FileInputStream(file); if (in != null) return in; - basePath = "src/test/resources/"; - file = new File(basePath + assetPath); - if (file.exists() && file.canRead()) in = new FileInputStream(file); - if (in != null) return in; - - throw new IllegalStateException("asset not found: " + assetPath); + throw new IllegalStateException("asset not found: " + fullPath); } protected Database openDatabaseResource(String path) throws IOException diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommandTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommandTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommandTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommandTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommandTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommandTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommandTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommandTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/CreateHabitCommandTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/CreateHabitCommandTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/CreateHabitCommandTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/CreateHabitCommandTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/CreateRepetitionCommandTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/CreateRepetitionCommandTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/CreateRepetitionCommandTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/CreateRepetitionCommandTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/DeleteHabitsCommandTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/DeleteHabitsCommandTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/DeleteHabitsCommandTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/DeleteHabitsCommandTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommandTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommandTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommandTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommandTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/database/RepositoryTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/RepositoryTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/database/RepositoryTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/RepositoryTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/database/migrations/Version22Test.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/migrations/Version22Test.java similarity index 98% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/database/migrations/Version22Test.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/migrations/Version22Test.java index ff7e0969c..42629775d 100644 --- a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/database/migrations/Version22Test.java +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/migrations/Version22Test.java @@ -81,7 +81,7 @@ public class Version22Test extends BaseUnitTest public void testDisallowNewRepsWithInvalidRef() throws Exception { helper.migrateTo(22); - exception.expectMessage(containsString("FOREIGNKEY")); + exception.expectMessage(containsString("SQLITE_CONSTRAINT")); db.execute("insert into Repetitions(habit, timestamp, value) " + "values (99999, 100, 2)"); } @@ -103,7 +103,7 @@ public class Version22Test extends BaseUnitTest public void testDisallowNullTimestamp() throws Exception { helper.migrateTo(22); - exception.expectMessage(containsString("SQLITE_CONSTRAINT_NOTNULL")); + exception.expectMessage(containsString("SQLITE_CONSTRAINT")); db.execute("insert into Repetitions(habit, value) " + "values (0, 2)"); } @@ -124,7 +124,7 @@ public class Version22Test extends BaseUnitTest public void testDisallowNullHabit() throws Exception { helper.migrateTo(22); - exception.expectMessage(containsString("SQLITE_CONSTRAINT_NOTNULL")); + exception.expectMessage(containsString("SQLITE_CONSTRAINT")); db.execute( "insert into Repetitions(timestamp, value) " + "values (5, 2)"); } @@ -155,7 +155,7 @@ public class Version22Test extends BaseUnitTest helper.migrateTo(22); db.execute("insert into repetitions(habit, timestamp, value)" + "values (0, 100, 2)"); - exception.expectMessage(containsString("SQLITE_CONSTRAINT_UNIQUE")); + exception.expectMessage(containsString("SQLITE_CONSTRAINT")); db.execute("insert into repetitions(habit, timestamp, value)" + "values (0, 100, 5)"); } diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/database/migrations/Version23Test.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/migrations/Version23Test.kt similarity index 89% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/database/migrations/Version23Test.kt rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/migrations/Version23Test.kt index 3ecc5c8d6..72e9b5bb8 100644 --- a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/database/migrations/Version23Test.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/migrations/Version23Test.kt @@ -1,7 +1,7 @@ package org.isoron.uhabits.core.database.migrations +import org.hamcrest.CoreMatchers.equalTo import org.hamcrest.MatcherAssert -import org.hamcrest.Matchers import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.database.Database import org.isoron.uhabits.core.database.MigrationHelper @@ -47,7 +47,7 @@ class Version23Test : BaseUnitTest() { for (i in 0 until descriptions.size) { cursor.moveToNext() - MatcherAssert.assertThat(cursor.getString(0), Matchers.equalTo(descriptions[i])) + MatcherAssert.assertThat(cursor.getString(0), equalTo(descriptions[i])) } } @@ -57,7 +57,7 @@ class Version23Test : BaseUnitTest() { val cursor = db.query("select description from Habits") while (cursor.moveToNext()) { - MatcherAssert.assertThat(cursor.getString(0), Matchers.equalTo("")) + MatcherAssert.assertThat(cursor.getString(0), equalTo("")) } } } diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/io/ImportTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/ImportTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/io/ImportTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/ImportTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/EntryListTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/EntryListTest.kt similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/EntryListTest.kt rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/EntryListTest.kt diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/HabitListTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/HabitListTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/HabitTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/HabitTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/ScoreListTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/ScoreListTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/ScoreTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/ScoreTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/ScoreTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/ScoreTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/StreakListTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/StreakListTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/StreakListTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/StreakListTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/TimestampTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/TimestampTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/TimestampTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/TimestampTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/WeekdayListTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/WeekdayListTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/WeekdayListTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/WeekdayListTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryListTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryListTest.kt similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryListTest.kt rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryListTest.kt diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecordTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecordTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecordTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/records/EntryRecordTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecordTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecordTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecordTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecordTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/preferences/PreferencesTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/preferences/PreferencesTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/preferences/PreferencesTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/preferences/PreferencesTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/preferences/PropertiesStorageTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/preferences/PropertiesStorageTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/preferences/PropertiesStorageTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/preferences/PropertiesStorageTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/sync/EncryptionExtTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/sync/EncryptionExtTest.kt similarity index 95% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/sync/EncryptionExtTest.kt rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/sync/EncryptionExtTest.kt index 02cbe19bb..ac501cd78 100644 --- a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/sync/EncryptionExtTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/sync/EncryptionExtTest.kt @@ -19,7 +19,9 @@ package org.isoron.uhabits.core.sync import kotlinx.coroutines.runBlocking -import org.hamcrest.Matchers.equalTo +import org.hamcrest.CoreMatchers +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.Matchers import org.hamcrest.Matchers.greaterThan import org.junit.Assert.assertEquals import org.junit.Assert.assertThat diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCacheTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCacheTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCacheTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCacheTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehaviorTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehaviorTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehaviorTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehaviorTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenterTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenterTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenterTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuPresenterTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/views/BarChartTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/views/BarChartTest.kt similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/views/BarChartTest.kt rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/views/BarChartTest.kt diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/widgets/WidgetBehaviorTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/widgets/WidgetBehaviorTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/ui/widgets/WidgetBehaviorTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/widgets/WidgetBehaviorTest.java diff --git a/android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/utils/DateUtilsTest.java b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.java similarity index 100% rename from android/uhabits-core-legacy/src/test/java/org/isoron/uhabits/core/utils/DateUtilsTest.java rename to uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.java diff --git a/uhabits-core/src/jvmTest/resources/databases/021.db b/uhabits-core/src/jvmTest/resources/databases/021.db new file mode 100644 index 0000000000000000000000000000000000000000..850479ca0fd42a28698f5ee787fffad1bb357821 GIT binary patch literal 32768 zcmeI*O>Y}T00!V0JIUIPorOx(Di<`ZL5)>MYKsszpahFlR0x_NTB(w?-JRI0taqK= zaYzJ0aw>7+4;GDaT3`;>OIZcl})j2?0spb-eM;_dGK@&M1nr z_3=$laJCah9b2&1$xDP%@(yE!5JNr-@|hl%e6cXNP~lWQ&kwHWeKW}Vliw@F@5qvI zOw1pQh8}+C>kdJefbMrDI90Cx400bZafxjbgeg{ zM4X%#Hf}YpZ#UTX^>=SJSQ5t8nCCJt5WK}B){VT59UZb=e#q>e2))3Gc!vj~&g{r( zd;2^~TW3z_hf$if&RiZlk=GSo7%;&PWR{(X?=@W>4Abb4pw}6Ow7pi_mrpSa3hWLa zl+X=hPZv07V4cb4c!A5KW;^VSRGtOP*t8@zlG?Qo<19P~1q*tju%i|i&6B3vxBVWM?X`V2RiP}c7kEPVays_n#oF?ZFd&9L~nffUgNeL$mw)Ujz*GpP3NsMnYp$s%hx~O`4z)@+oFAQ zSdkM(d{B?@Iy@G3r@N&Bm!>P5l~&iNBGL-8QfmE$l3{&NrTt4;brJ7!p~pC$tn}6} zYP#y@DwMvgR^er-ycI2focC(B`ocNB>-r0kJu2!>=n>MV@>s)l&_CPcSPib8*fW}6 zTlto@)cSLDDQTCUr^yT~jJHh3%xYS{xT2S^en%J4*p~}XoSestNWx|nF>?uIGr871XVLtWE?MjA)X}z(|}Q%=RsJ*h|>5P$##AOHaf zKmY;|fB*y_009X6{{3VX@0ek ze4au{_9|~aB<4f&iTUi*b`cGS00bZa0SG_<0uX=z1Rwwb2)wug%L|1?O7A}So{{|E z^-sTiL2@M-UZi(_e)=m>zyHsh^0WD$nvdl-91ws21Rwwb2tWV=5P$##AOHafoEm|0 zevxEb|6DmYxYC>dG96s0?SD?~|K&gZ!vO&ZKmY;|fB*y_009U<00Izzz!?_!3q+6` A@&Et; literal 0 HcmV?d00001 diff --git a/uhabits-core/src/jvmTest/resources/databases/022.db b/uhabits-core/src/jvmTest/resources/databases/022.db new file mode 100644 index 0000000000000000000000000000000000000000..01237dfc8d4234f74a2cefe6f405f55b8bb01218 GIT binary patch literal 32768 zcmeI)&u$w<90%|jJBimO&Zd#56$zwKbFo#oP&o7mrL{yvRgurK{98~KE6^j&9HyYtVppZV=Xn|S?T z@2=E>^+V-z&E6-Qgi`V$V}y{)X0^xoEjeu5bQRuYO0?DksGL zp>ndZTi>evS$kZ2T;IxH7d3!92tWV=5P$##<`ww*cB#_X-lpGh&7XMUWBx?yDBG^w zzTdgk?Xd2xkM4F@md2V)x=aRI90y1;F(pQB?a6UlNN?yB+~{b z9c(kx9T~VnIfF1Ry!mOe$<140h0-n`MW^XOs96wup6PO*$DU?4-n-dmdNdTTFY>M_ zz}11!&b;N0xEBl4U+%GUZ)jSJ1F6%qJfC~zO6!eh4nvqiMm1)O_nxq z1}$&DHSXAz#?B7?YA?Mo3WW>1Yg3m2U}R}?$HZw6=A+zZCh8-8 zkk50GP)BA?E6l{Ljc>`1OTzhSd988vD*Y@)iw-?=SLsCJFiyjL`fzoMai(lDnfcqM zX3N}Rt}pb-2mf8~9@4eOwQIDO>hi!

!QzXzrTd@UzF|Dc{*#*7U+2_XO*99(7yE zO?-MM|H@4%$$jl6$;1Ky2tWV=5P$##AOHafKmY;|fWYDl)J+$u{Wmc`SReoa2tWV= z5P$##AOHafKmY;|_m#`=SY zlbx+Yw{HJs?*E??`?>wwBAp=m0s#m>00Izz00bZa0SG_<0uX?}#R4`h@6f{6mXxcd z@^&@*svlExvsgR({QnDLzp#I`Pl`F%hX4d1009U<00Izz00bZa0SG`~c?H(#DzR26 z4ZrCBPD(X%BGi6K?3eZ*_AkqOR_HkdAOHafKmY;|fB*y_009U<00J`twH0f%n*9MF k`Tzg)Cjw^5;t&E5fB*y_009U<00Izz00bZafu$Gt7dP<8fB*mh literal 0 HcmV?d00001 diff --git a/uhabits-core/src/jvmTest/resources/habitbull.csv b/uhabits-core/src/jvmTest/resources/habitbull.csv new file mode 100644 index 000000000..977a8e8df --- /dev/null +++ b/uhabits-core/src/jvmTest/resources/habitbull.csv @@ -0,0 +1,19 @@ +HabitName,HabitDescription,HabitCategory,CalendarDate,Value,CommentText +Breed dragons,with love and fire,Diet & Food,2016-03-18,1, +Breed dragons,with love and fire,Diet & Food,2016-03-19,1, +Breed dragons,with love and fire,Diet & Food,2016-03-21,1, +Reduce sleep,only 2 hours per day,Time Management,2016-03-15,1, +Reduce sleep,only 2 hours per day,Time Management,2016-03-16,1, +Reduce sleep,only 2 hours per day,Time Management,2016-03-17,1, +Reduce sleep,only 2 hours per day,Time Management,2016-03-21,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-15,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-16,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-18,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-21,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-15,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-16,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-18,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-21,1, +Grow spiritually,"transcend ego, practice compassion, smile and breath",Meditation,2016-03-15,1, +Grow spiritually,"transcend ego, practice compassion, smile and breath",Meditation,2016-03-17,1, +Grow spiritually,"transcend ego, practice compassion, smile and breath",Meditation,2016-03-21,1, diff --git a/uhabits-core/src/jvmTest/resources/loop.db b/uhabits-core/src/jvmTest/resources/loop.db new file mode 100644 index 0000000000000000000000000000000000000000..25f0f32cd9471930dac3dc90ec784e8a69f73588 GIT binary patch literal 53248 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