From 4f4ac804b5ebe0611d926ebb01ecb6c1a9d81bcb Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 3 Jun 2022 11:23:14 +0200 Subject: [PATCH] Very Very barebones wearos skeleton --- Habitica/res/values/strings.xml | 5 - .../main}/res/drawable-hdpi/add_daily.webp | Bin .../main}/res/drawable-hdpi/add_habit.webp | Bin .../main}/res/drawable-hdpi/add_rewards.webp | Bin .../src/main}/res/drawable-hdpi/add_todo.webp | Bin .../main}/res/drawable-hdpi/icon_dailies.webp | Bin .../main}/res/drawable-hdpi/icon_habits.webp | Bin .../main}/res/drawable-hdpi/icon_rewards.webp | Bin .../main}/res/drawable-hdpi/icon_todos.webp | Bin .../main}/res/drawable-mdpi/add_daily.webp | Bin .../main}/res/drawable-mdpi/add_habit.webp | Bin .../main}/res/drawable-mdpi/add_rewards.webp | Bin .../src/main}/res/drawable-mdpi/add_todo.webp | Bin .../main}/res/drawable-mdpi/icon_dailies.webp | Bin .../drawable-mdpi/icon_dailies_selected.png | Bin .../main}/res/drawable-mdpi/icon_habits.webp | Bin .../drawable-mdpi/icon_habits_selected.png | Bin .../main}/res/drawable-mdpi/icon_rewards.webp | Bin .../drawable-mdpi/icon_rewards_selected.png | Bin .../main}/res/drawable-mdpi/icon_todos.webp | Bin .../res/drawable-mdpi/icon_todos_selected.png | Bin .../main}/res/drawable-xhdpi/add_daily.webp | Bin .../main}/res/drawable-xhdpi/add_habit.webp | Bin .../main}/res/drawable-xhdpi/add_rewards.webp | Bin .../main}/res/drawable-xhdpi/add_todo.webp | Bin .../res/drawable-xhdpi/icon_dailies.webp | Bin .../drawable-xhdpi/icon_dailies_selected.png | Bin .../main}/res/drawable-xhdpi/icon_habits.webp | Bin .../drawable-xhdpi/icon_habits_selected.png | Bin .../res/drawable-xhdpi/icon_rewards.webp | Bin .../drawable-xhdpi/icon_rewards_selected.png | Bin .../main}/res/drawable-xhdpi/icon_todos.webp | Bin .../drawable-xhdpi/icon_todos_selected.png | Bin .../main}/res/drawable-xxhdpi/add_daily.webp | Bin .../main}/res/drawable-xxhdpi/add_habit.webp | Bin .../res/drawable-xxhdpi/add_rewards.webp | Bin .../main}/res/drawable-xxhdpi/add_todo.webp | Bin .../res/drawable-xxhdpi/icon_dailies.webp | Bin .../drawable-xxhdpi/icon_dailies_selected.png | Bin .../res/drawable-xxhdpi/icon_habits.webp | Bin .../drawable-xxhdpi/icon_habits_selected.png | Bin .../res/drawable-xxhdpi/icon_rewards.webp | Bin .../drawable-xxhdpi/icon_rewards_selected.png | Bin .../main}/res/drawable-xxhdpi/icon_todos.webp | Bin .../drawable-xxhdpi/icon_todos_selected.png | Bin common/src/main/res/values/strings.xml | 6 + wearos/build.gradle | 22 +++- wearos/src/main/AndroidManifest.xml | 1 + .../wearos/habitica/data/ApiClient.kt | 2 + .../wearos/habitica/data/ApiService.kt | 53 ++++---- .../wearos/habitica/data/DateJSONAdapter.kt | 80 ++++++++++++ .../data/repositories/TaskRepository.kt | 3 + .../habitrpg/wearos/habitica/models/Buffs.kt | 2 + .../habitrpg/wearos/habitica/models/Flags.kt | 2 + .../habitrpg/wearos/habitica/models/Hair.kt | 2 + .../habitrpg/wearos/habitica/models/Outfit.kt | 2 + .../wearos/habitica/models/Preferences.kt | 3 +- .../habitrpg/wearos/habitica/models/Stats.kt | 2 + .../habitrpg/wearos/habitica/models/User.kt | 4 + .../habitica/models/WearableHabitResponse.kt | 7 + .../models/tasks/BulkTaskScoringData.kt | 2 + .../habitica/models/tasks/ChecklistItem.kt | 25 ++-- .../wearos/habitica/models/tasks/Days.kt | 2 + .../habitica/models/tasks/RemindersItem.kt | 8 +- .../wearos/habitica/models/tasks/Tag.kt | 21 --- .../wearos/habitica/models/tasks/Task.kt | 34 ++--- .../habitica/models/tasks/TaskGroupPlan.kt | 19 --- .../wearos/habitica/models/tasks/TaskList.kt | 19 ++- .../wearos/habitica/models/tasks/TaskTag.kt | 6 - .../wearos/habitica/modules/AppModule.kt | 15 ++- .../habitica/ui/activities/BaseActivity.kt | 5 +- .../habitica/ui/activities/MainActivity.kt | 122 ++++++++++++++++++ .../ui/activities/TaskListActivity.kt | 39 ++++++ .../wearos/habitica/ui/adapters/HubAdapter.kt | 39 ++++++ .../habitica/ui/adapters/TaskListAdapter.kt | 35 +++++ .../habitica/ui/viewmodels/BaseViewModel.kt | 7 +- .../habitica/ui/viewmodels/MainViewModel.kt | 20 +++ .../ui/viewmodels/TaskListViewModel.kt | 24 ++++ .../src/main/res/drawable/row_background.xml | 5 + wearos/src/main/res/layout/activity_main.xml | 15 +-- .../src/main/res/layout/activity_tasklist.xml | 6 + wearos/src/main/res/layout/row_habit.xml | 19 +++ wearos/src/main/res/layout/row_hub.xml | 26 ++++ wearos/src/main/res/values-round/strings.xml | 3 - wearos/src/main/res/values/strings.xml | 5 - 85 files changed, 559 insertions(+), 158 deletions(-) rename {Habitica => common/src/main}/res/drawable-hdpi/add_daily.webp (100%) rename {Habitica => common/src/main}/res/drawable-hdpi/add_habit.webp (100%) rename {Habitica => common/src/main}/res/drawable-hdpi/add_rewards.webp (100%) rename {Habitica => common/src/main}/res/drawable-hdpi/add_todo.webp (100%) rename {Habitica => common/src/main}/res/drawable-hdpi/icon_dailies.webp (100%) rename {Habitica => common/src/main}/res/drawable-hdpi/icon_habits.webp (100%) rename {Habitica => common/src/main}/res/drawable-hdpi/icon_rewards.webp (100%) rename {Habitica => common/src/main}/res/drawable-hdpi/icon_todos.webp (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/add_daily.webp (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/add_habit.webp (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/add_rewards.webp (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/add_todo.webp (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/icon_dailies.webp (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/icon_dailies_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/icon_habits.webp (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/icon_habits_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/icon_rewards.webp (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/icon_rewards_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/icon_todos.webp (100%) rename {Habitica => common/src/main}/res/drawable-mdpi/icon_todos_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/add_daily.webp (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/add_habit.webp (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/add_rewards.webp (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/add_todo.webp (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/icon_dailies.webp (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/icon_dailies_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/icon_habits.webp (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/icon_habits_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/icon_rewards.webp (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/icon_rewards_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/icon_todos.webp (100%) rename {Habitica => common/src/main}/res/drawable-xhdpi/icon_todos_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/add_daily.webp (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/add_habit.webp (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/add_rewards.webp (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/add_todo.webp (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/icon_dailies.webp (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/icon_dailies_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/icon_habits.webp (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/icon_habits_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/icon_rewards.webp (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/icon_rewards_selected.png (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/icon_todos.webp (100%) rename {Habitica => common/src/main}/res/drawable-xxhdpi/icon_todos_selected.png (100%) create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/data/DateJSONAdapter.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/models/WearableHabitResponse.kt delete mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Tag.kt delete mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskGroupPlan.kt delete mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskTag.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/MainViewModel.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt create mode 100644 wearos/src/main/res/drawable/row_background.xml create mode 100644 wearos/src/main/res/layout/activity_tasklist.xml create mode 100644 wearos/src/main/res/layout/row_habit.xml create mode 100644 wearos/src/main/res/layout/row_hub.xml delete mode 100644 wearos/src/main/res/values-round/strings.xml diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 11688f4f9..2b86f63e2 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -129,10 +129,6 @@ %s\'s Party Chat Members - Habits - Dailies - To Do\'s - Rewards Yes No Discard @@ -603,7 +599,6 @@ Come back soon! Level 21-Day Streaks - Stats If you’ve encountered a bug or made a mistake that unfairly changed your character, you can manually correct those values here. Fix Character Values Saving diff --git a/Habitica/res/drawable-hdpi/add_daily.webp b/common/src/main/res/drawable-hdpi/add_daily.webp similarity index 100% rename from Habitica/res/drawable-hdpi/add_daily.webp rename to common/src/main/res/drawable-hdpi/add_daily.webp diff --git a/Habitica/res/drawable-hdpi/add_habit.webp b/common/src/main/res/drawable-hdpi/add_habit.webp similarity index 100% rename from Habitica/res/drawable-hdpi/add_habit.webp rename to common/src/main/res/drawable-hdpi/add_habit.webp diff --git a/Habitica/res/drawable-hdpi/add_rewards.webp b/common/src/main/res/drawable-hdpi/add_rewards.webp similarity index 100% rename from Habitica/res/drawable-hdpi/add_rewards.webp rename to common/src/main/res/drawable-hdpi/add_rewards.webp diff --git a/Habitica/res/drawable-hdpi/add_todo.webp b/common/src/main/res/drawable-hdpi/add_todo.webp similarity index 100% rename from Habitica/res/drawable-hdpi/add_todo.webp rename to common/src/main/res/drawable-hdpi/add_todo.webp diff --git a/Habitica/res/drawable-hdpi/icon_dailies.webp b/common/src/main/res/drawable-hdpi/icon_dailies.webp similarity index 100% rename from Habitica/res/drawable-hdpi/icon_dailies.webp rename to common/src/main/res/drawable-hdpi/icon_dailies.webp diff --git a/Habitica/res/drawable-hdpi/icon_habits.webp b/common/src/main/res/drawable-hdpi/icon_habits.webp similarity index 100% rename from Habitica/res/drawable-hdpi/icon_habits.webp rename to common/src/main/res/drawable-hdpi/icon_habits.webp diff --git a/Habitica/res/drawable-hdpi/icon_rewards.webp b/common/src/main/res/drawable-hdpi/icon_rewards.webp similarity index 100% rename from Habitica/res/drawable-hdpi/icon_rewards.webp rename to common/src/main/res/drawable-hdpi/icon_rewards.webp diff --git a/Habitica/res/drawable-hdpi/icon_todos.webp b/common/src/main/res/drawable-hdpi/icon_todos.webp similarity index 100% rename from Habitica/res/drawable-hdpi/icon_todos.webp rename to common/src/main/res/drawable-hdpi/icon_todos.webp diff --git a/Habitica/res/drawable-mdpi/add_daily.webp b/common/src/main/res/drawable-mdpi/add_daily.webp similarity index 100% rename from Habitica/res/drawable-mdpi/add_daily.webp rename to common/src/main/res/drawable-mdpi/add_daily.webp diff --git a/Habitica/res/drawable-mdpi/add_habit.webp b/common/src/main/res/drawable-mdpi/add_habit.webp similarity index 100% rename from Habitica/res/drawable-mdpi/add_habit.webp rename to common/src/main/res/drawable-mdpi/add_habit.webp diff --git a/Habitica/res/drawable-mdpi/add_rewards.webp b/common/src/main/res/drawable-mdpi/add_rewards.webp similarity index 100% rename from Habitica/res/drawable-mdpi/add_rewards.webp rename to common/src/main/res/drawable-mdpi/add_rewards.webp diff --git a/Habitica/res/drawable-mdpi/add_todo.webp b/common/src/main/res/drawable-mdpi/add_todo.webp similarity index 100% rename from Habitica/res/drawable-mdpi/add_todo.webp rename to common/src/main/res/drawable-mdpi/add_todo.webp diff --git a/Habitica/res/drawable-mdpi/icon_dailies.webp b/common/src/main/res/drawable-mdpi/icon_dailies.webp similarity index 100% rename from Habitica/res/drawable-mdpi/icon_dailies.webp rename to common/src/main/res/drawable-mdpi/icon_dailies.webp diff --git a/Habitica/res/drawable-mdpi/icon_dailies_selected.png b/common/src/main/res/drawable-mdpi/icon_dailies_selected.png similarity index 100% rename from Habitica/res/drawable-mdpi/icon_dailies_selected.png rename to common/src/main/res/drawable-mdpi/icon_dailies_selected.png diff --git a/Habitica/res/drawable-mdpi/icon_habits.webp b/common/src/main/res/drawable-mdpi/icon_habits.webp similarity index 100% rename from Habitica/res/drawable-mdpi/icon_habits.webp rename to common/src/main/res/drawable-mdpi/icon_habits.webp diff --git a/Habitica/res/drawable-mdpi/icon_habits_selected.png b/common/src/main/res/drawable-mdpi/icon_habits_selected.png similarity index 100% rename from Habitica/res/drawable-mdpi/icon_habits_selected.png rename to common/src/main/res/drawable-mdpi/icon_habits_selected.png diff --git a/Habitica/res/drawable-mdpi/icon_rewards.webp b/common/src/main/res/drawable-mdpi/icon_rewards.webp similarity index 100% rename from Habitica/res/drawable-mdpi/icon_rewards.webp rename to common/src/main/res/drawable-mdpi/icon_rewards.webp diff --git a/Habitica/res/drawable-mdpi/icon_rewards_selected.png b/common/src/main/res/drawable-mdpi/icon_rewards_selected.png similarity index 100% rename from Habitica/res/drawable-mdpi/icon_rewards_selected.png rename to common/src/main/res/drawable-mdpi/icon_rewards_selected.png diff --git a/Habitica/res/drawable-mdpi/icon_todos.webp b/common/src/main/res/drawable-mdpi/icon_todos.webp similarity index 100% rename from Habitica/res/drawable-mdpi/icon_todos.webp rename to common/src/main/res/drawable-mdpi/icon_todos.webp diff --git a/Habitica/res/drawable-mdpi/icon_todos_selected.png b/common/src/main/res/drawable-mdpi/icon_todos_selected.png similarity index 100% rename from Habitica/res/drawable-mdpi/icon_todos_selected.png rename to common/src/main/res/drawable-mdpi/icon_todos_selected.png diff --git a/Habitica/res/drawable-xhdpi/add_daily.webp b/common/src/main/res/drawable-xhdpi/add_daily.webp similarity index 100% rename from Habitica/res/drawable-xhdpi/add_daily.webp rename to common/src/main/res/drawable-xhdpi/add_daily.webp diff --git a/Habitica/res/drawable-xhdpi/add_habit.webp b/common/src/main/res/drawable-xhdpi/add_habit.webp similarity index 100% rename from Habitica/res/drawable-xhdpi/add_habit.webp rename to common/src/main/res/drawable-xhdpi/add_habit.webp diff --git a/Habitica/res/drawable-xhdpi/add_rewards.webp b/common/src/main/res/drawable-xhdpi/add_rewards.webp similarity index 100% rename from Habitica/res/drawable-xhdpi/add_rewards.webp rename to common/src/main/res/drawable-xhdpi/add_rewards.webp diff --git a/Habitica/res/drawable-xhdpi/add_todo.webp b/common/src/main/res/drawable-xhdpi/add_todo.webp similarity index 100% rename from Habitica/res/drawable-xhdpi/add_todo.webp rename to common/src/main/res/drawable-xhdpi/add_todo.webp diff --git a/Habitica/res/drawable-xhdpi/icon_dailies.webp b/common/src/main/res/drawable-xhdpi/icon_dailies.webp similarity index 100% rename from Habitica/res/drawable-xhdpi/icon_dailies.webp rename to common/src/main/res/drawable-xhdpi/icon_dailies.webp diff --git a/Habitica/res/drawable-xhdpi/icon_dailies_selected.png b/common/src/main/res/drawable-xhdpi/icon_dailies_selected.png similarity index 100% rename from Habitica/res/drawable-xhdpi/icon_dailies_selected.png rename to common/src/main/res/drawable-xhdpi/icon_dailies_selected.png diff --git a/Habitica/res/drawable-xhdpi/icon_habits.webp b/common/src/main/res/drawable-xhdpi/icon_habits.webp similarity index 100% rename from Habitica/res/drawable-xhdpi/icon_habits.webp rename to common/src/main/res/drawable-xhdpi/icon_habits.webp diff --git a/Habitica/res/drawable-xhdpi/icon_habits_selected.png b/common/src/main/res/drawable-xhdpi/icon_habits_selected.png similarity index 100% rename from Habitica/res/drawable-xhdpi/icon_habits_selected.png rename to common/src/main/res/drawable-xhdpi/icon_habits_selected.png diff --git a/Habitica/res/drawable-xhdpi/icon_rewards.webp b/common/src/main/res/drawable-xhdpi/icon_rewards.webp similarity index 100% rename from Habitica/res/drawable-xhdpi/icon_rewards.webp rename to common/src/main/res/drawable-xhdpi/icon_rewards.webp diff --git a/Habitica/res/drawable-xhdpi/icon_rewards_selected.png b/common/src/main/res/drawable-xhdpi/icon_rewards_selected.png similarity index 100% rename from Habitica/res/drawable-xhdpi/icon_rewards_selected.png rename to common/src/main/res/drawable-xhdpi/icon_rewards_selected.png diff --git a/Habitica/res/drawable-xhdpi/icon_todos.webp b/common/src/main/res/drawable-xhdpi/icon_todos.webp similarity index 100% rename from Habitica/res/drawable-xhdpi/icon_todos.webp rename to common/src/main/res/drawable-xhdpi/icon_todos.webp diff --git a/Habitica/res/drawable-xhdpi/icon_todos_selected.png b/common/src/main/res/drawable-xhdpi/icon_todos_selected.png similarity index 100% rename from Habitica/res/drawable-xhdpi/icon_todos_selected.png rename to common/src/main/res/drawable-xhdpi/icon_todos_selected.png diff --git a/Habitica/res/drawable-xxhdpi/add_daily.webp b/common/src/main/res/drawable-xxhdpi/add_daily.webp similarity index 100% rename from Habitica/res/drawable-xxhdpi/add_daily.webp rename to common/src/main/res/drawable-xxhdpi/add_daily.webp diff --git a/Habitica/res/drawable-xxhdpi/add_habit.webp b/common/src/main/res/drawable-xxhdpi/add_habit.webp similarity index 100% rename from Habitica/res/drawable-xxhdpi/add_habit.webp rename to common/src/main/res/drawable-xxhdpi/add_habit.webp diff --git a/Habitica/res/drawable-xxhdpi/add_rewards.webp b/common/src/main/res/drawable-xxhdpi/add_rewards.webp similarity index 100% rename from Habitica/res/drawable-xxhdpi/add_rewards.webp rename to common/src/main/res/drawable-xxhdpi/add_rewards.webp diff --git a/Habitica/res/drawable-xxhdpi/add_todo.webp b/common/src/main/res/drawable-xxhdpi/add_todo.webp similarity index 100% rename from Habitica/res/drawable-xxhdpi/add_todo.webp rename to common/src/main/res/drawable-xxhdpi/add_todo.webp diff --git a/Habitica/res/drawable-xxhdpi/icon_dailies.webp b/common/src/main/res/drawable-xxhdpi/icon_dailies.webp similarity index 100% rename from Habitica/res/drawable-xxhdpi/icon_dailies.webp rename to common/src/main/res/drawable-xxhdpi/icon_dailies.webp diff --git a/Habitica/res/drawable-xxhdpi/icon_dailies_selected.png b/common/src/main/res/drawable-xxhdpi/icon_dailies_selected.png similarity index 100% rename from Habitica/res/drawable-xxhdpi/icon_dailies_selected.png rename to common/src/main/res/drawable-xxhdpi/icon_dailies_selected.png diff --git a/Habitica/res/drawable-xxhdpi/icon_habits.webp b/common/src/main/res/drawable-xxhdpi/icon_habits.webp similarity index 100% rename from Habitica/res/drawable-xxhdpi/icon_habits.webp rename to common/src/main/res/drawable-xxhdpi/icon_habits.webp diff --git a/Habitica/res/drawable-xxhdpi/icon_habits_selected.png b/common/src/main/res/drawable-xxhdpi/icon_habits_selected.png similarity index 100% rename from Habitica/res/drawable-xxhdpi/icon_habits_selected.png rename to common/src/main/res/drawable-xxhdpi/icon_habits_selected.png diff --git a/Habitica/res/drawable-xxhdpi/icon_rewards.webp b/common/src/main/res/drawable-xxhdpi/icon_rewards.webp similarity index 100% rename from Habitica/res/drawable-xxhdpi/icon_rewards.webp rename to common/src/main/res/drawable-xxhdpi/icon_rewards.webp diff --git a/Habitica/res/drawable-xxhdpi/icon_rewards_selected.png b/common/src/main/res/drawable-xxhdpi/icon_rewards_selected.png similarity index 100% rename from Habitica/res/drawable-xxhdpi/icon_rewards_selected.png rename to common/src/main/res/drawable-xxhdpi/icon_rewards_selected.png diff --git a/Habitica/res/drawable-xxhdpi/icon_todos.webp b/common/src/main/res/drawable-xxhdpi/icon_todos.webp similarity index 100% rename from Habitica/res/drawable-xxhdpi/icon_todos.webp rename to common/src/main/res/drawable-xxhdpi/icon_todos.webp diff --git a/Habitica/res/drawable-xxhdpi/icon_todos_selected.png b/common/src/main/res/drawable-xxhdpi/icon_todos_selected.png similarity index 100% rename from Habitica/res/drawable-xxhdpi/icon_todos_selected.png rename to common/src/main/res/drawable-xxhdpi/icon_todos_selected.png diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index fede97fc8..684af62d3 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -15,4 +15,10 @@ Easy Medium Hard + Habits + Dailies + To Do\'s + Rewards + Stats + \ No newline at end of file diff --git a/wearos/build.gradle b/wearos/build.gradle index ccf508cb0..7b13587ab 100644 --- a/wearos/build.gradle +++ b/wearos/build.gradle @@ -30,14 +30,13 @@ android { } dependencies { - implementation 'androidx.core:core-ktx:1.7.0' implementation 'com.google.android.gms:play-services-wearable:17.1.0' implementation 'androidx.percentlayout:percentlayout:1.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation 'androidx.wear:wear:1.2.0' - + implementation "androidx.wear:wear-input:1.1.0" //Networking implementation 'com.squareup.okhttp3:okhttp:4.9.1' implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1' @@ -47,6 +46,7 @@ dependencies { } implementation('com.squareup.retrofit2:converter-moshi:2.9.0') implementation("com.squareup.moshi:moshi-kotlin:1.13.0") + kapt("com.squareup.moshi:moshi-kotlin-codegen:1.13.0") //Analytics implementation 'com.amplitude:android-sdk:3.35.1' @@ -72,4 +72,22 @@ dependencies { } repositories { mavenCentral() +} + +final File HRPG_PROPS_FILE = new File(projectDir.absolutePath + '/../habitica.properties') +if (HRPG_PROPS_FILE.canRead()) { + Properties HRPG_PROPS = new Properties() + HRPG_PROPS.load(new FileInputStream(HRPG_PROPS_FILE)) + + if (HRPG_PROPS != null) { + android.buildTypes.all { buildType -> + HRPG_PROPS.any { property -> + buildType.buildConfigField "String", property.key, "\"${property.value}\"" + } + } + } else { + throw new MissingResourceException('habitica.properties found but some entries are missing') + } +} else { + throw new MissingResourceException('habitica.properties not found') } \ No newline at end of file diff --git a/wearos/src/main/AndroidManifest.xml b/wearos/src/main/AndroidManifest.xml index 800bf5048..75d2faae2 100644 --- a/wearos/src/main/AndroidManifest.xml +++ b/wearos/src/main/AndroidManifest.xml @@ -35,6 +35,7 @@ + \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt index ee43eb0ed..d8cf7410f 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt @@ -96,4 +96,6 @@ class ApiClient @Inject constructor( suspend fun removePushDevice(id: String) = apiService.removePushDevice(id).data suspend fun runCron() = apiService.runCron().data + + suspend fun getTasks() = apiService.getTasks().data } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiService.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiService.kt index d318cd9a8..85eab155d 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiService.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiService.kt @@ -3,9 +3,9 @@ package com.habitrpg.wearos.habitica.data import com.habitrpg.common.habitica.models.auth.UserAuth import com.habitrpg.common.habitica.models.auth.UserAuthResponse import com.habitrpg.common.habitica.models.auth.UserAuthSocial -import com.habitrpg.common.habitica.models.responses.HabitResponse import com.habitrpg.common.habitica.models.responses.TaskDirectionData import com.habitrpg.wearos.habitica.models.User +import com.habitrpg.wearos.habitica.models.WearableHabitResponse import com.habitrpg.wearos.habitica.models.tasks.BulkTaskScoringData import com.habitrpg.wearos.habitica.models.tasks.Task import com.habitrpg.wearos.habitica.models.tasks.TaskList @@ -20,74 +20,77 @@ import retrofit2.http.Query interface ApiService { @GET("user/") - suspend fun getUser(): HabitResponse + suspend fun getUser(): WearableHabitResponse @PUT("user/") - suspend fun updateUser(@Body updateDictionary: Map): HabitResponse + suspend fun updateUser(@Body updateDictionary: Map): WearableHabitResponse @PUT("user/") - suspend fun registrationLanguage(@Header("Accept-Language") registrationLanguage: String): HabitResponse + suspend fun registrationLanguage(@Header("Accept-Language") registrationLanguage: String): WearableHabitResponse @GET("tasks/user") - suspend fun getTasks(@Query("type") type: String): HabitResponse + suspend fun getTasks(): WearableHabitResponse @GET("tasks/user") - suspend fun getTasks(@Query("type") type: String, @Query("dueDate") dueDate: String): HabitResponse + suspend fun getTasks(@Query("type") type: String): WearableHabitResponse + + @GET("tasks/user") + suspend fun getTasks(@Query("type") type: String, @Query("dueDate") dueDate: String): WearableHabitResponse @GET("tasks/{id}") - suspend fun getTask(@Path("id") id: String): HabitResponse + suspend fun getTask(@Path("id") id: String): WearableHabitResponse @POST("tasks/{id}/score/{direction}") - suspend fun postTaskDirection(@Path("id") id: String, @Path("direction") direction: String): HabitResponse + suspend fun postTaskDirection(@Path("id") id: String, @Path("direction") direction: String): WearableHabitResponse @POST("tasks/bulk-score") - suspend fun bulkScoreTasks(@Body data: List>): HabitResponse + suspend fun bulkScoreTasks(@Body data: List>): WearableHabitResponse @POST("tasks/{id}/move/to/{position}") - suspend fun postTaskNewPosition(@Path("id") id: String, @Path("position") position: Int): HabitResponse> + suspend fun postTaskNewPosition(@Path("id") id: String, @Path("position") position: Int): WearableHabitResponse> @POST("tasks/{taskId}/checklist/{itemId}/score") - suspend fun scoreChecklistItem(@Path("taskId") taskId: String, @Path("itemId") itemId: String): HabitResponse + suspend fun scoreChecklistItem(@Path("taskId") taskId: String, @Path("itemId") itemId: String): WearableHabitResponse @POST("tasks/user") - suspend fun createTask(@Body item: Task): HabitResponse + suspend fun createTask(@Body item: Task): WearableHabitResponse @POST("tasks/user") - suspend fun createTasks(@Body tasks: List): HabitResponse> + suspend fun createTasks(@Body tasks: List): WearableHabitResponse> @PUT("tasks/{id}") - suspend fun updateTask(@Path("id") id: String, @Body item: Task): HabitResponse + suspend fun updateTask(@Path("id") id: String, @Body item: Task): WearableHabitResponse @DELETE("tasks/{id}") - suspend fun deleteTask(@Path("id") id: String): HabitResponse + suspend fun deleteTask(@Path("id") id: String): WearableHabitResponse @POST("user/auth/local/register") - suspend fun registerUser(@Body auth: UserAuth): HabitResponse + suspend fun registerUser(@Body auth: UserAuth): WearableHabitResponse @POST("user/auth/local/login") - suspend fun connectLocal(@Body auth: UserAuth): HabitResponse + suspend fun connectLocal(@Body auth: UserAuth): WearableHabitResponse @POST("user/auth/social") - suspend fun connectSocial(@Body auth: UserAuthSocial): HabitResponse + suspend fun connectSocial(@Body auth: UserAuthSocial): WearableHabitResponse @DELETE("user/auth/social/{network}") - suspend fun disconnectSocial(@Path("network") network: String): HabitResponse + suspend fun disconnectSocial(@Path("network") network: String): WearableHabitResponse @POST("user/auth/apple") - suspend fun loginApple(@Body auth: Map): HabitResponse + suspend fun loginApple(@Body auth: Map): WearableHabitResponse @POST("user/sleep") - suspend fun sleep(): HabitResponse + suspend fun sleep(): WearableHabitResponse @POST("user/revive") - suspend fun revive(): HabitResponse + suspend fun revive(): WearableHabitResponse // Push notifications @POST("user/push-devices") - suspend fun addPushDevice(@Body pushDeviceData: Map): HabitResponse> + suspend fun addPushDevice(@Body pushDeviceData: Map): WearableHabitResponse> @DELETE("user/push-devices/{regId}") - suspend fun removePushDevice(@Path("regId") regId: String): HabitResponse> + suspend fun removePushDevice(@Path("regId") regId: String): WearableHabitResponse> @POST("cron") - suspend fun runCron(): HabitResponse + suspend fun runCron(): WearableHabitResponse } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/DateJSONAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/DateJSONAdapter.kt new file mode 100644 index 000000000..765530922 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/DateJSONAdapter.kt @@ -0,0 +1,80 @@ +package com.habitrpg.wearos.habitica.data + +import android.os.Build +import com.habitrpg.common.habitica.models.tasks.Attribute +import com.habitrpg.common.habitica.models.tasks.Frequency +import com.habitrpg.common.habitica.models.tasks.TaskType +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import java.text.DateFormat +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.TimeZone + +var customDateAdapter: Any = object : Any() { + + @ToJson + @Synchronized + fun dateToJson(d: Date?): String? { + return d?.let { dateFormats[0].format(it) } + } + + @FromJson + @Synchronized + @Throws(ParseException::class) + fun dateFromJson(s: String?): Date? { + var date: Date? = null + var index = 0 + while (index < dateFormats.size && date == null) { + try { + date = dateFormats[index].parse(s) + } catch (_: ParseException) {} + index += 1 + } + return date + } + + private var dateFormats = mutableListOf() + + init { + addFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + addFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") + addFormat("E MMM dd yyyy HH:mm:ss zzzz") + addFormat("yyyy-MM-dd'T'HH:mm:sszzz") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + addFormat("yyyy-MM-dd'T'HH:mmX") + } else { + addFormat("yyyy-MM-dd'T'HH:mm") + } + addFormat("yyyy-MM-dd") + } + + private fun addFormat(s: String) { + val dateFormat = SimpleDateFormat(s, Locale.US) + dateFormat.timeZone = TimeZone.getTimeZone("UTC") + dateFormats.add(dateFormat) + } +} + +class FrequencyAdapter { + @ToJson + fun toJson(type: Frequency): String = type.value + @FromJson + fun fromJson(value: String): Frequency? = Frequency.from(value) +} + +class TaskTypeAdapter { + @ToJson + fun toJson(type: TaskType): String = type.value + @FromJson + fun fromJson(value: String): TaskType? = TaskType.from(value) +} + +class AttributeAdapter { + @ToJson + fun toJson(type: Attribute): String = type.value + @FromJson + fun fromJson(value: String): Attribute? = Attribute.from(value) +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt index 24f66783d..d1cec8e7d 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt @@ -4,4 +4,7 @@ import com.habitrpg.wearos.habitica.data.ApiClient import javax.inject.Inject class TaskRepository @Inject constructor(val apiClient: ApiClient, val localRepository: TaskLocalRepository) { + + suspend fun retrieveTasks() = apiClient.getTasks() + } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Buffs.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Buffs.kt index b60ecd377..02ebc30c9 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Buffs.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Buffs.kt @@ -1,7 +1,9 @@ package com.habitrpg.wearos.habitica.models import com.habitrpg.common.habitica.models.AvatarBuffs +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) class Buffs: AvatarBuffs { override var con: Float? = null override var str: Float? = null diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Flags.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Flags.kt index a6c010eec..7db92afc2 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Flags.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Flags.kt @@ -1,7 +1,9 @@ package com.habitrpg.wearos.habitica.models import com.habitrpg.common.habitica.models.AvatarFlags +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) class Flags: AvatarFlags { override var classSelected: Boolean = false } diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Hair.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Hair.kt index 88931872e..18cb21b4b 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Hair.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Hair.kt @@ -1,7 +1,9 @@ package com.habitrpg.wearos.habitica.models import com.habitrpg.common.habitica.models.AvatarHair +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) class Hair: AvatarHair { override var mustache: Int = 0 override var beard: Int = 0 diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Outfit.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Outfit.kt index 50dbf997c..401ebe793 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Outfit.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Outfit.kt @@ -1,7 +1,9 @@ package com.habitrpg.wearos.habitica.models import com.habitrpg.common.habitica.models.AvatarOutfit +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) class Outfit: AvatarOutfit { override var armor: String = "" override var back: String = "" diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Preferences.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Preferences.kt index a1ca0846a..3e6ef05a5 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Preferences.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Preferences.kt @@ -1,8 +1,9 @@ package com.habitrpg.wearos.habitica.models -import com.habitrpg.common.habitica.models.AvatarHair import com.habitrpg.common.habitica.models.AvatarPreferences +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) class Preferences: AvatarPreferences { override val hair: Hair? = null override val costume: Boolean = false diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Stats.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Stats.kt index 802caba98..4e4bc045d 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Stats.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/Stats.kt @@ -1,7 +1,9 @@ package com.habitrpg.wearos.habitica.models import com.habitrpg.common.habitica.models.AvatarStats +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) class Stats: AvatarStats { override val buffs: Buffs? = null override var habitClass: String? = null diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/User.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/User.kt index af88bc3d0..936658648 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/User.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/User.kt @@ -1,16 +1,20 @@ package com.habitrpg.wearos.habitica.models import com.habitrpg.common.habitica.models.Avatar +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) open class Gear { var equipped: Outfit? = null var costume: Outfit? = null } +@JsonClass(generateAdapter = true) class Items { var gear: Gear? = null } +@JsonClass(generateAdapter = true) class User: Avatar { override val currentMount: String? = null override val currentPet: String? = null diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/WearableHabitResponse.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/WearableHabitResponse.kt new file mode 100644 index 000000000..1b949dd12 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/WearableHabitResponse.kt @@ -0,0 +1,7 @@ +package com.habitrpg.wearos.habitica.models + +class WearableHabitResponse { + var data: T? = null + var success: Boolean? = null + var message: String? = null +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/BulkTaskScoringData.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/BulkTaskScoringData.kt index ee169f3b4..2b4d06ac8 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/BulkTaskScoringData.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/BulkTaskScoringData.kt @@ -3,7 +3,9 @@ package com.habitrpg.wearos.habitica.models.tasks import com.habitrpg.common.habitica.models.responses.TaskDirectionData import com.habitrpg.wearos.habitica.models.Buffs import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) class BulkTaskScoringData { @Json(name="con") var constitution: Int? = null diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/ChecklistItem.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/ChecklistItem.kt index 1616954ac..4633bd7c2 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/ChecklistItem.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/ChecklistItem.kt @@ -2,26 +2,19 @@ package com.habitrpg.wearos.habitica.models.tasks import android.os.Parcel import android.os.Parcelable +import com.squareup.moshi.JsonClass import java.util.UUID -open class ChecklistItem: Parcelable { - - var id: String? = null - var text: String? = null +@JsonClass(generateAdapter = true) +open class ChecklistItem constructor( + var id: String? = UUID.randomUUID().toString(), + var text: String? = null, var completed: Boolean = false +) : Parcelable { + var position: Int = 0 - @JvmOverloads constructor(id: String? = null, text: String? = null, completed: Boolean = false) { - this.text = text - if (id?.isNotEmpty() == true) { - this.id = id - } else { - this.id = UUID.randomUUID().toString() - } - this.completed = completed - } - - constructor(item: ChecklistItem) { + constructor(item: ChecklistItem) : this() { this.text = item.text this.id = item.id this.completed = item.completed @@ -44,7 +37,7 @@ open class ChecklistItem: Parcelable { override fun newArray(size: Int): Array = arrayOfNulls(size) } - constructor(source: Parcel) { + constructor(source: Parcel) : this() { id = source.readString() text = source.readString() completed = source.readByte() == 1.toByte() diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Days.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Days.kt index 8cec2410a..298db1b2e 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Days.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Days.kt @@ -2,7 +2,9 @@ package com.habitrpg.wearos.habitica.models.tasks import android.os.Parcel import android.os.Parcelable +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) open class Days(): Parcelable { var m: Boolean = true var t: Boolean = true diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/RemindersItem.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/RemindersItem.kt index 0b9efb25d..0f8ac2e4f 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/RemindersItem.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/RemindersItem.kt @@ -2,6 +2,7 @@ package com.habitrpg.wearos.habitica.models.tasks import android.os.Parcel import android.os.Parcelable +import com.squareup.moshi.JsonClass import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId @@ -10,7 +11,8 @@ import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatterBuilder import java.time.temporal.TemporalAccessor -open class RemindersItem : Parcelable { +@JsonClass(generateAdapter = true) +open class RemindersItem constructor() : Parcelable { var id: String? = null var startDate: String? = null var time: String? = null @@ -34,14 +36,12 @@ open class RemindersItem : Parcelable { override fun newArray(size: Int): Array = arrayOfNulls(size) } - constructor(source: Parcel) { + constructor(source: Parcel) : this() { id = source.readString() startDate = source.readString() time = source.readString() } - constructor() - override fun equals(other: Any?): Boolean { return if (other is RemindersItem) { this.id == other.id diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Tag.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Tag.kt deleted file mode 100644 index 8e2d812d4..000000000 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Tag.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.habitrpg.wearos.habitica.models.tasks - -open class Tag { - - var id: String = "" - - var userId: String? = null - var name: String = "" - internal var challenge: Boolean = false - - override fun equals(other: Any?): Boolean { - if (other is Tag) { - return this.id == other.id - } - return super.equals(other) - } - - override fun hashCode(): Int { - return id.hashCode() - } -} diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt index bb99ccb9a..d46ab7e05 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt @@ -9,6 +9,7 @@ import com.habitrpg.common.habitica.models.tasks.Frequency import com.habitrpg.common.habitica.models.tasks.TaskType import com.habitrpg.wearos.habitica.R import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import org.json.JSONArray import org.json.JSONException import java.time.LocalDateTime @@ -21,7 +22,8 @@ import java.util.Calendar import java.util.Date import java.util.GregorianCalendar -open class Task : Parcelable { +@JsonClass(generateAdapter = true) +open class Task constructor(): Parcelable { @Json(name="_id") var id: String? = null @@ -32,7 +34,7 @@ open class Task : Parcelable { var type: TaskType? get() = TaskType.from(typeValue) set(value) { typeValue = value?.value } - private var typeValue: String? = null + internal var typeValue: String? = null var challengeID: String? = null var challengeBroken: String? = null var attribute: Attribute? @@ -40,10 +42,8 @@ open class Task : Parcelable { set(value) { attributeValue = value?.value } var attributeValue: String? = Attribute.STRENGTH.value var value: Double = 0.0 - var tags: List? = listOf() var dateCreated: Date? = null var position: Int = 0 - var group: TaskGroupPlan? = null // Habits var up: Boolean? = false var down: Boolean? = false @@ -54,10 +54,7 @@ open class Task : Parcelable { var checklist: List? = listOf() var reminders: List? = listOf() // dailies - var frequency: Frequency? - get() = Frequency.from(frequencyValue) - set(value) { frequencyValue = value?.value } - var frequencyValue: String? = null + var frequency: Frequency? = null var everyX: Int? = 0 var streak: Int? = 0 var startDate: Date? = null @@ -83,8 +80,8 @@ open class Task : Parcelable { var isCreating: Boolean = false var yesterDaily: Boolean = true - private var daysOfMonthString: String? = null - private var weeksOfMonthString: String? = null + internal var daysOfMonthString: String? = null + internal var weeksOfMonthString: String? = null @Json(ignore = true) private var daysOfMonth: List? = null @@ -166,16 +163,6 @@ open class Task : Parcelable { val isChecklistDisplayActive: Boolean get() = this.checklist?.size != this.completedChecklistCount - val isGroupTask: Boolean - get() = group?.groupID?.isNotBlank() == true - - val isPendingApproval: Boolean - get() = (group?.approvalRequired == true && group?.approvalRequested == true && group?.approvalApproved == false) - - fun containsAllTagIds(tagIdList: List): Boolean = tags?.mapTo(ArrayList()) { it.id }?.containsAll(tagIdList) ?: false - - fun checkIfDue(): Boolean = isDue == true - fun getNextReminderOccurence(oldTime: String?): ZonedDateTime? { if (oldTime == null) { return null @@ -269,7 +256,6 @@ open class Task : Parcelable { checklist != task.checklist -> return true priority != task.priority -> return true attribute != task.attribute && attribute != null -> return true - tags != task.tags -> return true } if (type == TaskType.HABIT) { return when { @@ -312,7 +298,6 @@ open class Task : Parcelable { dest.writeString(this.attribute?.value) dest.writeString(this.type?.value) dest.writeDouble(this.value) - dest.writeList(this.tags as? List<*>) dest.writeLong(this.dateCreated?.time ?: -1) dest.writeInt(this.position) dest.writeValue(this.up) @@ -334,9 +319,8 @@ open class Task : Parcelable { dest.writeInt(this.counterDown ?: 0) } - constructor() - protected constructor(`in`: Parcel) { + protected constructor(`in`: Parcel): this() { this.userId = `in`.readString() ?: "" this.priority = `in`.readValue(Float::class.java.classLoader) as? Float ?: 0f this.text = `in`.readString() ?: "" @@ -344,8 +328,6 @@ open class Task : Parcelable { this.attribute = Attribute.from(`in`.readString() ?: "") this.type = TaskType.from(`in`.readString() ?: "") this.value = `in`.readDouble() - this.tags = listOf() - `in`.readList(this.tags as List<*>, TaskTag::class.java.classLoader) val tmpDateCreated = `in`.readLong() this.dateCreated = if (tmpDateCreated == -1L) null else Date(tmpDateCreated) this.position = `in`.readInt() diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskGroupPlan.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskGroupPlan.kt deleted file mode 100644 index 4f49c4e74..000000000 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskGroupPlan.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.habitrpg.wearos.habitica.models.tasks - -import com.squareup.moshi.Json -import java.util.Date - -open class TaskGroupPlan { - - @Json(name="id") - var groupID: String? = null - var managerNotes: String? = null - var sharedCompletion: String? = null - var assignedDate: Date? = null - var assigningUsername: String? = null - var assignedUsers: List = listOf() - - var approvalRequested: Boolean = false - var approvalApproved: Boolean = false - var approvalRequired: Boolean = false -} diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskList.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskList.kt index e60883db2..1b951db19 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskList.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskList.kt @@ -1,5 +1,20 @@ package com.habitrpg.wearos.habitica.models.tasks -class TaskList { - var tasks: MutableMap = mutableMapOf() +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson + +class TaskList(var tasks: MutableMap = mutableMapOf()) + +class WrappedTasklistAdapter { + @FromJson + fun fromJson(json: List): TaskList { + val tasks = mutableMapOf() + json.forEach { tasks[it.id ?: ""] = it } + return TaskList(tasks) + } + + @ToJson + fun toJson(value: TaskList): List { + return value.tasks.values.toList() + } } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskTag.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskTag.kt deleted file mode 100644 index 060fcb247..000000000 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/TaskTag.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.habitrpg.wearos.habitica.models.tasks - -open class TaskTag { - var tag: Tag? = null - var task: Task? = null -} diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/modules/AppModule.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/modules/AppModule.kt index dcaba55b7..2cbf7ca5e 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/modules/AppModule.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/modules/AppModule.kt @@ -6,8 +6,15 @@ import androidx.preference.PreferenceManager import com.habitrpg.common.habitica.api.HostConfig import com.habitrpg.common.habitica.helpers.KeyHelper import com.habitrpg.shared.habitica.HLogger +import com.habitrpg.wearos.habitica.BuildConfig import com.habitrpg.wearos.habitica.data.ApiClient +import com.habitrpg.wearos.habitica.data.AttributeAdapter +import com.habitrpg.wearos.habitica.data.FrequencyAdapter +import com.habitrpg.wearos.habitica.data.TaskTypeAdapter +import com.habitrpg.wearos.habitica.data.customDateAdapter +import com.habitrpg.wearos.habitica.models.tasks.WrappedTasklistAdapter import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -40,13 +47,19 @@ class AppModule { fun providesConverterFactory(): Converter.Factory { return MoshiConverterFactory.create( Moshi.Builder() + .add(WrappedTasklistAdapter()) + .add(customDateAdapter) + .add(FrequencyAdapter()) + .add(TaskTypeAdapter()) + .add(AttributeAdapter()) + .addLast(KotlinJsonAdapterFactory()) .build() ).asLenient() } @Provides @Singleton - fun providesApiHelper( + fun providesApiHClient( hostConfig: HostConfig, @ApplicationContext context: Context, converter: Converter.Factory diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/BaseActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/BaseActivity.kt index 0ab2852f8..1b4b30da7 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/BaseActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/BaseActivity.kt @@ -1,15 +1,14 @@ package com.habitrpg.wearos.habitica.ui.activities import android.os.Bundle -import android.os.PersistableBundle import androidx.activity.ComponentActivity import androidx.viewbinding.ViewBinding open class BaseActivity : ComponentActivity() { protected lateinit var binding: B - override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { - super.onCreate(savedInstanceState, persistentState) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) setContentView(binding.root) } } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt index 76fe1ca94..de743f789 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt @@ -1,14 +1,136 @@ package com.habitrpg.wearos.habitica.ui.activities +import android.content.Intent +import android.graphics.drawable.Drawable import android.os.Bundle +import android.util.Log +import android.view.View +import androidx.activity.viewModels +import androidx.appcompat.content.res.AppCompatResources +import androidx.recyclerview.widget.RecyclerView +import androidx.wear.widget.WearableLinearLayoutManager +import com.habitrpg.common.habitica.models.tasks.TaskType +import com.habitrpg.wearos.habitica.R import com.habitrpg.wearos.habitica.databinding.ActivityMainBinding +import com.habitrpg.wearos.habitica.ui.adapters.HubAdapter +import com.habitrpg.wearos.habitica.ui.viewmodels.MainViewModel import dagger.hilt.android.AndroidEntryPoint +import kotlin.math.abs + +data class MenuItem( + val identifier: String, + val title: String, + val icon: Drawable?, + val onClick: () -> Unit +) @AndroidEntryPoint class MainActivity : BaseActivity() { + val viewModel: MainViewModel by viewModels() + + private val adapter = HubAdapter() override fun onCreate(savedInstanceState: Bundle?) { binding = ActivityMainBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) + binding.root.apply { + layoutManager = + WearableLinearLayoutManager(this@MainActivity, HabiticaScrollingLayoutCallback()) + adapter = this@MainActivity.adapter + } + } + + + + override fun onStart() { + super.onStart() + binding.root.post { + binding.root.setPaddingRelative(0, (binding.root.height * 0.25).toInt(), 0, (binding.root.height * 0.25).toInt()) + binding.root.scrollY = 0 + } + adapter.data = listOf( + MenuItem( + "avatar", + "Avatar", + AppCompatResources.getDrawable(this, R.drawable.icon_rewards) + ) { + + }, + MenuItem( + "Stats", + getString(R.string.stats), + AppCompatResources.getDrawable(this, R.drawable.icon_rewards) + ) { + + }, + MenuItem( + "habits", + getString(R.string.habits), + AppCompatResources.getDrawable(this, R.drawable.icon_habits) + ) { + openTasklist(TaskType.HABIT) + }, + MenuItem( + "dailies", + getString(R.string.dailies), + AppCompatResources.getDrawable(this, R.drawable.icon_dailies) + ) { + openTasklist(TaskType.DAILY) + }, + MenuItem( + "todos", + getString(R.string.todos), + AppCompatResources.getDrawable(this, R.drawable.icon_todos) + ) { + openTasklist(TaskType.TODO) + }, + MenuItem( + "rewards", + getString(R.string.rewards), + AppCompatResources.getDrawable(this, R.drawable.icon_rewards) + ) { + openTasklist(TaskType.REWARD) + } + ) + viewModel.user.observe(this) { + Log.d("MainActivity", "onStart: ${it.currentPet}") + } + } + + private fun openTasklist(type: TaskType) { + val intent = Intent(this, TaskListActivity::class.java).apply { + putExtra("type", type.name) + } + startActivity(intent) + } +} + +private const val MAX_ICON_PROGRESS = 0.8f + +class HabiticaScrollingLayoutCallback : WearableLinearLayoutManager.LayoutCallback() { + + private var progressToCenter: Float = 0f + + override fun onLayoutFinished(child: View, parent: RecyclerView) { + child.apply { + // Figure out % progress from top to bottom + val centerOffset = height.toFloat() / 2.0f / parent.height.toFloat() + val yRelativeToCenterOffset = y / parent.height + centerOffset + + // Normalize for center + progressToCenter = abs(0.5f - yRelativeToCenterOffset) - 0.25f + if (progressToCenter < 0) { + scaleX = 1f + scaleY = 1f + alpha = 1f + return + } + // Adjust to the maximum scale + progressToCenter = Math.min(progressToCenter * 1.5f, MAX_ICON_PROGRESS) + + scaleX = 1 - progressToCenter + scaleY = 1 - progressToCenter + alpha = 1 - progressToCenter * 2 + } } } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt new file mode 100644 index 000000000..b6ee4f528 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt @@ -0,0 +1,39 @@ +package com.habitrpg.wearos.habitica.ui.activities + +import android.os.Bundle +import androidx.activity.viewModels +import androidx.wear.widget.WearableLinearLayoutManager +import com.habitrpg.wearos.habitica.databinding.ActivityTasklistBinding +import com.habitrpg.wearos.habitica.models.tasks.Task +import com.habitrpg.wearos.habitica.ui.adapters.TaskListAdapter +import com.habitrpg.wearos.habitica.ui.viewmodels.TaskListViewModel +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class TaskListActivity: BaseActivity() { + private val adapter = TaskListAdapter() + private val viewModel: TaskListViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityTasklistBinding.inflate(layoutInflater) + super.onCreate(savedInstanceState) + binding.root.apply { + isEdgeItemsCenteringEnabled = true + layoutManager = + WearableLinearLayoutManager(this@TaskListActivity, HabiticaScrollingLayoutCallback()) + adapter = this@TaskListActivity.adapter + } + + adapter.data = listOf( + Task().apply { text = "Test 1" }, + Task().apply { text = "Test 2" }, + Task().apply { text = "Test 3" }, + Task().apply { text = "Test 4" }, + Task().apply { text = "Test 5" } + ) + + viewModel.tasks.observe(this) { + adapter.data = it + } + } +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt new file mode 100644 index 000000000..095c65257 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt @@ -0,0 +1,39 @@ +package com.habitrpg.wearos.habitica.ui.adapters + +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.habitrpg.common.habitica.extensions.layoutInflater +import com.habitrpg.wearos.habitica.databinding.RowHubBinding +import com.habitrpg.wearos.habitica.ui.activities.MenuItem + +class HubAdapter: RecyclerView.Adapter() { + var data: List = listOf() + set(value) { + field = value + notifyDataSetChanged() + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HubViewHolder { + return HubViewHolder(RowHubBinding.inflate(parent.context.layoutInflater, parent, false).root) + } + + override fun onBindViewHolder(holder: HubViewHolder, position: Int) { + holder.bind(data[position]) + } + + override fun getItemCount(): Int { + return data.size + } +} + +class HubViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { + val binding = RowHubBinding.bind(itemView) + + fun bind(item: MenuItem) { + binding.title.text = item.title + binding.iconView.setImageDrawable(item.icon) + binding.root.setOnClickListener { + item.onClick() + } + } +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt new file mode 100644 index 000000000..5d55c7811 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt @@ -0,0 +1,35 @@ +package com.habitrpg.wearos.habitica.ui.adapters + +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.habitrpg.common.habitica.extensions.layoutInflater +import com.habitrpg.wearos.habitica.databinding.RowHabitBinding +import com.habitrpg.wearos.habitica.models.tasks.Task + +class TaskListAdapter: RecyclerView.Adapter() { + var data: List = listOf() + set(value) { + field = value + notifyDataSetChanged() + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TaskViewHolder { + return TaskViewHolder(RowHabitBinding.inflate(parent.context.layoutInflater, parent, false).root) + } + + override fun onBindViewHolder(holder: TaskViewHolder, position: Int) { + holder.bind(data[position]) + } + + override fun getItemCount(): Int { + return data.size + } +} + +class TaskViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val binding = RowHabitBinding.bind(itemView) + + fun bind(task: Task) { + binding.title.text = task.text + } +} diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/BaseViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/BaseViewModel.kt index d15a30cdb..5573c47f9 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/BaseViewModel.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/BaseViewModel.kt @@ -2,11 +2,6 @@ package com.habitrpg.wearos.habitica.ui.viewmodels import androidx.lifecycle.ViewModel import com.habitrpg.wearos.habitica.data.repositories.UserRepository -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject -@HiltViewModel -open class BaseViewModel: ViewModel() { - @Inject - lateinit var repository: UserRepository +open class BaseViewModel(val userRepository: UserRepository): ViewModel() { } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/MainViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/MainViewModel.kt new file mode 100644 index 000000000..bfc54a77f --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/MainViewModel.kt @@ -0,0 +1,20 @@ +package com.habitrpg.wearos.habitica.ui.viewmodels + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.habitrpg.wearos.habitica.data.repositories.UserRepository +import com.habitrpg.wearos.habitica.models.User +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class MainViewModel @Inject constructor(userRepository: UserRepository) : BaseViewModel(userRepository) { + val user = MutableLiveData() + + init { + viewModelScope.launch { + user.value = userRepository.retrieveUser() + } + } +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt new file mode 100644 index 000000000..e7100687e --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt @@ -0,0 +1,24 @@ +package com.habitrpg.wearos.habitica.ui.viewmodels + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.habitrpg.wearos.habitica.data.repositories.TaskRepository +import com.habitrpg.wearos.habitica.data.repositories.UserRepository +import com.habitrpg.wearos.habitica.models.tasks.Task +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class TaskListViewModel @Inject constructor( + private val taskRepository: TaskRepository, + userRepository: UserRepository +) : BaseViewModel(userRepository) { + val tasks = MutableLiveData>() + + init { + viewModelScope.launch { + tasks.value = taskRepository.retrieveTasks()?.tasks?.values?.toList() + } + } +} \ No newline at end of file diff --git a/wearos/src/main/res/drawable/row_background.xml b/wearos/src/main/res/drawable/row_background.xml new file mode 100644 index 000000000..ded31b0b9 --- /dev/null +++ b/wearos/src/main/res/drawable/row_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/wearos/src/main/res/layout/activity_main.xml b/wearos/src/main/res/layout/activity_main.xml index 38a2a8fde..864c349f9 100644 --- a/wearos/src/main/res/layout/activity_main.xml +++ b/wearos/src/main/res/layout/activity_main.xml @@ -1,21 +1,10 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/wearos/src/main/res/layout/activity_tasklist.xml b/wearos/src/main/res/layout/activity_tasklist.xml new file mode 100644 index 000000000..ad804d8f5 --- /dev/null +++ b/wearos/src/main/res/layout/activity_tasklist.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/wearos/src/main/res/layout/row_habit.xml b/wearos/src/main/res/layout/row_habit.xml new file mode 100644 index 000000000..3288f20d8 --- /dev/null +++ b/wearos/src/main/res/layout/row_habit.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/wearos/src/main/res/layout/row_hub.xml b/wearos/src/main/res/layout/row_hub.xml new file mode 100644 index 000000000..f69562bd5 --- /dev/null +++ b/wearos/src/main/res/layout/row_hub.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/wearos/src/main/res/values-round/strings.xml b/wearos/src/main/res/values-round/strings.xml deleted file mode 100644 index d74c66c62..000000000 --- a/wearos/src/main/res/values-round/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Hello Round World! - \ No newline at end of file diff --git a/wearos/src/main/res/values/strings.xml b/wearos/src/main/res/values/strings.xml index 56db6aa67..596a90594 100644 --- a/wearos/src/main/res/values/strings.xml +++ b/wearos/src/main/res/values/strings.xml @@ -1,8 +1,3 @@ Habitica - - Hello Square World! \ No newline at end of file