From d91be2d7fe8a7738d581fd43e7b0f6c3f0c31fa6 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 14 Jan 2025 12:29:01 +0100 Subject: [PATCH] formatting fixes --- .../android/habitica/HabiticaTestCase.kt | 4 +- .../ui/activities/TaskFormActivityTest.kt | 2 +- .../habitica/ui/fragments/FragmentTestCase.kt | 2 +- .../fragments/NavigationDrawerFragmentTest.kt | 6 +- .../items/ItemRecyclerFragmentTest.kt | 10 +- .../inventory/stable/PetDetailFragmentTest.kt | 22 +- .../stable/StableRecyclerFragmentTest.kt | 6 +- .../tasks/TaskRecyclerViewFragmentTest.kt | 4 +- .../habitica/HabiticaBaseApplication.kt | 18 +- .../android/habitica/api/ApiService.kt | 228 ++-- .../android/habitica/data/ApiClient.kt | 106 +- .../habitica/data/ChallengeRepository.kt | 10 +- .../habitica/data/CustomizationRepository.kt | 2 +- .../habitica/data/InventoryRepository.kt | 30 +- .../data/SetupCustomizationRepository.kt | 4 +- .../android/habitica/data/SocialRepository.kt | 44 +- .../android/habitica/data/TaskRepository.kt | 34 +- .../android/habitica/data/UserRepository.kt | 20 +- .../data/implementation/ApiClientImpl.kt | 130 +- .../data/implementation/BaseRepositoryImpl.kt | 2 +- .../implementation/ChallengeRepositoryImpl.kt | 26 +- .../implementation/ContentRepositoryImpl.kt | 2 +- .../CustomizationRepositoryImpl.kt | 12 +- .../data/implementation/FAQRepositoryImpl.kt | 2 +- .../implementation/InventoryRepositoryImpl.kt | 38 +- .../SetupCustomizationRepositoryImpl.kt | 386 +++--- .../implementation/SocialRepositoryImpl.kt | 52 +- .../data/implementation/TagRepositoryImpl.kt | 2 +- .../data/implementation/TaskRepositoryImpl.kt | 54 +- .../implementation/TutorialRepositoryImpl.kt | 2 +- .../data/implementation/UserRepositoryImpl.kt | 32 +- .../data/local/BaseLocalRepository.kt | 2 +- .../data/local/ChallengeLocalRepository.kt | 8 +- .../local/CustomizationLocalRepository.kt | 2 +- .../data/local/InventoryLocalRepository.kt | 30 +- .../data/local/SocialLocalRepository.kt | 26 +- .../data/local/TaskLocalRepository.kt | 14 +- .../data/local/UserLocalRepository.kt | 2 +- .../RealmBaseLocalRepository.kt | 244 ++-- .../RealmChallengeLocalRepository.kt | 8 +- .../RealmCustomizationLocalRepository.kt | 2 +- .../RealmInventoryLocalRepository.kt | 38 +- .../RealmSocialLocalRepository.kt | 28 +- .../RealmTaskLocalRepository.kt | 22 +- .../RealmUserLocalRepository.kt | 4 +- .../extensions/AlertDialogExtensions.kt | 6 +- .../habitica/extensions/AnimalExtensions.kt | 2 +- .../extensions/AttributeSetExtentions.kt | 2 +- .../habitica/extensions/DateExtensions.kt | 4 +- .../habitica/extensions/LocaleExtensions.kt | 2 - .../extensions/ResourcesExtensions.kt | 2 +- .../extensions/TextWatcherExtensions.kt | 12 +- .../habitica/extensions/WindowExtensions.kt | 2 +- .../extensions/ZonedDateExtensions.kt | 4 +- .../android/habitica/helpers/AdHandler.kt | 8 +- .../android/habitica/helpers/Analytics.kt | 16 +- .../habitica/helpers/AppConfigManager.kt | 3 +- .../habitica/helpers/AprilFoolsHandler.kt | 2 +- .../habitica/helpers/GroupPlanInfoProvider.kt | 2 +- .../habitica/helpers/LifecycleCollect.kt | 6 +- .../helpers/NotificationOpenHandler.kt | 20 +- .../habitica/helpers/NotificationsManager.kt | 4 +- .../habitica/helpers/PurchaseHandler.kt | 62 +- .../android/habitica/helpers/PurchaseTypes.kt | 4 +- .../android/habitica/helpers/ReviewManager.kt | 2 +- .../android/habitica/helpers/SoundManager.kt | 112 +- .../habitica/helpers/TaskAlarmManager.kt | 34 +- .../helpers/TaskDescriptionBuilder.kt | 25 +- .../habitica/helpers/UserStatComputer.kt | 2 +- .../GroupActivityNotification.kt | 8 +- .../GuildInviteLocalNotification.kt | 6 +- .../HabiticaLocalNotification.kt | 8 +- .../HabiticaLocalNotificationFactory.kt | 26 +- .../PartyInviteLocalNotification.kt | 6 +- .../notifications/PushNotificationManager.kt | 12 +- .../QuestInviteLocalNotification.kt | 6 +- ...ReceivedPrivateMessageLocalNotification.kt | 12 +- .../habitica/interactors/BuyRewardUseCase.kt | 46 +- .../interactors/CheckClassSelectionUseCase.kt | 76 +- .../interactors/DisplayItemDropUseCase.kt | 68 +- .../habitica/interactors/FeedPetUseCase.kt | 108 +- .../habitica/interactors/HatchPetUseCase.kt | 124 +- .../interactors/InsufficientGemsUseCase.kt | 34 +- .../habitica/interactors/LevelUpUseCase.kt | 206 +-- .../habitica/interactors/NotifyUserUseCase.kt | 338 ++--- .../interactors/ScoreTaskLocallyInteractor.kt | 20 +- .../interactors/ShareAvatarUseCase.kt | 54 +- .../habitica/interactors/ShareMountUseCase.kt | 6 +- .../habitica/interactors/SharePetUseCase.kt | 6 +- .../interactors/ShowNotificationInteractor.kt | 22 +- .../habitica/models/CustomizationFilter.kt | 4 +- .../habitica/models/SetupCustomization.kt | 18 +- .../android/habitica/models/TutorialStep.kt | 4 +- .../models/inventory/Customization.kt | 6 +- .../habitica/models/inventory/EquipmentSet.kt | 2 +- .../FallExtraGemsHabiticaPromotion.kt | 44 +- .../GiftOneGetOneHabiticaPromotion.kt | 43 +- .../models/promotions/HabiticaPromotion.kt | 10 +- .../SpookyExtraGemsHabiticaPromotion.kt | 52 +- .../models/promotions/Survey2021Promotion.kt | 6 +- .../habitica/models/shops/ShopCategory.kt | 1 + .../android/habitica/models/shops/ShopItem.kt | 7 +- .../models/shops/ShopItemUnlockCondition.kt | 4 +- .../habitica/models/tasks/ChecklistItem.kt | 2 +- .../android/habitica/models/tasks/Days.kt | 8 +- .../habitica/models/tasks/RemindersItem.kt | 6 +- .../android/habitica/models/tasks/Task.kt | 28 +- .../habitica/models/user/SubscriptionPlan.kt | 1 - .../android/habitica/models/user/User.kt | 2 +- .../habitica/models/user/UserQuestStatus.kt | 2 +- .../android/habitica/modules/ApiModule.kt | 6 +- .../android/habitica/modules/AppModule.kt | 12 +- .../habitica/modules/RepositoryModule.kt | 4 +- .../android/habitica/modules/UserModule.kt | 4 +- .../habitica/modules/UserRepositoryModule.kt | 28 +- .../android/habitica/prefs/TimePreference.kt | 2 +- .../receivers/DeviceCommunicationService.kt | 4 +- .../LocalNotificationActionReceiver.kt | 4 +- .../receivers/NotificationPublisher.kt | 14 +- .../receivers/TaskAlarmBootReceiver.kt | 11 +- .../habitica/receivers/TaskReceiver.kt | 12 +- .../habitica/ui/GemPurchaseOptionsView.kt | 2 +- .../android/habitica/ui/RoundedFrameLayout.kt | 36 +- .../android/habitica/ui/SpeechBubbleView.kt | 2 +- .../android/habitica/ui/TutorialView.kt | 4 +- .../ui/activities/AddTaskWidgetActivity.kt | 4 +- .../ui/activities/AdventureGuideActivity.kt | 24 +- .../habitica/ui/activities/ArmoireActivity.kt | 31 +- .../habitica/ui/activities/BaseActivity.kt | 21 +- .../ui/activities/BirthdayActivity.kt | 183 ++- .../ui/activities/ChallengeFormActivity.kt | 22 +- .../ui/activities/ClassSelectionActivity.kt | 44 +- .../habitica/ui/activities/DeathActivity.kt | 40 +- .../activities/FixCharacterValuesActivity.kt | 20 +- .../ui/activities/FullProfileActivity.kt | 66 +- .../ui/activities/GemPurchaseActivity.kt | 4 - .../ui/activities/GiftGemsActivity.kt | 2 +- .../ui/activities/GiftSubscriptionActivity.kt | 2 +- .../ui/activities/GroupFormActivity.kt | 2 +- .../ui/activities/GuidelinesActivity.kt | 6 +- .../activities/HabitButtonWidgetActivity.kt | 4 +- .../habitica/ui/activities/IntroActivity.kt | 26 +- .../habitica/ui/activities/LoginActivity.kt | 42 +- .../habitica/ui/activities/MainActivity.kt | 80 +- .../ui/activities/MaintenanceActivity.kt | 4 +- .../ui/activities/NotificationsActivity.kt | 48 +- .../habitica/ui/activities/PrefsActivity.kt | 2 +- .../ui/activities/ReportMessageActivity.kt | 10 +- .../habitica/ui/activities/SetupActivity.kt | 12 +- .../ui/activities/TaskFormActivity.kt | 59 +- .../ui/activities/TaskSummaryActivity.kt | 120 +- .../ui/adapter/AchievementsAdapter.kt | 8 +- .../ui/adapter/BaseRecyclerViewAdapter.kt | 8 +- ...stomizationEquipmentRecyclerViewAdapter.kt | 19 +- .../CustomizationRecyclerViewAdapter.kt | 26 +- .../ui/adapter/NavigationDrawerAdapter.kt | 26 +- .../ui/adapter/SimpleSpinnerAdapter.kt | 6 +- .../adapter/SkillTasksRecyclerViewAdapter.kt | 8 +- .../ui/adapter/SkillsRecyclerViewAdapter.kt | 48 +- .../inventory/EquipmentRecyclerViewAdapter.kt | 14 +- .../inventory/HabiticaClassArrayAdapter.kt | 12 +- .../adapter/inventory/ItemRecyclerAdapter.kt | 16 +- .../inventory/MountDetailRecyclerAdapter.kt | 6 +- .../inventory/PetDetailRecyclerAdapter.kt | 22 +- .../adapter/inventory/ShopRecyclerAdapter.kt | 28 +- .../inventory/StableRecyclerAdapter.kt | 32 +- .../setup/CustomizationSetupAdapter.kt | 28 +- .../ui/adapter/setup/TaskSetupAdapter.kt | 12 +- .../social/AchievementProfileAdapter.kt | 6 +- .../social/ChallengesListViewAdapter.kt | 14 +- .../adapter/social/ChatRecyclerViewAdapter.kt | 21 +- .../ui/adapter/social/InboxAdapter.kt | 16 +- .../social/PartyMemberRecyclerViewAdapter.kt | 6 +- .../ChallengeTasksRecyclerViewAdapter.kt | 12 +- .../ChallengesFilterRecyclerViewAdapter.kt | 6 +- .../tasks/BaseTasksRecyclerViewAdapter.kt | 6 +- .../tasks/DailiesRecyclerViewHolder.kt | 4 +- .../tasks/HabitsRecyclerViewAdapter.kt | 4 +- .../RealmBaseTasksRecyclerViewAdapter.kt | 10 +- .../tasks/RewardsRecyclerViewAdapter.kt | 8 +- .../adapter/tasks/TaskRecyclerViewAdapter.kt | 2 +- .../adapter/tasks/TodosRecyclerViewAdapter.kt | 4 +- .../habitica/ui/fragments/AboutFragment.kt | 14 +- .../ui/fragments/AchievementsFragment.kt | 14 +- .../ui/fragments/BaseDialogFragment.kt | 6 +- .../habitica/ui/fragments/BaseFragment.kt | 6 +- .../habitica/ui/fragments/BaseMainFragment.kt | 6 +- .../ui/fragments/NavigationDrawerFragment.kt | 122 +- .../habitica/ui/fragments/NewsFragment.kt | 8 +- .../ui/fragments/PromoInfoFragment.kt | 6 +- .../habitica/ui/fragments/PromoWebFragment.kt | 6 +- .../ui/fragments/ReportBottomSheetFragment.kt | 24 +- .../habitica/ui/fragments/StatsFragment.kt | 32 +- .../customization/AvatarOverviewFragment.kt | 66 +- .../ComposeAvatarCustomizationFragment.kt | 48 +- .../ComposeAvatarEquipmentFragment.kt | 106 +- .../equipment/EquipmentDetailFragment.kt | 19 +- .../inventory/items/ItemDialogFragment.kt | 26 +- .../inventory/items/ItemRecyclerFragment.kt | 31 +- .../inventory/items/ItemsFragment.kt | 6 +- .../shops/CustomizationsShopFragment.kt | 2 +- .../inventory/shops/MarketFragment.kt | 2 +- .../inventory/shops/QuestShopFragment.kt | 4 +- .../inventory/shops/SeasonalShopFragment.kt | 2 +- .../fragments/inventory/shops/ShopFragment.kt | 14 +- .../shops/TimeTravelersShopFragment.kt | 6 +- .../stable/MountDetailRecyclerFragment.kt | 8 +- .../stable/PetDetailRecyclerFragment.kt | 22 +- .../inventory/stable/StableFragment.kt | 6 +- .../stable/StableRecyclerFragment.kt | 12 +- .../preferences/AccountPreferenceFragment.kt | 42 +- .../preferences/BasePreferencesFragment.kt | 4 +- .../EmailNotificationsPreferencesFragment.kt | 32 +- .../preferences/HabiticaAccountDialog.kt | 54 +- .../preferences/PreferencesFragment.kt | 33 +- .../PushNotificationsPreferencesFragment.kt | 32 +- .../TimePreferenceDialogFragment.kt | 2 +- ...tOutcomeSubscriptionBottomSheetFragment.kt | 2 +- .../purchases/GemsPurchaseFragment.kt | 8 +- .../purchases/GiftBalanceGemsFragment.kt | 8 +- .../purchases/GiftPurchaseGemsFragment.kt | 4 +- .../SubscriptionBottomSheetFragment.kt | 11 +- .../purchases/SubscriptionFragment.kt | 18 +- .../ui/fragments/setup/AvatarSetupFragment.kt | 52 +- .../ui/fragments/setup/IntroFragment.kt | 4 +- .../ui/fragments/setup/TaskSetupFragment.kt | 44 +- .../ui/fragments/setup/WelcomeFragment.kt | 20 +- .../skills/SkillTasksRecyclerViewFragment.kt | 6 +- .../ui/fragments/skills/SkillsFragment.kt | 16 +- .../ui/fragments/social/ChatFragment.kt | 18 +- .../social/InboxMessageListFragment.kt | 21 +- .../fragments/social/InboxOverviewFragment.kt | 16 +- .../ui/fragments/social/PartyChatFragment.kt | 2 +- .../fragments/social/QuestDetailFragment.kt | 20 +- .../challenges/ChallengeDetailFragment.kt | 34 +- .../challenges/ChallengeFilterDialogHolder.kt | 10 +- .../challenges/ChallengeFilterOptions.kt | 2 +- .../challenges/ChallengeListFragment.kt | 16 +- .../challenges/ChallengesOverviewFragment.kt | 8 +- .../social/guilds/GuildDetailFragment.kt | 14 +- .../fragments/social/guilds/GuildFragment.kt | 12 +- .../social/party/NoPartyFragmentFragment.kt | 15 +- .../social/party/PartyDetailFragment.kt | 50 +- .../fragments/social/party/PartyFragment.kt | 10 +- .../social/party/PartyInviteFragment.kt | 128 +- .../social/party/PartyInvitePagerFragment.kt | 6 +- .../social/party/PartySeekingFragment.kt | 133 +- .../ui/fragments/support/BugFixFragment.kt | 22 +- .../ui/fragments/support/FAQDetailFragment.kt | 6 +- .../fragments/support/FAQOverviewFragment.kt | 42 +- .../fragments/support/SupportMainFragment.kt | 8 +- .../tasks/RewardsRecyclerviewFragment.kt | 18 +- .../tasks/TaskRecyclerViewFragment.kt | 84 +- .../ui/fragments/tasks/TasksFragment.kt | 32 +- .../ui/helpers/AutocompleteAdapter.kt | 10 +- .../ui/helpers/AutocompleteTokenizer.kt | 6 +- .../habitica/ui/helpers/MarginDecoration.kt | 2 +- .../ui/helpers/RecyclerViewEmptySupport.kt | 150 +-- .../ui/helpers/SafeDefaultItemAnimator.kt | 36 +- .../habitica/ui/helpers/ToolbarColorHelper.kt | 10 +- .../habitica/ui/menu/BottomSheetMenuItem.kt | 4 +- .../habitica/ui/menu/HabiticaDrawerItem.kt | 2 +- .../habitica/ui/theme/HabiticaTheme.kt | 12 +- .../ui/viewHolders/BindableViewHolder.kt | 2 +- .../ui/viewHolders/ChatRecyclerViewHolder.kt | 30 +- ...older.kt => EmptyShopSectionViewHolder.kt} | 0 .../ui/viewHolders/GroupMemberViewHolder.kt | 4 +- .../ui/viewHolders/MountViewHolder.kt | 10 +- .../habitica/ui/viewHolders/PetViewHolder.kt | 14 +- .../ui/viewHolders/SectionViewHolder.kt | 8 +- .../ui/viewHolders/ShopItemViewHolder.kt | 3 +- .../viewHolders/tasks/BaseTaskViewHolder.kt | 14 +- .../tasks/ChecklistedViewHolder.kt | 12 +- .../ui/viewHolders/tasks/DailyViewHolder.kt | 8 +- .../ui/viewHolders/tasks/HabitViewHolder.kt | 6 +- .../ui/viewHolders/tasks/RewardViewHolder.kt | 36 +- .../ui/viewHolders/tasks/TodoViewHolder.kt | 6 +- .../ui/viewmodels/AuthenticationViewModel.kt | 296 ++-- .../habitica/ui/viewmodels/BaseViewModel.kt | 4 +- .../habitica/ui/viewmodels/GroupViewModel.kt | 504 +++---- .../habitica/ui/viewmodels/InboxViewModel.kt | 103 +- .../ui/viewmodels/MainActivityViewModel.kt | 318 ++--- .../ui/viewmodels/MainUserViewModel.kt | 144 +- .../ui/viewmodels/NotificationsViewModel.kt | 830 ++++++------ .../habitica/ui/viewmodels/PartyViewModel.kt | 134 +- .../habitica/ui/viewmodels/StableViewModel.kt | 256 ++-- .../ui/viewmodels/TaskFormViewModel.kt | 22 +- .../habitica/ui/viewmodels/TasksViewModel.kt | 660 ++++----- .../equipment/EquipmentOverviewViewModel.kt | 36 +- .../habitica/ui/views/AppHeaderView.kt | 169 ++- .../habitica/ui/views/BackgroundScene.kt | 16 +- .../habitica/ui/views/BottomSheetUtils.kt | 41 +- .../android/habitica/ui/views/BuffIcon.kt | 2 +- .../android/habitica/ui/views/ClassIcon.kt | 2 +- .../android/habitica/ui/views/ClassText.kt | 16 +- .../ui/views/CollapsibleSectionView.kt | 16 +- .../android/habitica/ui/views/CompletedAt.kt | 10 +- .../android/habitica/ui/views/CurrencyText.kt | 22 +- .../android/habitica/ui/views/CurrencyView.kt | 8 +- .../habitica/ui/views/CurrencyViews.kt | 6 +- .../habitica/ui/views/DayNightTextView.kt | 6 +- .../habitica/ui/views/DragLinearLayout.kt | 1188 ++++++++--------- .../habitica/ui/views/EllipsisTextView.kt | 4 +- .../habitica/ui/views/ExtraLabelPreference.kt | 2 +- .../android/habitica/ui/views/FlowLayout.kt | 6 +- .../habitica/ui/views/GroupPlanMemberList.kt | 52 +- .../habitica/ui/views/HabiticaButton.kt | 22 +- .../habitica/ui/views/HabiticaSnackbar.kt | 780 +++++------ .../android/habitica/ui/views/LabeledBar.kt | 50 +- .../habitica/ui/views/LoadingButton.kt | 122 +- .../habitica/ui/views/NPCBannerView.kt | 1 - .../android/habitica/ui/views/PixelArtView.kt | 8 +- .../habitica/ui/views/SegmentedControl.kt | 172 +-- .../android/habitica/ui/views/SparkView.kt | 238 ++-- .../ui/views/SupportCollapsibleSection.kt | 10 +- .../android/habitica/ui/views/Typewriter.kt | 2 +- .../android/habitica/ui/views/UserRow.kt | 22 +- .../habitica/ui/views/UsernameLabel.kt | 152 +-- .../habitica/ui/views/ValidatingEditText.kt | 110 +- .../android/habitica/ui/views/ads/AdButton.kt | 222 +-- .../ui/views/dialogs/AchievementDialog.kt | 32 +- .../ui/views/dialogs/FirstDropDialog.kt | 2 +- .../ui/views/dialogs/HabiticaAlertDialog.kt | 12 +- .../views/dialogs/HabiticaProgressDialog.kt | 4 +- .../ui/views/dialogs/PetSuggestHatchDialog.kt | 32 +- .../ui/views/dialogs/QuestCompletedDialog.kt | 2 +- .../dialogs/QuestCompletedDialogContent.kt | 8 +- .../views/equipment/EquipmentOverviewView.kt | 166 +-- .../InsufficientGemsDialog.kt | 13 +- .../InsufficientHourglassesDialog.kt | 4 +- .../ui/views/login/LoginBackgroundView.kt | 6 +- .../habitica/ui/views/login/StarView.kt | 2 +- .../views/navigation/BottomNavigationItem.kt | 132 +- .../navigation/BottomNavigationSubmenuItem.kt | 64 +- .../HabiticaBottomNavigationView.kt | 472 +++---- .../preferences/PauseResumeDamageView.kt | 48 +- .../progress/HabiticaPullRefreshIndicator.kt | 18 +- .../ui/views/promo/BirthdayMenuView.kt | 58 +- .../habitica/ui/views/promo/PromoMenuView.kt | 116 +- .../promo/SubscriptionBuyGemsPromoView.kt | 38 +- .../ui/views/setup/AvatarCategoryView.kt | 2 +- .../habitica/ui/views/shops/PurchaseDialog.kt | 16 +- .../shops/PurchaseDialogBackgroundContent.kt | 2 +- .../ui/views/shops/PurchaseDialogContent.kt | 60 +- .../PurchaseDialogCustomizationContent.kt | 2 +- .../views/shops/PurchaseDialogGearContent.kt | 2 +- .../views/shops/PurchaseDialogQuestContent.kt | 6 +- .../habitica/ui/views/social/ChatBarView.kt | 2 +- .../ui/views/social/InvitationsView.kt | 92 +- .../ui/views/social/OldQuestProgressView.kt | 4 +- .../ui/views/social/PartySeekingListItem.kt | 42 +- .../ui/views/stable/MountBottomSheet.kt | 92 +- .../habitica/ui/views/stable/MountView.kt | 52 +- .../ui/views/stable/PetBottomSheet.kt | 196 +-- .../ui/views/stats/BulkAllocateStatsDialog.kt | 8 +- .../ui/views/stats/StatsSliderView.kt | 10 +- .../habitica/ui/views/stats/StatsView.kt | 68 +- .../subscriptions/SubscriberBenefitView.kt | 120 +- .../subscriptions/SubscriptionDetailsView.kt | 3 +- .../subscriptions/SubscriptionOptionView.kt | 33 +- .../habitica/ui/views/tasks/AssignSheet.kt | 66 +- .../habitica/ui/views/tasks/AssignedView.kt | 60 +- .../ui/views/tasks/TaskFilterDialog.kt | 30 +- .../ui/views/tasks/form/ChecklistContainer.kt | 172 +-- .../views/tasks/form/ChecklistItemFormView.kt | 206 +-- .../tasks/form/HabitScoringButtonsView.kt | 46 +- .../ui/views/tasks/form/ReminderContainer.kt | 4 +- .../views/tasks/form/ReminderItemFormView.kt | 317 +++-- .../views/tasks/form/StepperValueFormView.kt | 182 +-- .../views/tasks/form/TaskDifficultyButtons.kt | 50 +- .../ui/views/tasks/form/TaskFormSelector.kt | 40 +- .../tasks/form/TaskSchedulingControls.kt | 805 ++++++----- .../views/yesterdailies/YesterdailyDialog.kt | 30 +- .../utils/AchievementListDeserializer.kt | 2 +- .../utils/AssignedDetailsDeserializer.kt | 8 +- .../habitica/utils/BooleanAsIntAdapter.kt | 2 +- .../habitica/utils/ChallengeDeserializer.kt | 6 +- .../utils/ChallengeListDeserializer.kt | 2 +- .../habitica/utils/ChatMessageDeserializer.kt | 4 +- .../habitica/utils/ContentDeserializer.kt | 6 +- .../utils/CustomizationDeserializer.kt | 32 +- .../habitica/utils/DateDeserializer.kt | 4 +- .../utils/FAQArticleListDeserilializer.kt | 2 +- .../utils/FeedResponseDeserializer.kt | 2 +- .../utils/FindUsernameResultDeserializer.kt | 4 +- .../habitica/utils/GroupSerialization.kt | 6 +- .../habitica/utils/MemberSerialization.kt | 6 +- .../utils/NotificationDeserializer.kt | 2 +- .../utils/OwnedItemListDeserializer.kt | 2 +- .../utils/OwnedMountListDeserializer.kt | 2 +- .../utils/OwnedPetListDeserializer.kt | 2 +- .../utils/QuestCollectDeserializer.kt | 2 +- .../habitica/utils/QuestDeserializer.kt | 2 +- .../utils/QuestDropItemsListSerialization.kt | 2 +- .../habitica/utils/SkillDeserializer.kt | 2 +- .../utils/SocialAuthenticationDeserializer.kt | 2 +- .../habitica/utils/TaskListDeserializer.kt | 6 +- .../android/habitica/utils/TaskSerializer.kt | 10 +- .../habitica/utils/TaskTagDeserializer.kt | 4 +- .../utils/TutorialStepListDeserializer.kt | 4 +- .../habitica/utils/UserDeserializer.kt | 4 +- .../habitica/utils/WorldStateSerialization.kt | 2 +- .../habitica/widget/AddTaskWidgetProvider.kt | 12 +- .../widget/AvatarStatsWidgetProvider.kt | 30 +- .../habitica/widget/BaseWidgetProvider.kt | 20 +- .../habitica/widget/DailiesListFactory.kt | 18 +- .../widget/HabitButtonWidgetProvider.kt | 14 +- .../widget/HabitButtonWidgetService.kt | 16 +- .../habitica/widget/TaskListFactory.kt | 4 +- .../habitica/widget/TaskListWidgetProvider.kt | 16 +- .../habitica/widget/TodoListFactory.kt | 18 +- .../implementation/TaskRepositoryImplTest.kt | 2 +- .../helpers/MarkdownProcessingTest.kt | 2 +- .../habitica/utils/DateDeserializerTest.kt | 8 +- .../common/habitica/api/HostConfig.kt | 2 +- .../habitica/extensions/BaseExtensions.kt | 2 +- .../extensions/BaseViewModelExtensions.kt | 4 +- .../habitica/extensions/DataBindingUtils.kt | 17 +- .../extensions/DrawableExtendsions.kt | 4 +- .../habitica/extensions/TextViewExtensions.kt | 2 +- .../common/habitica/extensions/ViewExt.kt | 6 +- .../extensions/ViewGroupExtensions.kt | 2 +- .../common/habitica/helpers/Animations.kt | 6 +- .../habitica/helpers/AppTestingLevel.kt | 2 +- .../habitica/helpers/ExceptionHandler.kt | 4 +- .../habitica/helpers/HealthFormatter.kt | 4 +- .../common/habitica/helpers/KeyHelper.kt | 434 +++--- .../helpers/MainNavigationController.kt | 4 +- .../common/habitica/helpers/MarkdownParser.kt | 10 +- .../habitica/helpers/NumberAbbreviator.kt | 4 +- .../helpers/RecyclerViewEmptySupport.kt | 14 +- .../common/habitica/models/Notification.kt | 2 +- .../common/habitica/models/PlayerTier.kt | 4 +- .../common/habitica/models/auth/UserAuth.kt | 2 +- .../common/habitica/theme/HabiticaTheme.kt | 134 +- .../common/habitica/views/AvatarView.kt | 29 +- .../habitica/views/ComposableAvatarView.kt | 4 +- .../views/HabiticaCircularProgressView.kt | 34 +- .../habitica/views/HabiticaProgressBar.kt | 200 +-- .../common/habitica/views/PixelArtView.kt | 124 +- .../common/habitica/views/ValueBar.kt | 4 +- .../shared/habitica/PlatformLogger.kt | 10 +- .../com/habitrpg/shared/habitica/Logger.kt | 24 +- .../com/habitrpg/shared/habitica/Platform.kt | 4 +- .../models/responses/TaskDirection.kt | 2 +- .../models/responses/TaskDirectionDataTemp.kt | 3 +- .../models/responses/TaskScoringResult.kt | 7 +- .../shared/habitica/models/tasks/Attribute.kt | 2 +- .../shared/habitica/models/tasks/Frequency.kt | 2 +- .../habitica/models/tasks/HabitResetOption.kt | 2 +- .../habitica/models/tasks/TaskDifficulty.kt | 2 +- .../shared/habitica/models/tasks/TaskType.kt | 2 +- .../habitica/models/tasks/TasksOrder.kt | 2 +- .../shared/habitica/PlatformLogger.kt | 10 +- .../shared/habitica/PlatformLogger.js.kt | 10 +- .../wearos/habitica/data/ApiClient.kt | 398 +++--- .../wearos/habitica/data/ApiService.kt | 40 +- .../data/repositories/TaskLocalRepository.kt | 212 +-- .../data/repositories/TaskRepository.kt | 150 +-- .../data/repositories/UserLocalRepository.kt | 22 +- .../data/repositories/UserRepository.kt | 74 +- .../wearos/habitica/extensions/ViewExt.kt | 2 +- .../habitica/managers/AppStateManager.kt | 24 +- .../habitica/models/tasks/ChecklistItem.kt | 4 +- .../wearos/habitica/models/tasks/Days.kt | 2 +- .../habitica/models/tasks/RemindersItem.kt | 2 +- .../wearos/habitica/models/tasks/Task.kt | 2 +- .../wearos/habitica/models/user/MenuItem.kt | 2 +- .../wearos/habitica/modules/AppModule.kt | 12 +- .../habitica/ui/activities/AvatarActivity.kt | 2 +- .../habitica/ui/activities/BaseActivity.kt | 14 +- .../habitica/ui/activities/FaintActivity.kt | 2 +- .../habitica/ui/activities/LevelupActivity.kt | 8 +- .../habitica/ui/activities/LoginActivity.kt | 4 +- .../habitica/ui/activities/MainActivity.kt | 16 +- .../habitica/ui/activities/RYAActivity.kt | 4 +- .../ui/activities/SettingsActivity.kt | 10 +- .../ui/activities/TaskDetailActivity.kt | 6 +- .../ui/activities/TaskFormActivity.kt | 8 +- .../ui/activities/TaskListActivity.kt | 14 +- .../ui/activities/TaskResultActivity.kt | 16 +- .../habitica/ui/adapters/BaseAdapter.kt | 4 +- .../habitica/ui/adapters/DailyListAdapter.kt | 2 +- .../habitica/ui/adapters/HabitListAdapter.kt | 2 +- .../wearos/habitica/ui/adapters/HubAdapter.kt | 4 +- .../habitica/ui/adapters/RewardListAdapter.kt | 2 +- .../habitica/ui/adapters/SettingsAdapter.kt | 8 +- .../habitica/ui/adapters/TaskListAdapter.kt | 4 +- .../habitica/ui/adapters/ToDoListAdapter.kt | 2 +- .../ui/viewHolders/HeaderTaskViewHolder.kt | 2 +- .../tasks/CheckedTaskViewHolder.kt | 8 +- .../habitica/ui/viewmodels/AvatarViewModel.kt | 28 +- .../habitica/ui/viewmodels/BaseViewModel.kt | 2 +- .../ConfirmactionActivityViewModel.kt | 22 +- .../ui/viewmodels/ContinuePhoneViewModel.kt | 28 +- .../habitica/ui/viewmodels/FaintViewModel.kt | 22 +- .../ui/viewmodels/HabitDirectionViewModel.kt | 24 +- .../habitica/ui/viewmodels/InputViewModel.kt | 22 +- .../ui/viewmodels/LevelupViewModel.kt | 24 +- .../habitica/ui/viewmodels/LoginViewModel.kt | 244 ++-- .../habitica/ui/viewmodels/MainViewModel.kt | 34 +- .../habitica/ui/viewmodels/RYAViewModel.kt | 92 +- .../ui/viewmodels/SettingsViewModel.kt | 66 +- .../habitica/ui/viewmodels/SplashViewModel.kt | 110 +- .../habitica/ui/viewmodels/StatsViewModel.kt | 44 +- .../ui/viewmodels/TaskDetailViewModel.kt | 22 +- .../ui/viewmodels/TaskFormViewModel.kt | 44 +- .../ui/viewmodels/TaskListViewModel.kt | 210 +-- .../ui/viewmodels/TaskResultViewModel.kt | 16 +- .../wearos/habitica/ui/views/AddTaskButton.kt | 116 +- .../habitica/ui/views/CircularProgressView.kt | 14 +- .../ui/views/HabitDirectionPickerButton.kt | 146 +- .../habitica/ui/views/HabiticaRecyclerView.kt | 198 +-- .../habitica/ui/views/HabiticaScrollView.kt | 72 +- .../ui/views/IndeterminateProgressView.kt | 146 +- .../wearos/habitica/ui/views/StatValueView.kt | 80 +- .../habitica/ui/views/TaskRewardChip.kt | 124 +- .../wearos/habitica/ui/views/TaskTextView.kt | 106 +- .../habitica/ui/views/TextActionChipView.kt | 62 +- .../habitica/ui/views/TextViewWrapper.kt | 4 +- .../wearos/habitica/ui/views/TimeText.kt | 416 +++--- .../habitica/util/ExceptionHandlerBuilder.kt | 56 +- .../util/HabiticaScrollingLayoutCallback.kt | 2 +- .../habitica/util/ScrollAwayBehavior.kt | 6 +- .../habitica/util/TopScrollAwayBehavior.kt | 6 +- .../habitrpg/wearos/habitica/ProjectConfig.kt | 2 +- 526 files changed, 11518 insertions(+), 11538 deletions(-) rename Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/{EmptySectionViewHolder.kt => EmptyShopSectionViewHolder.kt} (100%) diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/HabiticaTestCase.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/HabiticaTestCase.kt index 76560b2de..71494c6d9 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/HabiticaTestCase.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/HabiticaTestCase.kt @@ -106,7 +106,7 @@ open class HabiticaTestCase : TestCase() { internal fun loadJsonFile( s: String, - type: Type, + type: Type ): T { val userStream = javaClass.classLoader?.getResourceAsStream("$s.json") return gson.fromJson(gson.newJsonReader(InputStreamReader(userStream)), type) @@ -138,7 +138,7 @@ open class HabiticaTestCase : TestCase() { private fun assign( it: KCallable<*>, obj: C, - value: P, + value: P ) { if ((it as KMutableProperty1).javaField!!.get(obj) == null) { it.set(obj, value) diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivityTest.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivityTest.kt index 41d29336e..6a4d555da 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivityTest.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivityTest.kt @@ -296,7 +296,7 @@ class TaskFormActivityTest : ActivityTestCase() { } KSpinner( builder = { withId(R.id.repeats_every_spinner) }, - itemTypeBuilder = { itemType(::KSpinnerItem) }, + itemTypeBuilder = { itemType(::KSpinnerItem) } ) perform { open() childAt(1) { diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/FragmentTestCase.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/FragmentTestCase.kt index b3d225790..bedf2b235 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/FragmentTestCase.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/FragmentTestCase.kt @@ -9,7 +9,7 @@ import io.github.kakaocup.kakao.screen.Screen import org.junit.Before abstract class FragmentTestCase>( - val shouldLaunchFragment: Boolean = true, + val shouldLaunchFragment: Boolean = true ) : HabiticaTestCase() { lateinit var scenario: FragmentScenario lateinit var fragment: F diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragmentTest.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragmentTest.kt index 2602bb61b..0ee251451 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragmentTest.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragmentTest.kt @@ -27,9 +27,9 @@ class NavigationDrawerScreen : Screen() { KRecyclerView({ withId(R.id.recyclerView) }, itemTypeBuilder = { - itemType(::SectionHeaderItem) - itemType(::MainItem) - }) + itemType(::SectionHeaderItem) + itemType(::MainItem) + }) } @LargeTest diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragmentTest.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragmentTest.kt index af55ebe0b..157975696 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragmentTest.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragmentTest.kt @@ -46,14 +46,14 @@ private val KTextView.text: CharSequence? override fun perform( uiController: UiController?, - view: View?, + view: View? ) { val tv = view as TextView string = tv.text } - }, + } + ) ) - ) return string } @@ -67,8 +67,8 @@ class ItemScreen : Screen() { KRecyclerView({ withId(R.id.recyclerView) }, itemTypeBuilder = { - itemType(::ItemItem) - }) + itemType(::ItemItem) + }) } internal class ItemRecyclerFragmentTest : FragmentTestCase(false) { diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailFragmentTest.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailFragmentTest.kt index 4f6eb911b..f79f74045 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailFragmentTest.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailFragmentTest.kt @@ -25,9 +25,9 @@ class PetDetailScreen : Screen() { KRecyclerView({ withId(R.id.recyclerView) }, itemTypeBuilder = { - itemType(::SectionItem) - itemType(::PetItem) - }) + itemType(::SectionItem) + itemType(::PetItem) + }) } internal class PetDetailRecyclerFragmentTest : @@ -43,9 +43,9 @@ internal class PetDetailRecyclerFragmentTest : mapOf( Pair( "Saddle-food", - saddle, - ), - ), + saddle + ) + ) ) fragment = spyk() @@ -69,18 +69,18 @@ internal class PetDetailRecyclerFragmentTest : inventoryRepository.getPets( any(), any(), - any(), + any() ) } returns flowOf(content.pets.filter { it.animal == "Cactus" }) every { inventoryRepository.getMounts( any(), any(), - any(), + any() ) } returns flowOf(content.mounts.filter { it.animal == "Cactus" }) launchFragment( - PetDetailRecyclerFragmentArgs.Builder("cactus", "drop", "").build().toBundle(), + PetDetailRecyclerFragmentArgs.Builder("cactus", "drop", "").build().toBundle() ) screen { recycler { @@ -102,14 +102,14 @@ internal class PetDetailRecyclerFragmentTest : inventoryRepository.getPets( any(), any(), - any(), + any() ) } returns flowOf(content.pets.filter { it.animal == "Fox" }) every { inventoryRepository.getMounts( any(), any(), - any(), + any() ) } returns flowOf(content.mounts.filter { it.animal == "Fox" }) launchFragment(PetDetailRecyclerFragmentArgs.Builder("fox", "drop", "").build().toBundle()) diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragmentTest.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragmentTest.kt index 10e189d5a..4d6f6babb 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragmentTest.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragmentTest.kt @@ -34,9 +34,9 @@ class StableScreen : Screen() { KRecyclerView({ withId(R.id.recyclerView) }, itemTypeBuilder = { - itemType(::SectionItem) - itemType(::PetItem) - }) + itemType(::SectionItem) + itemType(::PetItem) + }) } internal class StableRecyclerFragmentTest : FragmentTestCase(false) { diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragmentTest.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragmentTest.kt index 874ef2254..f000cd27f 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragmentTest.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragmentTest.kt @@ -32,8 +32,8 @@ class TaskListScreen : Screen() { KRecyclerView({ withId(R.id.recyclerView) }, itemTypeBuilder = { - itemType(::TaskItem) - }) + itemType(::TaskItem) + }) } internal class TaskRecyclerViewFragmentTest : FragmentTestCase(false) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt index efc40d8e8..95dd25a41 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt @@ -14,7 +14,6 @@ import android.database.sqlite.SQLiteDatabase import android.os.Build import android.os.Build.VERSION.SDK_INT import android.os.Bundle -import android.provider.Settings import android.util.Log import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.edit @@ -39,7 +38,6 @@ import com.habitrpg.android.habitica.modules.AuthenticationHandler import com.habitrpg.android.habitica.ui.activities.BaseActivity import com.habitrpg.android.habitica.ui.activities.LoginActivity import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper -import com.habitrpg.common.habitica.extensions.DataBindingUtils import com.habitrpg.common.habitica.extensions.setupCoil import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.LanguageHelper @@ -161,8 +159,8 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife val configuration: Configuration = resources.configuration val languageHelper = LanguageHelper(sharedPrefs.getString("language", "en")) if (if (SDK_INT >= Build.VERSION_CODES.N) { - configuration.locales.isEmpty || configuration.locales[0] != languageHelper.locale - } else { + configuration.locales.isEmpty || configuration.locales[0] != languageHelper.locale + } else { @Suppress("DEPRECATION") configuration.locale != languageHelper.locale } @@ -216,7 +214,7 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife override fun openOrCreateDatabase( name: String, mode: Int, - factory: SQLiteDatabase.CursorFactory?, + factory: SQLiteDatabase.CursorFactory? ): SQLiteDatabase { return super.openOrCreateDatabase(getDatabasePath(name).absolutePath, mode, factory) } @@ -225,13 +223,13 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife name: String, mode: Int, factory: SQLiteDatabase.CursorFactory?, - errorHandler: DatabaseErrorHandler?, + errorHandler: DatabaseErrorHandler? ): SQLiteDatabase { return super.openOrCreateDatabase( getDatabasePath(name).absolutePath, mode, factory, - errorHandler, + errorHandler ) } @@ -299,7 +297,7 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife override fun onActivityCreated( p0: Activity, - p1: Bundle?, + p1: Bundle? ) { } @@ -308,7 +306,7 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife override fun onActivitySaveInstanceState( p0: Activity, - p1: Bundle, + p1: Bundle ) { } @@ -350,7 +348,7 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife private fun startActivity( activityClass: Class<*>, - context: Context, + context: Context ) { val intent = Intent(context, activityClass) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt index a51fbbdf4..8fbe233ef 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt @@ -63,7 +63,7 @@ interface ApiService { @GET("inbox/messages") suspend fun getInboxMessages( @Query("conversation") uuid: String, - @Query("page") page: Int, + @Query("page") page: Int ): HabitResponse> @GET("inbox/conversations") @@ -77,17 +77,17 @@ interface ApiService { @GET("content") suspend fun getContent( - @Query("language") language: String?, + @Query("language") language: String? ): HabitResponse @PUT("user/") suspend fun updateUser( - @Body updateDictionary: Map, + @Body updateDictionary: Map ): HabitResponse @PUT("user/") suspend fun registrationLanguage( - @Header("Accept-Language") registrationLanguage: String, + @Header("Accept-Language") registrationLanguage: String ): HabitResponse @GET("user/in-app-rewards") @@ -96,171 +96,171 @@ interface ApiService { @POST("user/equip/{type}/{key}") suspend fun equipItem( @Path("type") type: String, - @Path("key") itemKey: String, + @Path("key") itemKey: String ): HabitResponse @POST("user/buy/{key}") suspend fun buyItem( @Path("key") itemKey: String, - @Body quantity: Map, + @Body quantity: Map ): HabitResponse @POST("user/purchase/{type}/{key}") suspend fun purchaseItem( @Path("type") type: String, @Path("key") itemKey: String, - @Body quantity: Map, + @Body quantity: Map ): HabitResponse @POST("user/purchase-hourglass/{type}/{key}") suspend fun purchaseHourglassItem( @Path("type") type: String, - @Path("key") itemKey: String, + @Path("key") itemKey: String ): HabitResponse @POST("user/buy-mystery-set/{key}") suspend fun purchaseMysterySet( - @Path("key") itemKey: String, + @Path("key") itemKey: String ): HabitResponse @POST("user/buy-quest/{key}") suspend fun purchaseQuest( - @Path("key") key: String, + @Path("key") key: String ): HabitResponse @POST("user/buy-special-spell/{key}") suspend fun purchaseSpecialSpell( - @Path("key") key: String, + @Path("key") key: String ): HabitResponse @POST("user/sell/{type}/{key}") suspend fun sellItem( @Path("type") itemType: String, - @Path("key") itemKey: String, + @Path("key") itemKey: String ): HabitResponse @POST("user/feed/{pet}/{food}") suspend fun feedPet( @Path("pet") petKey: String, - @Path("food") foodKey: String, + @Path("food") foodKey: String ): HabitResponse @POST("user/hatch/{egg}/{hatchingPotion}") suspend fun hatchPet( @Path("egg") eggKey: String, - @Path("hatchingPotion") hatchingPotionKey: String, + @Path("hatchingPotion") hatchingPotionKey: String ): HabitResponse @GET("tasks/user") suspend fun getTasks( - @Query("type") type: String, + @Query("type") type: String ): HabitResponse @GET("tasks/user") suspend fun getTasks( @Query("type") type: String, - @Query("dueDate") dueDate: String, + @Query("dueDate") dueDate: String ): HabitResponse @POST("user/unlock") suspend fun unlockPath( - @Query("path") path: String, + @Query("path") path: String ): HabitResponse @GET("tasks/{id}") suspend fun getTask( - @Path("id") id: String, + @Path("id") id: String ): HabitResponse @POST("tasks/{id}/score/{direction}") suspend fun postTaskDirection( @Path("id") id: String, - @Path("direction") direction: String, + @Path("direction") direction: String ): HabitResponse @POST("tasks/bulk-score") suspend fun bulkScoreTasks( - @Body data: List>, + @Body data: List> ): HabitResponse @POST("tasks/{id}/move/to/{position}") suspend fun postTaskNewPosition( @Path("id") id: String, - @Path("position") position: Int, + @Path("position") position: Int ): HabitResponse> @POST("tasks/{taskId}/checklist/{itemId}/score") suspend fun scoreChecklistItem( @Path("taskId") taskId: String, - @Path("itemId") itemId: String, + @Path("itemId") itemId: String ): HabitResponse @POST("tasks/user") suspend fun createTask( - @Body item: Task, + @Body item: Task ): HabitResponse @POST("tasks/group/{groupId}") suspend fun createGroupTask( @Path("groupId") groupId: String, - @Body item: Task, + @Body item: Task ): HabitResponse @POST("tasks/user") suspend fun createTasks( - @Body tasks: List, + @Body tasks: List ): HabitResponse> @PUT("tasks/{id}") suspend fun updateTask( @Path("id") id: String, - @Body item: Task, + @Body item: Task ): HabitResponse @DELETE("tasks/{id}") suspend fun deleteTask( - @Path("id") id: String, + @Path("id") id: String ): HabitResponse @POST("tags") suspend fun createTag( - @Body tag: Tag, + @Body tag: Tag ): HabitResponse @PUT("tags/{id}") suspend fun updateTag( @Path("id") id: String, - @Body tag: Tag, + @Body tag: Tag ): HabitResponse @DELETE("tags/{id}") suspend fun deleteTag( - @Path("id") id: String, + @Path("id") id: String ): HabitResponse @POST("user/auth/local/register") suspend fun registerUser( - @Body auth: UserAuth, + @Body auth: UserAuth ): HabitResponse @POST("user/auth/local/login") suspend fun connectLocal( - @Body auth: UserAuth, + @Body auth: UserAuth ): HabitResponse @POST("user/auth/social") suspend fun connectSocial( - @Body auth: UserAuthSocial, + @Body auth: UserAuthSocial ): HabitResponse @DELETE("user/auth/social/{network}") suspend fun disconnectSocial( - @Path("network") network: String, + @Path("network") network: String ): HabitResponse @POST("user/auth/apple") suspend fun loginApple( - @Body auth: Map, + @Body auth: Map ): HabitResponse @POST("user/sleep") @@ -273,13 +273,13 @@ interface ApiService { suspend fun useSkill( @Path("skill") skillName: String, @Query("targetType") targetType: String, - @Query("targetId") targetId: String, + @Query("targetId") targetId: String ): HabitResponse @POST("user/class/cast/{skill}") suspend fun useSkill( @Path("skill") skillName: String, - @Query("targetType") targetType: String, + @Query("targetType") targetType: String ): HabitResponse @POST("user/change-class") @@ -287,7 +287,7 @@ interface ApiService { @POST("user/change-class") suspend fun changeClass( - @Query("class") className: String, + @Query("class") className: String ): HabitResponse @POST("user/disable-classes") @@ -300,164 +300,164 @@ interface ApiService { @GET("groups") suspend fun listGroups( - @Query("type") type: String, + @Query("type") type: String ): HabitResponse> @GET("groups/{gid}") suspend fun getGroup( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse @POST("groups") suspend fun createGroup( - @Body item: Group, + @Body item: Group ): HabitResponse @PUT("groups/{id}") suspend fun updateGroup( @Path("id") id: String, - @Body item: Group, + @Body item: Group ): HabitResponse @POST("groups/{groupID}/removeMember/{userID}") suspend fun removeMemberFromGroup( @Path("groupID") groupID: String, - @Path("userID") userID: String, + @Path("userID") userID: String ): HabitResponse @GET("groups/{gid}/chat") suspend fun listGroupChat( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse> @POST("groups/{gid}/join") suspend fun joinGroup( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse @POST("groups/{gid}/leave") suspend fun leaveGroup( @Path("gid") groupId: String, - @Query("keepChallenges") keepChallenges: String, + @Query("keepChallenges") keepChallenges: String ): HabitResponse @POST("groups/{gid}/chat") suspend fun postGroupChat( @Path("gid") groupId: String, - @Body message: Map, + @Body message: Map ): HabitResponse @DELETE("groups/{gid}/chat/{messageId}") suspend fun deleteMessage( @Path("gid") groupId: String, - @Path("messageId") messageId: String, + @Path("messageId") messageId: String ): HabitResponse @DELETE("inbox/messages/{messageId}") suspend fun deleteInboxMessage( - @Path("messageId") messageId: String, + @Path("messageId") messageId: String ): HabitResponse @GET("groups/{gid}/members") suspend fun getGroupMembers( @Path("gid") groupId: String, - @Query("includeAllPublicFields") includeAllPublicFields: Boolean?, + @Query("includeAllPublicFields") includeAllPublicFields: Boolean? ): HabitResponse> @GET("groups/{gid}/members") suspend fun getGroupMembers( @Path("gid") groupId: String, @Query("includeAllPublicFields") includeAllPublicFields: Boolean?, - @Query("lastId") lastId: String, + @Query("lastId") lastId: String ): HabitResponse> // Like returns the full chat list @POST("groups/{gid}/chat/{mid}/like") suspend fun likeMessage( @Path("gid") groupId: String, - @Path("mid") mid: String, + @Path("mid") mid: String ): HabitResponse @POST("groups/{gid}/chat/{mid}/flag") suspend fun flagMessage( @Path("gid") groupId: String, @Path("mid") mid: String, - @Body data: Map, + @Body data: Map ): HabitResponse @POST("members/{mid}/flag") suspend fun reportMember( @Path("mid") mid: String, - @Body data: Map, + @Body data: Map ): HabitResponse @POST("groups/{gid}/chat/seen") suspend fun seenMessages( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse @POST("groups/{gid}/invite") suspend fun inviteToGroup( @Path("gid") groupId: String, - @Body inviteData: Map, + @Body inviteData: Map ): HabitResponse> @POST("groups/{gid}/reject-invite") suspend fun rejectGroupInvite( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse @POST("groups/{gid}/quests/accept") suspend fun acceptQuest( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse @POST("groups/{gid}/quests/reject") suspend fun rejectQuest( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse @POST("groups/{gid}/quests/cancel") suspend fun cancelQuest( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse @POST("groups/{gid}/quests/force-start") suspend fun forceStartQuest( @Path("gid") groupId: String, - @Body group: Group, + @Body group: Group ): HabitResponse @POST("groups/{gid}/quests/invite/{questKey}") suspend fun inviteToQuest( @Path("gid") groupId: String, - @Path("questKey") questKey: String, + @Path("questKey") questKey: String ): HabitResponse @GET("groups/{gid}/invites") suspend fun getGroupInvites( @Path("gid") groupId: String, - @Query("includeAllPublicFields") includeAllPublicFields: Boolean?, + @Query("includeAllPublicFields") includeAllPublicFields: Boolean? ): HabitResponse> @POST("groups/{gid}/quests/abort") suspend fun abortQuest( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse @POST("groups/{gid}/quests/leave") suspend fun leaveQuest( - @Path("gid") groupId: String, + @Path("gid") groupId: String ): HabitResponse @POST("/iap/android/verify") suspend fun validatePurchase( - @Body request: PurchaseValidationRequest, + @Body request: PurchaseValidationRequest ): HabitResponse @POST("/iap/android/subscribe") suspend fun validateSubscription( - @Body request: PurchaseValidationRequest, + @Body request: PurchaseValidationRequest ): HabitResponse @GET("/iap/android/subscribe/cancel") @@ -465,69 +465,69 @@ interface ApiService { @POST("/iap/android/norenew-subscribe") suspend fun validateNoRenewSubscription( - @Body request: PurchaseValidationRequest, + @Body request: PurchaseValidationRequest ): HabitResponse @POST("user/custom-day-start") suspend fun changeCustomDayStart( - @Body updateObject: Map, + @Body updateObject: Map ): HabitResponse // Members URL @GET("members/{mid}") suspend fun getMember( - @Path("mid") memberId: String, + @Path("mid") memberId: String ): HabitResponse @GET("members/username/{username}") suspend fun getMemberWithUsername( - @Path("username") username: String, + @Path("username") username: String ): HabitResponse @GET("members/{mid}/achievements") suspend fun getMemberAchievements( @Path("mid") memberId: String, - @Query("lang") language: String?, + @Query("lang") language: String? ): HabitResponse> @POST("members/send-private-message") suspend fun postPrivateMessage( - @Body messageDetails: Map, + @Body messageDetails: Map ): HabitResponse @GET("members/find/{username}") suspend fun findUsernames( @Path("username") username: String, @Query("context") context: String?, - @Query("id") id: String?, + @Query("id") id: String? ): HabitResponse> @POST("members/flag-private-message/{mid}") suspend fun flagInboxMessage( @Path("mid") mid: String, - @Body data: Map, + @Body data: Map ): HabitResponse @GET("shops/{identifier}") suspend fun retrieveShopInventory( @Path("identifier") identifier: String, - @Query("lang") language: String?, + @Query("lang") language: String? ): HabitResponse @GET("shops/market-gear") suspend fun retrieveMarketGear( - @Query("lang") language: String?, + @Query("lang") language: String? ): HabitResponse // Push notifications @POST("user/push-devices") suspend fun addPushDevice( - @Body pushDeviceData: Map, + @Body pushDeviceData: Map ): HabitResponse> @DELETE("user/push-devices/{regId}") suspend fun deletePushDevice( - @Path("regId") regId: String, + @Path("regId") regId: String ): HabitResponse> // challenges api @@ -535,61 +535,61 @@ interface ApiService { @GET("challenges/user") suspend fun getUserChallenges( @Query("page") page: Int?, - @Query("member") memberOnly: Boolean, + @Query("member") memberOnly: Boolean ): HabitResponse> @GET("challenges/user") suspend fun getUserChallenges( - @Query("page") page: Int?, + @Query("page") page: Int? ): HabitResponse> @GET("tasks/challenge/{challengeId}") suspend fun getChallengeTasks( - @Path("challengeId") challengeId: String, + @Path("challengeId") challengeId: String ): HabitResponse @GET("challenges/{challengeId}") suspend fun getChallenge( - @Path("challengeId") challengeId: String, + @Path("challengeId") challengeId: String ): HabitResponse @POST("challenges/{challengeId}/join") suspend fun joinChallenge( - @Path("challengeId") challengeId: String, + @Path("challengeId") challengeId: String ): HabitResponse @POST("challenges/{challengeId}/leave") suspend fun leaveChallenge( @Path("challengeId") challengeId: String, - @Body body: LeaveChallengeBody, + @Body body: LeaveChallengeBody ): HabitResponse @POST("challenges") suspend fun createChallenge( - @Body challenge: Challenge, + @Body challenge: Challenge ): HabitResponse @POST("tasks/challenge/{challengeId}") suspend fun createChallengeTasks( @Path("challengeId") challengeId: String, - @Body tasks: List, + @Body tasks: List ): HabitResponse> @POST("tasks/challenge/{challengeId}") suspend fun createChallengeTask( @Path("challengeId") challengeId: String, - @Body task: Task, + @Body task: Task ): HabitResponse @PUT("challenges/{challengeId}") suspend fun updateChallenge( @Path("challengeId") challengeId: String, - @Body challenge: Challenge, + @Body challenge: Challenge ): HabitResponse @DELETE("challenges/{challengeId}") suspend fun deleteChallenge( - @Path("challengeId") challengeId: String, + @Path("challengeId") challengeId: String ): HabitResponse // DEBUG: These calls only work on a local development server @@ -603,17 +603,17 @@ interface ApiService { // Notifications @POST("notifications/{notificationId}/read") suspend fun readNotification( - @Path("notificationId") notificationId: String, + @Path("notificationId") notificationId: String ): HabitResponse> @POST("notifications/read") suspend fun readNotifications( - @Body notificationIds: Map>, + @Body notificationIds: Map> ): HabitResponse> @POST("notifications/see") suspend fun seeNotifications( - @Body notificationIds: Map>, + @Body notificationIds: Map> ): HabitResponse> @POST("user/open-mystery-item") @@ -624,69 +624,69 @@ interface ApiService { @POST("user/reset") suspend fun resetAccount( - @Body body: Map, + @Body body: Map ): HabitResponse @HTTP(method = "DELETE", path = "user", hasBody = true) suspend fun deleteAccount( - @Body body: Map, + @Body body: Map ): HabitResponse @GET("user/toggle-pinned-item/{pinType}/{path}") suspend fun togglePinnedItem( @Path("pinType") pinType: String, - @Path("path") path: String, + @Path("path") path: String ): HabitResponse @POST("user/reset-password") suspend fun sendPasswordResetEmail( - @Body data: Map, + @Body data: Map ): HabitResponse @PUT("user/auth/update-username") suspend fun updateLoginName( - @Body data: Map, + @Body data: Map ): HabitResponse @POST("user/auth/verify-username") suspend fun verifyUsername( - @Body data: Map, + @Body data: Map ): HabitResponse @PUT("user/auth/update-email") suspend fun updateEmail( - @Body data: Map, + @Body data: Map ): HabitResponse @PUT("user/auth/update-password") suspend fun updatePassword( - @Body data: Map, + @Body data: Map ): HabitResponse @POST("user/allocate") suspend fun allocatePoint( - @Query("stat") stat: String, + @Query("stat") stat: String ): HabitResponse @POST("user/allocate-bulk") suspend fun bulkAllocatePoints( - @Body stats: Map>, + @Body stats: Map> ): HabitResponse @POST("members/transfer-gems") suspend fun transferGems( - @Body data: Map, + @Body data: Map ): HabitResponse @POST("tasks/unlink-all/{challengeID}") suspend fun unlinkAllTasks( @Path("challengeID") challengeID: String?, - @Query("keep") keepOption: String, + @Query("keep") keepOption: String ): HabitResponse @POST("user/block/{userID}") suspend fun blockMember( - @Path("userID") userID: String, + @Path("userID") userID: String ): HabitResponse> @POST("user/reroll") @@ -699,46 +699,46 @@ interface ApiService { @GET("tasks/group/{groupID}") suspend fun getTeamPlanTasks( - @Path("groupID") groupId: String, + @Path("groupID") groupId: String ): HabitResponse @POST("tasks/{taskID}/assign") suspend fun assignToTask( @Path("taskID") taskId: String?, - @Body ids: List, + @Body ids: List ): HabitResponse @POST("tasks/{taskID}/unassign/{userID}") suspend fun unassignFromTask( @Path("taskID") taskID: String, - @Path("userID") userID: String, + @Path("userID") userID: String ): HabitResponse @PUT("hall/heroes/{memberID}") suspend fun updateUser( @Path("memberID") memberID: String, - @Body updateData: Map>, + @Body updateData: Map> ): HabitResponse @GET("hall/heroes/{memberID}") suspend fun getHallMember( - @Path("memberID") memberID: String, + @Path("memberID") memberID: String ): HabitResponse @POST("tasks/{taskID}/needs-work/{userID}") suspend fun markTaskNeedsWork( @Path("taskID") taskID: String, - @Path("userID") userID: String, + @Path("userID") userID: String ): HabitResponse @GET("looking-for-party") suspend fun retrievePartySeekingUsers( - @Query("page") page: Int, + @Query("page") page: Int ): HabitResponse> @POST("challenges/{challengeId}/flag") suspend fun reportChallenge( @Path("challengeId") challengeid: String, - @Body updateData: Map, + @Body updateData: Map ): HabitResponse } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt index 202113eee..52773b2d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt @@ -51,7 +51,7 @@ interface ApiClient { suspend fun getUserChallenges( page: Int, - memberOnly: Boolean, + memberOnly: Boolean ): List? suspend fun getWorldState(): WorldState? @@ -68,23 +68,23 @@ interface ApiClient { suspend fun equipItem( type: String, - itemKey: String, + itemKey: String ): Items? suspend fun buyItem( itemKey: String, - purchaseQuantity: Int, + purchaseQuantity: Int ): BuyResponse? suspend fun purchaseItem( type: String, itemKey: String, - purchaseQuantity: Int, + purchaseQuantity: Int ): Void? suspend fun purchaseHourglassItem( type: String, - itemKey: String, + itemKey: String ): Void? suspend fun purchaseMysterySet(itemKey: String): Void? @@ -101,24 +101,24 @@ interface ApiClient { suspend fun sellItem( itemType: String, - itemKey: String, + itemKey: String ): User? suspend fun feedPet( petKey: String, - foodKey: String, + foodKey: String ): FeedResponse? suspend fun hatchPet( eggKey: String, - hatchingPotionKey: String, + hatchingPotionKey: String ): Items? suspend fun getTasks(type: String): TaskList? suspend fun getTasks( type: String, - dueDate: String, + dueDate: String ): TaskList? suspend fun unlockPath(path: String): UnlockResponse? @@ -127,33 +127,33 @@ interface ApiClient { suspend fun postTaskDirection( id: String, - direction: String, + direction: String ): TaskDirectionData? suspend fun bulkScoreTasks(data: List>): BulkTaskScoringData? suspend fun postTaskNewPosition( id: String, - position: Int, + position: Int ): List? suspend fun scoreChecklistItem( taskId: String, - itemId: String, + itemId: String ): Task? suspend fun createTask(item: Task): Task? suspend fun createGroupTask( groupId: String, - item: Task, + item: Task ): Task? suspend fun createTasks(tasks: List): List? suspend fun updateTask( id: String, - item: Task, + item: Task ): Task? suspend fun deleteTask(id: String): Void? @@ -162,7 +162,7 @@ interface ApiClient { suspend fun updateTag( id: String, - tag: Tag, + tag: Tag ): Tag? suspend fun deleteTag(id: String): Void? @@ -171,18 +171,18 @@ interface ApiClient { username: String, email: String, password: String, - confirmPassword: String, + confirmPassword: String ): UserAuthResponse? suspend fun connectUser( username: String, - password: String, + password: String ): UserAuthResponse? suspend fun connectSocial( network: String, userId: String, - accessToken: String, + accessToken: String ): UserAuthResponse? suspend fun disconnectSocial(network: String): Void? @@ -196,12 +196,12 @@ interface ApiClient { suspend fun useSkill( skillName: String, targetType: String, - targetId: String, + targetId: String ): SkillResponse? suspend fun useSkill( skillName: String, - targetType: String, + targetType: String ): SkillResponse? suspend fun changeClass(className: String?): User? @@ -220,12 +220,12 @@ interface ApiClient { suspend fun updateGroup( id: String, - item: Group, + item: Group ): Group? suspend fun removeMemberFromGroup( groupID: String, - userID: String, + userID: String ): Void? suspend fun listGroupChat(groupId: String): List? @@ -234,59 +234,59 @@ interface ApiClient { suspend fun leaveGroup( groupId: String, - keepChallenges: String, + keepChallenges: String ): Void? suspend fun postGroupChat( groupId: String, - message: Map, + message: Map ): PostChatMessageResult? suspend fun deleteMessage( groupId: String, - messageId: String, + messageId: String ): Void? suspend fun deleteInboxMessage(id: String): Void? suspend fun getGroupMembers( groupId: String, - includeAllPublicFields: Boolean?, + includeAllPublicFields: Boolean? ): List? suspend fun getGroupMembers( groupId: String, includeAllPublicFields: Boolean?, - lastId: String, + lastId: String ): List? // Like returns the full chat list suspend fun likeMessage( groupId: String, - mid: String, + mid: String ): ChatMessage? suspend fun flagMessage( groupId: String, mid: String, - data: MutableMap, + data: MutableMap ): Void? suspend fun flagInboxMessage( mid: String, - data: MutableMap, + data: MutableMap ): Void? suspend fun reportMember( mid: String, - data: Map, + data: Map ): Void? suspend fun seenMessages(groupId: String): Void? suspend fun inviteToGroup( groupId: String, - inviteData: Map, + inviteData: Map ): List? suspend fun rejectGroupInvite(groupId: String): Void? @@ -299,12 +299,12 @@ interface ApiClient { suspend fun forceStartQuest( groupId: String, - group: Group, + group: Group ): Quest? suspend fun inviteToQuest( groupId: String, - questKey: String, + questKey: String ): Quest? suspend fun abortQuest(groupId: String): Quest? @@ -339,19 +339,19 @@ interface ApiClient { suspend fun leaveChallenge( challengeId: String, - body: LeaveChallengeBody, + body: LeaveChallengeBody ): Void? suspend fun createChallenge(challenge: Challenge): Challenge? suspend fun createChallengeTasks( challengeId: String, - tasks: List, + tasks: List ): List? suspend fun createChallengeTask( challengeId: String, - task: Task, + task: Task ): Task? suspend fun updateChallenge(challenge: Challenge): Challenge? @@ -375,7 +375,7 @@ interface ApiClient { fun updateAuthenticationCredentials( userID: String?, - apiToken: String?, + apiToken: String? ) fun hasAuthenticationKeys(): Boolean @@ -384,7 +384,7 @@ interface ApiClient { suspend fun retrieveInboxMessages( uuid: String, - page: Int, + page: Int ): List? suspend fun retrieveInboxConversations(): List? @@ -401,27 +401,27 @@ interface ApiClient { suspend fun togglePinnedItem( pinType: String, - path: String, + path: String ): Void? suspend fun sendPasswordResetEmail(email: String): Void? suspend fun updateLoginName( newLoginName: String, - password: String, + password: String ): Void? suspend fun updateUsername(newLoginName: String): Void? suspend fun updateEmail( newEmail: String, - password: String, + password: String ): Void? suspend fun updatePassword( oldPassword: String, newPassword: String, - newPasswordConfirmation: String, + newPasswordConfirmation: String ): Void? suspend fun allocatePoint(stat: String): Stats? @@ -430,7 +430,7 @@ interface ApiClient { strength: Int, intelligence: Int, constitution: Int, - perception: Int, + perception: Int ): Stats? suspend fun retrieveMarketGear(): Shop? @@ -442,17 +442,17 @@ interface ApiClient { suspend fun findUsernames( username: String, context: String?, - id: String?, + id: String? ): List? suspend fun transferGems( giftedID: String, - amount: Int, + amount: Int ): Void? suspend fun unlinkAllTasks( challengeID: String?, - keepOption: String, + keepOption: String ): Void? suspend fun blockMember(userID: String): List? @@ -463,37 +463,37 @@ interface ApiClient { suspend fun assignToTask( taskId: String, - ids: List, + ids: List ): Task? suspend fun unassignFromTask( taskId: String, - userID: String, + userID: String ): Task? suspend fun updateMember( memberID: String, - updateData: Map>, + updateData: Map> ): Member? suspend fun getHallMember(userId: String): Member? suspend fun markTaskNeedsWork( taskID: String, - userID: String, + userID: String ): Task? suspend fun retrievePartySeekingUsers(page: Int): List? suspend fun getGroupInvites( groupId: String, - includeAllPublicFields: Boolean?, + includeAllPublicFields: Boolean? ): List? suspend fun syncUserStats(): User? suspend fun reportChallenge( challengeid: String, - updateData: Map, + updateData: Map ): Void? } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ChallengeRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ChallengeRepository.kt index 4d2b2e96b..9fcf886b0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ChallengeRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ChallengeRepository.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.flow.Flow interface ChallengeRepository : BaseRepository { suspend fun retrieveChallenges( page: Int = 0, - memberOnly: Boolean, + memberOnly: Boolean ): List? fun getChallenges(): Flow> @@ -24,7 +24,7 @@ interface ChallengeRepository : BaseRepository { suspend fun createChallenge( challenge: Challenge, - taskList: List, + taskList: List ): Challenge? /** @@ -41,7 +41,7 @@ interface ChallengeRepository : BaseRepository { fullTaskList: List, addedTaskList: List, updatedTaskList: List, - removedTaskList: List, + removedTaskList: List ): Challenge? suspend fun deleteChallenge(challengeId: String): Void? @@ -50,7 +50,7 @@ interface ChallengeRepository : BaseRepository { suspend fun leaveChallenge( challenge: Challenge, - keepTasks: String, + keepTasks: String ): Void? suspend fun joinChallenge(challenge: Challenge): Challenge? @@ -63,6 +63,6 @@ interface ChallengeRepository : BaseRepository { suspend fun reportChallenge( challengeid: String, - updateData: Map, + updateData: Map ): Void? } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.kt index 54c51f163..08eb63a2b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.kt @@ -7,6 +7,6 @@ interface CustomizationRepository : BaseRepository { fun getCustomizations( type: String, category: String?, - onlyAvailable: Boolean, + onlyAvailable: Boolean ): Flow> } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt index ed00457f6..5632cb80f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt @@ -50,12 +50,12 @@ interface InventoryRepository : BaseRepository { fun getEquipmentType( type: String, - set: String, + set: String ): Flow> fun getOwnedItems( itemType: String, - includeZero: Boolean = false, + includeZero: Boolean = false ): Flow> fun getOwnedItems(includeZero: Boolean = false): Flow> @@ -69,13 +69,13 @@ interface InventoryRepository : BaseRepository { fun getMounts( type: String?, group: String?, - color: String?, + color: String? ): Flow> fun getPets( type: String?, group: String?, - color: String?, + color: String? ): Flow> fun updateOwnedEquipment(user: User) @@ -83,35 +83,35 @@ interface InventoryRepository : BaseRepository { suspend fun changeOwnedCount( type: String, key: String, - amountToAdd: Int, + amountToAdd: Int ) suspend fun sellItem( type: String, - key: String, + key: String ): User? suspend fun sellItem(item: OwnedItem): User? suspend fun equipGear( equipment: String, - asCostume: Boolean, + asCostume: Boolean ): Items? suspend fun equip( type: String, - key: String, + key: String ): Items? suspend fun feedPet( pet: Pet, - food: Food, + food: Food ): FeedResponse? suspend fun hatchPet( egg: Egg, hatchingPotion: HatchingPotion, - successFunction: () -> Unit, + successFunction: () -> Unit ): Items? suspend fun inviteToQuest(quest: QuestContent): Quest? @@ -120,7 +120,7 @@ interface InventoryRepository : BaseRepository { user: User?, id: String, value: Double, - purchaseQuantity: Int, + purchaseQuantity: Int ): BuyResponse? suspend fun retrieveShopInventory(identifier: String): Shop? @@ -131,7 +131,7 @@ interface InventoryRepository : BaseRepository { suspend fun purchaseHourglassItem( purchaseType: String, - key: String, + key: String ): Void? suspend fun purchaseQuest(key: String): Void? @@ -141,14 +141,14 @@ interface InventoryRepository : BaseRepository { suspend fun purchaseItem( purchaseType: String, key: String, - purchaseQuantity: Int, + purchaseQuantity: Int ): Void? suspend fun togglePinnedItem(item: ShopItem): List? fun getItems( itemClass: Class, - keys: Array, + keys: Array ): Flow> fun getItems(itemClass: Class): Flow> @@ -158,7 +158,7 @@ interface InventoryRepository : BaseRepository { fun getItem( type: String, - key: String, + key: String ): Flow fun getAvailableLimitedItems(): Flow> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.kt index 439323c97..b8d9f0376 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.kt @@ -6,13 +6,13 @@ import com.habitrpg.android.habitica.models.user.User interface SetupCustomizationRepository { fun getCustomizations( type: String, - user: User, + user: User ): List fun getCustomizations( type: String, subtype: String?, - user: User, + user: User ): List companion object { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt index 65ee6063e..0506d5e5f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt @@ -26,12 +26,12 @@ interface SocialRepository : BaseRepository { suspend fun flagMessage( chatMessageID: String, additionalInfo: String, - groupID: String? = null, + groupID: String? = null ): Void? suspend fun reportMember( memberID: String, - data: Map, + data: Map ): Void? suspend fun likeMessage(chatMessage: ChatMessage): ChatMessage? @@ -40,12 +40,12 @@ interface SocialRepository : BaseRepository { suspend fun postGroupChat( groupId: String, - messageObject: HashMap, + messageObject: HashMap ): PostChatMessageResult? suspend fun postGroupChat( groupId: String, - message: String, + message: String ): PostChatMessageResult? suspend fun retrieveGroup(id: String): Group? @@ -54,7 +54,7 @@ interface SocialRepository : BaseRepository { suspend fun leaveGroup( id: String?, - keepChallenges: Boolean, + keepChallenges: Boolean ): Group? suspend fun joinGroup(id: String?): Group? @@ -65,7 +65,7 @@ interface SocialRepository : BaseRepository { leader: String?, type: String?, privacy: String?, - leaderCreateChallenge: Boolean?, + leaderCreateChallenge: Boolean? ): Group? suspend fun updateGroup( @@ -73,14 +73,14 @@ interface SocialRepository : BaseRepository { name: String?, description: String?, leader: String?, - leaderCreateChallenge: Boolean?, + leaderCreateChallenge: Boolean? ): Group? fun getInboxMessages(replyToUserID: String?): Flow> suspend fun retrieveInboxMessages( uuid: String, - page: Int, + page: Int ): List? suspend fun retrieveInboxConversations(): List? @@ -89,12 +89,12 @@ interface SocialRepository : BaseRepository { suspend fun postPrivateMessage( recipientId: String, - messageObject: HashMap, + messageObject: HashMap ): List? suspend fun postPrivateMessage( recipientId: String, - message: String, + message: String ): List? suspend fun getPartyMembers(id: String): Flow> @@ -103,50 +103,50 @@ interface SocialRepository : BaseRepository { suspend fun retrievePartyMembers( id: String, - includeAllPublicFields: Boolean, + includeAllPublicFields: Boolean ): List? suspend fun inviteToGroup( id: String, - inviteData: Map, + inviteData: Map ): List? suspend fun retrieveMember( userId: String?, - fromHall: Boolean = false, + fromHall: Boolean = false ): Member? suspend fun findUsernames( username: String, context: String? = null, - id: String? = null, + id: String? = null ): List? suspend fun markPrivateMessagesRead(user: User?) fun markSomePrivateMessagesAsRead( user: User?, - messages: List, + messages: List ) suspend fun transferGroupOwnership( groupID: String, - userID: String, + userID: String ): Group? suspend fun removeMemberFromGroup( groupID: String, - userID: String, + userID: String ): List? suspend fun acceptQuest( user: User?, - partyId: String = "party", + partyId: String = "party" ): Void? suspend fun rejectQuest( user: User?, - partyId: String = "party", + partyId: String = "party" ): Void? suspend fun leaveQuest(partyId: String): Void? @@ -163,7 +163,7 @@ interface SocialRepository : BaseRepository { suspend fun transferGems( giftedID: String, - amount: Int, + amount: Int ): Void? fun getGroupMembership(id: String): Flow @@ -176,13 +176,13 @@ interface SocialRepository : BaseRepository { suspend fun updateMember( memberID: String, - data: Map>, + data: Map> ): Member? suspend fun retrievePartySeekingUsers(page: Int = 0): List? suspend fun retrievegroupInvites( id: String, - includeAllPublicFields: Boolean, + includeAllPublicFields: Boolean ): List? } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt index de0e370bd..ddd1afc25 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt @@ -15,24 +15,24 @@ interface TaskRepository : BaseRepository { fun getTasks( taskType: TaskType, userID: String? = null, - includedGroupIDs: Array, + includedGroupIDs: Array ): Flow> fun saveTasks( userId: String, order: TasksOrder, - tasks: TaskList, + tasks: TaskList ) suspend fun retrieveTasks( userId: String, - tasksOrder: TasksOrder, + tasksOrder: TasksOrder ): TaskList? suspend fun retrieveTasks( userId: String, tasksOrder: TasksOrder, - dueDate: Date, + dueDate: Date ): TaskList? suspend fun taskChecked( @@ -40,7 +40,7 @@ interface TaskRepository : BaseRepository { task: Task, up: Boolean, force: Boolean, - notifyFunc: ((TaskScoringResult) -> Unit)?, + notifyFunc: ((TaskScoringResult) -> Unit)? ): TaskScoringResult? suspend fun taskChecked( @@ -48,12 +48,12 @@ interface TaskRepository : BaseRepository { taskId: String, up: Boolean, force: Boolean, - notifyFunc: ((TaskScoringResult) -> Unit)?, + notifyFunc: ((TaskScoringResult) -> Unit)? ): TaskScoringResult? suspend fun scoreChecklistItem( taskId: String, - itemId: String, + itemId: String ): Task? fun getTask(taskId: String): Flow @@ -62,12 +62,12 @@ interface TaskRepository : BaseRepository { suspend fun createTask( task: Task, - force: Boolean = false, + force: Boolean = false ): Task? suspend fun updateTask( task: Task, - force: Boolean = false, + force: Boolean = false ): Task? suspend fun deleteTask(taskId: String): Void? @@ -78,35 +78,35 @@ interface TaskRepository : BaseRepository { fun markTaskCompleted( taskId: String, - isCompleted: Boolean, + isCompleted: Boolean ) fun modify( obj: T, - transaction: (T) -> Unit, + transaction: (T) -> Unit ) fun swapTaskPosition( firstPosition: Int, - secondPosition: Int, + secondPosition: Int ) suspend fun updateTaskPosition( taskType: TaskType, taskID: String, - newPosition: Int, + newPosition: Int ): List? fun getUnmanagedTask(taskid: String): Flow fun updateTaskInBackground( task: Task, - assignChanges: Map>, + assignChanges: Map> ) fun createTaskInBackground( task: Task, - assignChanges: Map>, + assignChanges: Map> ) fun getTaskCopies(): Flow> @@ -121,7 +121,7 @@ interface TaskRepository : BaseRepository { suspend fun unlinkAllTasks( challengeID: String?, - keepOption: String, + keepOption: String ): Void? fun getTasksForChallenge(challengeID: String?): Flow> @@ -130,6 +130,6 @@ interface TaskRepository : BaseRepository { suspend fun markTaskNeedsWork( task: Task, - userID: String, + userID: String ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt index 657a1b073..b88abcc4f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt @@ -27,13 +27,13 @@ interface UserRepository : BaseRepository { suspend fun updateUser( key: String, - value: Any?, + value: Any? ): User? suspend fun retrieveUser( withTasks: Boolean = false, forced: Boolean = false, - overrideExisting: Boolean = false, + overrideExisting: Boolean = false ): User? suspend fun revive(): Equipment? @@ -49,12 +49,12 @@ interface UserRepository : BaseRepository { suspend fun useSkill( key: String, target: String?, - taskId: String, + taskId: String ): SkillResponse? suspend fun useSkill( key: String, - target: String?, + target: String? ): SkillResponse? suspend fun disableClasses(): User? @@ -63,7 +63,7 @@ interface UserRepository : BaseRepository { suspend fun unlockPath( path: String, - price: Int, + price: Int ): UnlockResponse? suspend fun unlockPath(customization: Customization): UnlockResponse? @@ -94,18 +94,18 @@ interface UserRepository : BaseRepository { suspend fun updateLoginName( newLoginName: String, - password: String? = null, + password: String? = null ): User? suspend fun updateEmail( newEmail: String, - password: String, + password: String ): Void? suspend fun updatePassword( oldPassword: String, newPassword: String, - newPasswordConfirmation: String, + newPasswordConfirmation: String ): Void? suspend fun verifyUsername(username: String): VerifyUsernameResponse? @@ -116,13 +116,13 @@ interface UserRepository : BaseRepository { strength: Int, intelligence: Int, constitution: Int, - perception: Int, + perception: Int ): Stats? suspend fun useCustomization( type: String, category: String?, - identifier: String, + identifier: String ): User? suspend fun retrieveAchievements(): List? diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index ed76a7f7f..72991437d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -73,7 +73,7 @@ class ApiClientImpl( private val converter: Converter.Factory, override val hostConfig: HostConfig, private val notificationsManager: NotificationsManager, - private val context: Context, + private val context: Context ) : ApiClient { private lateinit var retrofitAdapter: Retrofit @@ -115,7 +115,7 @@ class ApiClientImpl( val timezoneOffset = -TimeUnit.MINUTES.convert( timeZone.getOffset(calendar.timeInMillis).toLong(), - TimeUnit.MILLISECONDS, + TimeUnit.MILLISECONDS ) val cacheSize: Long = 10 * 1024 * 1024 // 10 MB @@ -199,7 +199,7 @@ class ApiClientImpl( username: String, email: String, password: String, - confirmPassword: String, + confirmPassword: String ): UserAuthResponse? { val auth = UserAuth() auth.username = username @@ -211,7 +211,7 @@ class ApiClientImpl( override suspend fun connectUser( username: String, - password: String, + password: String ): UserAuthResponse? { val auth = UserAuth() auth.username = username @@ -222,7 +222,7 @@ class ApiClientImpl( override suspend fun connectSocial( network: String, userId: String, - accessToken: String, + accessToken: String ): UserAuthResponse? { val auth = UserAuthSocial() auth.network = network @@ -257,7 +257,7 @@ class ApiClientImpl( } else if (throwableClass == SocketTimeoutException::class.java || UnknownHostException::class.java == throwableClass || IOException::class.java == throwableClass) { this.showConnectionProblemDialog( R.string.network_error_no_network_body, - isUserInputCall, + isUserInputCall ) } else if (HttpException::class.java.isAssignableFrom(throwable.javaClass)) { val error = throwable as HttpException @@ -286,7 +286,7 @@ class ApiClientImpl( showConnectionProblemDialog( R.string.authentication_error_title, R.string.authentication_error_body, - isUserInputCall, + isUserInputCall ) } } else if (status in 500..599) { @@ -303,7 +303,7 @@ class ApiClientImpl( override suspend fun updateMember( memberID: String, - updateData: Map>, + updateData: Map> ): Member? { return process { apiService.updateUser(memberID, updateData) } } @@ -333,7 +333,7 @@ class ApiClientImpl( override suspend fun retrieveInboxMessages( uuid: String, - page: Int, + page: Int ): List? { return process { apiService.getInboxMessages(uuid, page) } } @@ -348,7 +348,7 @@ class ApiClientImpl( private fun showConnectionProblemDialog( resourceMessageString: Int, - isFromUserInput: Boolean, + isFromUserInput: Boolean ) { showConnectionProblemDialog(null, context.getString(resourceMessageString), isFromUserInput) } @@ -356,12 +356,12 @@ class ApiClientImpl( private fun showConnectionProblemDialog( resourceTitleString: Int, resourceMessageString: Int, - isFromUserInput: Boolean, + isFromUserInput: Boolean ) { showConnectionProblemDialog( context.getString(resourceTitleString), context.getString(resourceMessageString), - isFromUserInput, + isFromUserInput ) } @@ -370,7 +370,7 @@ class ApiClientImpl( private fun showConnectionProblemDialog( resourceTitleString: String?, resourceMessageString: String, - isFromUserInput: Boolean, + isFromUserInput: Boolean ) { erroredRequestCount += 1 val application = @@ -381,7 +381,7 @@ class ApiClientImpl( erroredRequestCount, resourceTitleString, resourceMessageString, - isFromUserInput, + isFromUserInput ) } @@ -402,7 +402,7 @@ class ApiClientImpl( override fun updateAuthenticationCredentials( userID: String?, - apiToken: String?, + apiToken: String? ) { this.hostConfig.userID = userID ?: "" this.hostConfig.apiKey = apiToken ?: "" @@ -415,7 +415,7 @@ class ApiClientImpl( override suspend fun reportChallenge( challengeid: String, - updateData: Map, + updateData: Map ): Void? { return process { apiService.reportChallenge(challengeid, updateData) } } @@ -438,21 +438,21 @@ class ApiClientImpl( override suspend fun equipItem( type: String, - itemKey: String, + itemKey: String ): Items? { return process { apiService.equipItem(type, itemKey) } } override suspend fun buyItem( itemKey: String, - purchaseQuantity: Int, + purchaseQuantity: Int ): BuyResponse? { return process { apiService.buyItem(itemKey, mapOf(Pair("quantity", purchaseQuantity))) } } override suspend fun unlinkAllTasks( challengeID: String?, - keepOption: String, + keepOption: String ): Void? { return process { apiService.unlinkAllTasks(challengeID, keepOption) } } @@ -464,13 +464,13 @@ class ApiClientImpl( override suspend fun purchaseItem( type: String, itemKey: String, - purchaseQuantity: Int, + purchaseQuantity: Int ): Void? { return process { apiService.purchaseItem( type, itemKey, - mapOf(Pair("quantity", purchaseQuantity)), + mapOf(Pair("quantity", purchaseQuantity)) ) } } @@ -499,7 +499,7 @@ class ApiClientImpl( override suspend fun purchaseHourglassItem( type: String, - itemKey: String, + itemKey: String ): Void? { return process { apiService.purchaseHourglassItem(type, itemKey) } } @@ -518,14 +518,14 @@ class ApiClientImpl( override suspend fun sellItem( itemType: String, - itemKey: String, + itemKey: String ): User? { return process { apiService.sellItem(itemType, itemKey) } } override suspend fun feedPet( petKey: String, - foodKey: String, + foodKey: String ): FeedResponse? { val response = apiService.feedPet(petKey, foodKey) response.data?.message = response.message @@ -534,7 +534,7 @@ class ApiClientImpl( override suspend fun hatchPet( eggKey: String, - hatchingPotionKey: String, + hatchingPotionKey: String ): Items? { return process { apiService.hatchPet(eggKey, hatchingPotionKey) } } @@ -547,7 +547,7 @@ class ApiClientImpl( override suspend fun getTasks( type: String, - dueDate: String, + dueDate: String ): TaskList? { return process { apiService.getTasks(type, dueDate) } } @@ -566,7 +566,7 @@ class ApiClientImpl( override suspend fun postTaskDirection( id: String, - direction: String, + direction: String ): TaskDirectionData? { return process { apiService.postTaskDirection(id, direction) } } @@ -577,14 +577,14 @@ class ApiClientImpl( override suspend fun postTaskNewPosition( id: String, - position: Int, + position: Int ): List? { return process { apiService.postTaskNewPosition(id, position) } } override suspend fun scoreChecklistItem( taskId: String, - itemId: String, + itemId: String ): Task? { return process { apiService.scoreChecklistItem(taskId, itemId) } } @@ -595,7 +595,7 @@ class ApiClientImpl( override suspend fun createGroupTask( groupId: String, - item: Task, + item: Task ): Task? { return process { apiService.createGroupTask(groupId, item) } } @@ -606,7 +606,7 @@ class ApiClientImpl( override suspend fun updateTask( id: String, - item: Task, + item: Task ): Task? { return process { apiService.updateTask(id, item) } } @@ -621,7 +621,7 @@ class ApiClientImpl( override suspend fun updateTag( id: String, - tag: Tag, + tag: Tag ): Tag? { return process { apiService.updateTag(id, tag) } } @@ -637,14 +637,14 @@ class ApiClientImpl( override suspend fun useSkill( skillName: String, targetType: String, - targetId: String, + targetId: String ): SkillResponse? { return process { apiService.useSkill(skillName, targetType, targetId) } } override suspend fun useSkill( skillName: String, - targetType: String, + targetType: String ): SkillResponse? { return process { apiService.useSkill(skillName, targetType) } } @@ -679,14 +679,14 @@ class ApiClientImpl( override suspend fun updateGroup( id: String, - item: Group, + item: Group ): Group? { return processResponse(apiService.updateGroup(id, item)) } override suspend fun removeMemberFromGroup( groupID: String, - userID: String, + userID: String ): Void? { return processResponse(apiService.removeMemberFromGroup(groupID, userID)) } @@ -701,21 +701,21 @@ class ApiClientImpl( override suspend fun leaveGroup( groupId: String, - keepChallenges: String, + keepChallenges: String ): Void? { return processResponse(apiService.leaveGroup(groupId, keepChallenges)) } override suspend fun postGroupChat( groupId: String, - message: Map, + message: Map ): PostChatMessageResult? { return process { apiService.postGroupChat(groupId, message) } } override suspend fun deleteMessage( groupId: String, - messageId: String, + messageId: String ): Void? { return process { apiService.deleteMessage(groupId, messageId) } } @@ -726,7 +726,7 @@ class ApiClientImpl( override suspend fun getGroupMembers( groupId: String, - includeAllPublicFields: Boolean?, + includeAllPublicFields: Boolean? ): List? { return processResponse(apiService.getGroupMembers(groupId, includeAllPublicFields)) } @@ -734,21 +734,21 @@ class ApiClientImpl( override suspend fun getGroupMembers( groupId: String, includeAllPublicFields: Boolean?, - lastId: String, + lastId: String ): List? { return processResponse(apiService.getGroupMembers(groupId, includeAllPublicFields, lastId)) } override suspend fun likeMessage( groupId: String, - mid: String, + mid: String ): ChatMessage? { return process { apiService.likeMessage(groupId, mid) } } override suspend fun reportMember( mid: String, - data: Map, + data: Map ): Void? { return process { apiService.reportMember(mid, data) } } @@ -756,14 +756,14 @@ class ApiClientImpl( override suspend fun flagMessage( groupId: String, mid: String, - data: MutableMap, + data: MutableMap ): Void? { return process { apiService.flagMessage(groupId, mid, data) } } override suspend fun flagInboxMessage( mid: String, - data: MutableMap, + data: MutableMap ): Void? { return process { apiService.flagInboxMessage(mid, data) } } @@ -774,7 +774,7 @@ class ApiClientImpl( override suspend fun inviteToGroup( groupId: String, - inviteData: Map, + inviteData: Map ): List? { return process { apiService.inviteToGroup(groupId, inviteData) } } @@ -785,7 +785,7 @@ class ApiClientImpl( override suspend fun getGroupInvites( groupId: String, - includeAllPublicFields: Boolean?, + includeAllPublicFields: Boolean? ): List? { return process { apiService.getGroupInvites(groupId, includeAllPublicFields) } } @@ -804,14 +804,14 @@ class ApiClientImpl( override suspend fun forceStartQuest( groupId: String, - group: Group, + group: Group ): Quest? { return process { apiService.forceStartQuest(groupId, group) } } override suspend fun inviteToQuest( groupId: String, - questKey: String, + questKey: String ): Quest? { return process { apiService.inviteToQuest(groupId, questKey) } } @@ -841,7 +841,7 @@ class ApiClientImpl( override suspend fun markTaskNeedsWork( taskID: String, - userID: String, + userID: String ): Task? { return process { apiService.markTaskNeedsWork(taskID, userID) } } @@ -863,7 +863,7 @@ class ApiClientImpl( override suspend fun findUsernames( username: String, context: String?, - id: String?, + id: String? ): List? { return process { apiService.findUsernames(username, context, id) } } @@ -886,7 +886,7 @@ class ApiClientImpl( override suspend fun getUserChallenges( page: Int, - memberOnly: Boolean, + memberOnly: Boolean ): List? { return if (memberOnly) { process { apiService.getUserChallenges(page, memberOnly) } @@ -909,7 +909,7 @@ class ApiClientImpl( override suspend fun leaveChallenge( challengeId: String, - body: LeaveChallengeBody, + body: LeaveChallengeBody ): Void? { return process { apiService.leaveChallenge(challengeId, body) } } @@ -920,14 +920,14 @@ class ApiClientImpl( override suspend fun createChallengeTasks( challengeId: String, - tasks: List, + tasks: List ): List? { return process { apiService.createChallengeTasks(challengeId, tasks) } } override suspend fun createChallengeTask( challengeId: String, - task: Task, + task: Task ): Task? { return process { apiService.createChallengeTask(challengeId, task) } } @@ -984,7 +984,7 @@ class ApiClientImpl( override suspend fun togglePinnedItem( pinType: String, - path: String, + path: String ): Void? { return process { apiService.togglePinnedItem(pinType, path) } } @@ -997,7 +997,7 @@ class ApiClientImpl( override suspend fun updateLoginName( newLoginName: String, - password: String, + password: String ): Void? { val updateObject = HashMap() updateObject["username"] = newLoginName @@ -1019,7 +1019,7 @@ class ApiClientImpl( override suspend fun updateEmail( newEmail: String, - password: String, + password: String ): Void? { val updateObject = HashMap() updateObject["newEmail"] = newEmail @@ -1032,7 +1032,7 @@ class ApiClientImpl( override suspend fun updatePassword( oldPassword: String, newPassword: String, - newPasswordConfirmation: String, + newPasswordConfirmation: String ): Void? { val updateObject = HashMap() updateObject["password"] = oldPassword @@ -1047,14 +1047,14 @@ class ApiClientImpl( override suspend fun transferGems( giftedID: String, - amount: Int, + amount: Int ): Void? { return process { apiService.transferGems( mapOf( Pair("toUserId", giftedID), - Pair("gemAmount", amount), - ), + Pair("gemAmount", amount) + ) ) } } @@ -1069,14 +1069,14 @@ class ApiClientImpl( override suspend fun assignToTask( taskId: String, - ids: List, + ids: List ): Task? { return process { apiService.assignToTask(taskId, ids) } } override suspend fun unassignFromTask( taskId: String, - userID: String, + userID: String ): Task? { return process { apiService.unassignFromTask(taskId, userID) } } @@ -1085,7 +1085,7 @@ class ApiClientImpl( strength: Int, intelligence: Int, constitution: Int, - perception: Int, + perception: Int ): Stats? { val body = HashMap>() val stats = HashMap() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/BaseRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/BaseRepositoryImpl.kt index ccbaba2d7..7c2d8bc42 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/BaseRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/BaseRepositoryImpl.kt @@ -9,7 +9,7 @@ import com.habitrpg.android.habitica.modules.AuthenticationHandler abstract class BaseRepositoryImpl( protected val localRepository: T, protected val apiClient: ApiClient, - protected val authenticationHandler: AuthenticationHandler, + protected val authenticationHandler: AuthenticationHandler ) : BaseRepository { val currentUserID: String get() = authenticationHandler.currentUserID ?: "" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ChallengeRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ChallengeRepositoryImpl.kt index 905c216e9..158233fa3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ChallengeRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ChallengeRepositoryImpl.kt @@ -16,7 +16,7 @@ import kotlinx.coroutines.flow.Flow class ChallengeRepositoryImpl( localRepository: ChallengeLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ) : BaseRepositoryImpl(localRepository, apiClient, authenticationHandler), ChallengeRepository { override fun isChallengeMember(challengeID: String): Flow { @@ -25,7 +25,7 @@ class ChallengeRepositoryImpl( override suspend fun reportChallenge( challengeid: String, - updateData: Map, + updateData: Map ): Void? { return apiClient.reportChallenge(challengeid, updateData) } @@ -85,18 +85,20 @@ class ChallengeRepositoryImpl( private suspend fun addChallengeTasks( challenge: Challenge, - addedTaskList: List, + addedTaskList: List ) { val savedTasks: List? = when { addedTaskList.count() == 1 -> - listOf(apiClient.createChallengeTask( - challenge.id ?: "", - addedTaskList[0], - )).filterNotNull() + listOf( + apiClient.createChallengeTask( + challenge.id ?: "", + addedTaskList[0] + ) + ).filterNotNull() else -> apiClient.createChallengeTasks( challenge.id ?: "", - addedTaskList, + addedTaskList ) } if (savedTasks != null) { @@ -109,7 +111,7 @@ class ChallengeRepositoryImpl( override suspend fun createChallenge( challenge: Challenge, - taskList: List, + taskList: List ): Challenge? { challenge.tasksOrder = getTaskOrders(taskList) @@ -125,7 +127,7 @@ class ChallengeRepositoryImpl( fullTaskList: List, addedTaskList: List, updatedTaskList: List, - removedTaskList: List, + removedTaskList: List ): Challenge? { val savedTasks = updatedTaskList .map { localRepository.getUnmanagedCopy(it) }.mapNotNull { task -> @@ -166,7 +168,7 @@ class ChallengeRepositoryImpl( override suspend fun retrieveChallenges( page: Int, - memberOnly: Boolean, + memberOnly: Boolean ): List? { val challenges = apiClient.getUserChallenges(page, memberOnly) if (challenges != null) { @@ -177,7 +179,7 @@ class ChallengeRepositoryImpl( override suspend fun leaveChallenge( challenge: Challenge, - keepTasks: String, + keepTasks: String ): Void? { apiClient.leaveChallenge(challenge.id ?: "", LeaveChallengeBody(keepTasks)) localRepository.setParticipating(currentUserID, challenge.id ?: "", false) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ContentRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ContentRepositoryImpl.kt index 4e6712f9d..3cd72c81a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ContentRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ContentRepositoryImpl.kt @@ -17,7 +17,7 @@ class ContentRepositoryImpl( localRepository: T, apiClient: ApiClient, context: Context, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ) : BaseRepositoryImpl(localRepository, apiClient, authenticationHandler), ContentRepository { private val mysteryItem = SpecialItem.makeMysteryItem(context) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/CustomizationRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/CustomizationRepositoryImpl.kt index 9d77d3b85..e06d9cd9a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/CustomizationRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/CustomizationRepositoryImpl.kt @@ -10,17 +10,17 @@ import kotlinx.coroutines.flow.Flow class CustomizationRepositoryImpl( localRepository: CustomizationLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ) : BaseRepositoryImpl( - localRepository, - apiClient, - authenticationHandler, - ), + localRepository, + apiClient, + authenticationHandler +), CustomizationRepository { override fun getCustomizations( type: String, category: String?, - onlyAvailable: Boolean, + onlyAvailable: Boolean ): Flow> { return localRepository.getCustomizations(type, category, onlyAvailable) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/FAQRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/FAQRepositoryImpl.kt index b33cf5bc2..8098dee28 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/FAQRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/FAQRepositoryImpl.kt @@ -10,7 +10,7 @@ import kotlinx.coroutines.flow.Flow class FAQRepositoryImpl( localRepository: FAQLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ) : BaseRepositoryImpl(localRepository, apiClient, authenticationHandler), FAQRepository { override fun getArticle(position: Int): Flow { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt index e5891b493..1b1e7a09d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt @@ -35,7 +35,7 @@ class InventoryRepositoryImpl( localRepository: InventoryLocalRepository, apiClient: ApiClient, authenticationHandler: AuthenticationHandler, - var appConfigManager: AppConfigManager, + var appConfigManager: AppConfigManager ) : BaseRepositoryImpl(localRepository, apiClient, authenticationHandler), InventoryRepository { override fun getQuestContent(keys: List) = localRepository.getQuestContent(keys) @@ -76,20 +76,20 @@ class InventoryRepositoryImpl( override fun getEquipmentType( type: String, - set: String, + set: String ): Flow> { return localRepository.getEquipmentType(type, set) } override fun getOwnedItems( itemType: String, - includeZero: Boolean, + includeZero: Boolean ): Flow> { return authenticationHandler.userIDFlow.flatMapLatest { localRepository.getOwnedItems( itemType, it, - includeZero, + includeZero ) } } @@ -98,14 +98,14 @@ class InventoryRepositoryImpl( return authenticationHandler.userIDFlow.flatMapLatest { localRepository.getOwnedItems( it, - includeZero, + includeZero ) } } override fun getItems( itemClass: Class, - keys: Array, + keys: Array ): Flow> { return localRepository.getItems(itemClass, keys) } @@ -140,7 +140,7 @@ class InventoryRepositoryImpl( override fun getMounts( type: String?, group: String?, - color: String?, + color: String? ): Flow> { return localRepository.getMounts(type, group, color) } @@ -156,7 +156,7 @@ class InventoryRepositoryImpl( override fun getPets( type: String?, group: String?, - color: String?, + color: String? ): Flow> { return localRepository.getPets(type, group, color) } @@ -172,14 +172,14 @@ class InventoryRepositoryImpl( override suspend fun changeOwnedCount( type: String, key: String, - amountToAdd: Int, + amountToAdd: Int ) { localRepository.changeOwnedCount(type, key, currentUserID, amountToAdd) } override suspend fun sellItem( type: String, - key: String, + key: String ): User? { val item = localRepository.getOwnedItem(currentUserID, type, key, true).firstOrNull() @@ -204,14 +204,14 @@ class InventoryRepositoryImpl( override fun getItem( type: String, - key: String, + key: String ): Flow { return localRepository.getItem(type, key) } private suspend fun sellItem( item: Item, - ownedItem: OwnedItem, + ownedItem: OwnedItem ): User? { localRepository.executeTransaction { val liveItem = localRepository.getLiveObject(ownedItem) @@ -223,14 +223,14 @@ class InventoryRepositoryImpl( override suspend fun equipGear( equipment: String, - asCostume: Boolean, + asCostume: Boolean ): Items? { return equip(if (asCostume) "costume" else "equipped", equipment) } override suspend fun equip( type: String, - key: String, + key: String ): Items? { val liveUser = localRepository.getLiveUser(currentUserID) @@ -277,7 +277,7 @@ class InventoryRepositoryImpl( override suspend fun feedPet( pet: Pet, - food: Food, + food: Food ): FeedResponse? { val feedResponse = apiClient.feedPet(pet.key, food.key) ?: return null localRepository.feedPet(food.key, pet.key, feedResponse.value ?: 0, currentUserID) @@ -287,7 +287,7 @@ class InventoryRepositoryImpl( override suspend fun hatchPet( egg: Egg, hatchingPotion: HatchingPotion, - successFunction: () -> Unit, + successFunction: () -> Unit ): Items? { if (appConfigManager.enableLocalChanges()) { localRepository.hatchPet(egg.key, hatchingPotion.key, currentUserID) @@ -311,7 +311,7 @@ class InventoryRepositoryImpl( user: User?, id: String, value: Double, - purchaseQuantity: Int, + purchaseQuantity: Int ): BuyResponse? { val buyResponse = apiClient.buyItem(id, purchaseQuantity) ?: return null val foundUser = user ?: localRepository.getLiveUser(currentUserID) ?: return buyResponse @@ -359,7 +359,7 @@ class InventoryRepositoryImpl( override suspend fun purchaseHourglassItem( purchaseType: String, - key: String, + key: String ): Void? { return apiClient.purchaseHourglassItem(purchaseType, key) } @@ -375,7 +375,7 @@ class InventoryRepositoryImpl( override suspend fun purchaseItem( purchaseType: String, key: String, - purchaseQuantity: Int, + purchaseQuantity: Int ): Void? { val response = apiClient.purchaseItem(purchaseType, key, purchaseQuantity) if (key == "gem") { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SetupCustomizationRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SetupCustomizationRepositoryImpl.kt index 552862489..3ff52f9c0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SetupCustomizationRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SetupCustomizationRepositoryImpl.kt @@ -9,204 +9,204 @@ import javax.inject.Inject @Suppress("StringLiteralDuplication") class SetupCustomizationRepositoryImpl - @Inject - constructor(private val context: Context) : SetupCustomizationRepository { - private val wheelchairs: List - get() = - listOf( - SetupCustomization.createWheelchair("none", 0), - SetupCustomization.createWheelchair("black", R.drawable.creator_chair_black), - SetupCustomization.createWheelchair("blue", R.drawable.creator_chair_blue), - SetupCustomization.createWheelchair("green", R.drawable.creator_chair_green), - SetupCustomization.createWheelchair("pink", R.drawable.creator_chair_pink), - SetupCustomization.createWheelchair("red", R.drawable.creator_chair_red), - SetupCustomization.createWheelchair("yellow", R.drawable.creator_chair_yellow), - ) - - private val glasses: List - get() = - listOf( - SetupCustomization.createGlasses("", R.drawable.creator_blank_face), - SetupCustomization.createGlasses( - "eyewear_special_blackTopFrame", - R.drawable.creator_eyewear_special_blacktopframe, - ), - SetupCustomization.createGlasses( - "eyewear_special_blueTopFrame", - R.drawable.creator_eyewear_special_bluetopframe, - ), - SetupCustomization.createGlasses( - "eyewear_special_greenTopFrame", - R.drawable.creator_eyewear_special_greentopframe, - ), - SetupCustomization.createGlasses( - "eyewear_special_pinkTopFrame", - R.drawable.creator_eyewear_special_pinktopframe, - ), - SetupCustomization.createGlasses( - "eyewear_special_redTopFrame", - R.drawable.creator_eyewear_special_redtopframe, - ), - SetupCustomization.createGlasses( - "eyewear_special_yellowTopFrame", - R.drawable.creator_eyewear_special_yellowtopframe, - ), - SetupCustomization.createGlasses( - "eyewear_special_whiteTopFrame", - R.drawable.creator_eyewear_special_whitetopframe, - ), - ) - - private val flowers: List - get() = - listOf( - SetupCustomization.createFlower("0", R.drawable.creator_blank_face), - SetupCustomization.createFlower("1", R.drawable.creator_hair_flower_1), - SetupCustomization.createFlower("2", R.drawable.creator_hair_flower_2), - SetupCustomization.createFlower("3", R.drawable.creator_hair_flower_3), - SetupCustomization.createFlower("4", R.drawable.creator_hair_flower_4), - SetupCustomization.createFlower("5", R.drawable.creator_hair_flower_5), - SetupCustomization.createFlower("6", R.drawable.creator_hair_flower_6), - ) - - private val hairColors: List - get() = - listOf( - SetupCustomization.createHairColor("white", R.color.hair_white), - SetupCustomization.createHairColor("brown", R.color.hair_brown), - SetupCustomization.createHairColor("blond", R.color.hair_blond), - SetupCustomization.createHairColor("red", R.color.hair_red), - SetupCustomization.createHairColor("black", R.color.hair_black), - ) - - private val sizes: List - get() = - listOf( - SetupCustomization.createSize( - "slim", - R.drawable.creator_slim_shirt_black, - context.getString(R.string.avatar_size_slim), - ), - SetupCustomization.createSize( - "broad", - R.drawable.creator_broad_shirt_black, - context.getString(R.string.avatar_size_broad), - ), - ) - - private val skins: List - get() = - listOf( - SetupCustomization.createSkin("ddc994", R.color.skin_ddc994), - SetupCustomization.createSkin("f5a76e", R.color.skin_f5a76e), - SetupCustomization.createSkin("ea8349", R.color.skin_ea8349), - SetupCustomization.createSkin("c06534", R.color.skin_c06534), - SetupCustomization.createSkin("98461a", R.color.skin_98461a), - SetupCustomization.createSkin("915533", R.color.skin_915533), - SetupCustomization.createSkin("c3e1dc", R.color.skin_c3e1dc), - SetupCustomization.createSkin("6bd049", R.color.skin_6bd049), - ) - - override fun getCustomizations( - type: String, - user: User, - ): List { - return getCustomizations(type, null, user) - } - - override fun getCustomizations( - type: String, - subtype: String?, - user: User, - ): List { - return when (type) { - SetupCustomizationRepository.CATEGORY_BODY -> { - when (subtype) { - SetupCustomizationRepository.SUBCATEGORY_SIZE -> sizes - SetupCustomizationRepository.SUBCATEGORY_SHIRT -> - getShirts( - user.preferences?.size ?: "slim", - ) - - else -> emptyList() - } - } - - SetupCustomizationRepository.CATEGORY_SKIN -> skins - SetupCustomizationRepository.CATEGORY_HAIR -> { - when (subtype) { - SetupCustomizationRepository.SUBCATEGORY_BANGS -> - getBangs( - user.preferences?.hair?.color ?: "", - ) - - SetupCustomizationRepository.SUBCATEGORY_PONYTAIL -> - getHairBases( - user.preferences?.hair?.color ?: "", - ) - - SetupCustomizationRepository.SUBCATEGORY_COLOR -> hairColors - else -> emptyList() - } - } - - SetupCustomizationRepository.CATEGORY_EXTRAS -> { - when (subtype) { - SetupCustomizationRepository.SUBCATEGORY_FLOWER -> flowers - SetupCustomizationRepository.SUBCATEGORY_GLASSES -> glasses - SetupCustomizationRepository.SUBCATEGORY_WHEELCHAIR -> wheelchairs - else -> emptyList() - } - } - - else -> emptyList() - } - } - - private fun getHairBases(color: String): List { - return listOf( - SetupCustomization.createHairPonytail("0", R.drawable.creator_blank_face), - SetupCustomization.createHairPonytail("1", getResId("creator_hair_base_1_$color")), - SetupCustomization.createHairPonytail("3", getResId("creator_hair_base_3_$color")), +@Inject +constructor(private val context: Context) : SetupCustomizationRepository { + private val wheelchairs: List + get() = + listOf( + SetupCustomization.createWheelchair("none", 0), + SetupCustomization.createWheelchair("black", R.drawable.creator_chair_black), + SetupCustomization.createWheelchair("blue", R.drawable.creator_chair_blue), + SetupCustomization.createWheelchair("green", R.drawable.creator_chair_green), + SetupCustomization.createWheelchair("pink", R.drawable.creator_chair_pink), + SetupCustomization.createWheelchair("red", R.drawable.creator_chair_red), + SetupCustomization.createWheelchair("yellow", R.drawable.creator_chair_yellow) ) - } - private fun getBangs(color: String): List { - return listOf( - SetupCustomization.createHairBangs("0", R.drawable.creator_blank_face), - SetupCustomization.createHairBangs("1", getResId("creator_hair_bangs_1_$color")), - SetupCustomization.createHairBangs("2", getResId("creator_hair_bangs_2_$color")), - SetupCustomization.createHairBangs("3", getResId("creator_hair_bangs_3_$color")), + private val glasses: List + get() = + listOf( + SetupCustomization.createGlasses("", R.drawable.creator_blank_face), + SetupCustomization.createGlasses( + "eyewear_special_blackTopFrame", + R.drawable.creator_eyewear_special_blacktopframe + ), + SetupCustomization.createGlasses( + "eyewear_special_blueTopFrame", + R.drawable.creator_eyewear_special_bluetopframe + ), + SetupCustomization.createGlasses( + "eyewear_special_greenTopFrame", + R.drawable.creator_eyewear_special_greentopframe + ), + SetupCustomization.createGlasses( + "eyewear_special_pinkTopFrame", + R.drawable.creator_eyewear_special_pinktopframe + ), + SetupCustomization.createGlasses( + "eyewear_special_redTopFrame", + R.drawable.creator_eyewear_special_redtopframe + ), + SetupCustomization.createGlasses( + "eyewear_special_yellowTopFrame", + R.drawable.creator_eyewear_special_yellowtopframe + ), + SetupCustomization.createGlasses( + "eyewear_special_whiteTopFrame", + R.drawable.creator_eyewear_special_whitetopframe + ) ) - } - private fun getShirts(size: String): List { - return if (size == "broad") { - listOf( - SetupCustomization.createShirt("black", R.drawable.creator_broad_shirt_black), - SetupCustomization.createShirt("blue", R.drawable.creator_broad_shirt_blue), - SetupCustomization.createShirt("green", R.drawable.creator_broad_shirt_green), - SetupCustomization.createShirt("pink", R.drawable.creator_broad_shirt_pink), - SetupCustomization.createShirt("white", R.drawable.creator_broad_shirt_white), - SetupCustomization.createShirt("yellow", R.drawable.creator_broad_shirt_yellow), - ) - } else { - listOf( - SetupCustomization.createShirt("black", R.drawable.creator_slim_shirt_black), - SetupCustomization.createShirt("blue", R.drawable.creator_slim_shirt_blue), - SetupCustomization.createShirt("green", R.drawable.creator_slim_shirt_green), - SetupCustomization.createShirt("pink", R.drawable.creator_slim_shirt_pink), - SetupCustomization.createShirt("white", R.drawable.creator_slim_shirt_white), - SetupCustomization.createShirt("yellow", R.drawable.creator_slim_shirt_yellow), - ) - } - } + private val flowers: List + get() = + listOf( + SetupCustomization.createFlower("0", R.drawable.creator_blank_face), + SetupCustomization.createFlower("1", R.drawable.creator_hair_flower_1), + SetupCustomization.createFlower("2", R.drawable.creator_hair_flower_2), + SetupCustomization.createFlower("3", R.drawable.creator_hair_flower_3), + SetupCustomization.createFlower("4", R.drawable.creator_hair_flower_4), + SetupCustomization.createFlower("5", R.drawable.creator_hair_flower_5), + SetupCustomization.createFlower("6", R.drawable.creator_hair_flower_6) + ) - private fun getResId(resName: String): Int { - return try { - context.resources.getIdentifier(resName, "drawable", context.packageName) - } catch (e: Exception) { - -1 + private val hairColors: List + get() = + listOf( + SetupCustomization.createHairColor("white", R.color.hair_white), + SetupCustomization.createHairColor("brown", R.color.hair_brown), + SetupCustomization.createHairColor("blond", R.color.hair_blond), + SetupCustomization.createHairColor("red", R.color.hair_red), + SetupCustomization.createHairColor("black", R.color.hair_black) + ) + + private val sizes: List + get() = + listOf( + SetupCustomization.createSize( + "slim", + R.drawable.creator_slim_shirt_black, + context.getString(R.string.avatar_size_slim) + ), + SetupCustomization.createSize( + "broad", + R.drawable.creator_broad_shirt_black, + context.getString(R.string.avatar_size_broad) + ) + ) + + private val skins: List + get() = + listOf( + SetupCustomization.createSkin("ddc994", R.color.skin_ddc994), + SetupCustomization.createSkin("f5a76e", R.color.skin_f5a76e), + SetupCustomization.createSkin("ea8349", R.color.skin_ea8349), + SetupCustomization.createSkin("c06534", R.color.skin_c06534), + SetupCustomization.createSkin("98461a", R.color.skin_98461a), + SetupCustomization.createSkin("915533", R.color.skin_915533), + SetupCustomization.createSkin("c3e1dc", R.color.skin_c3e1dc), + SetupCustomization.createSkin("6bd049", R.color.skin_6bd049) + ) + + override fun getCustomizations( + type: String, + user: User + ): List { + return getCustomizations(type, null, user) + } + + override fun getCustomizations( + type: String, + subtype: String?, + user: User + ): List { + return when (type) { + SetupCustomizationRepository.CATEGORY_BODY -> { + when (subtype) { + SetupCustomizationRepository.SUBCATEGORY_SIZE -> sizes + SetupCustomizationRepository.SUBCATEGORY_SHIRT -> + getShirts( + user.preferences?.size ?: "slim" + ) + + else -> emptyList() + } } + + SetupCustomizationRepository.CATEGORY_SKIN -> skins + SetupCustomizationRepository.CATEGORY_HAIR -> { + when (subtype) { + SetupCustomizationRepository.SUBCATEGORY_BANGS -> + getBangs( + user.preferences?.hair?.color ?: "" + ) + + SetupCustomizationRepository.SUBCATEGORY_PONYTAIL -> + getHairBases( + user.preferences?.hair?.color ?: "" + ) + + SetupCustomizationRepository.SUBCATEGORY_COLOR -> hairColors + else -> emptyList() + } + } + + SetupCustomizationRepository.CATEGORY_EXTRAS -> { + when (subtype) { + SetupCustomizationRepository.SUBCATEGORY_FLOWER -> flowers + SetupCustomizationRepository.SUBCATEGORY_GLASSES -> glasses + SetupCustomizationRepository.SUBCATEGORY_WHEELCHAIR -> wheelchairs + else -> emptyList() + } + } + + else -> emptyList() } } + + private fun getHairBases(color: String): List { + return listOf( + SetupCustomization.createHairPonytail("0", R.drawable.creator_blank_face), + SetupCustomization.createHairPonytail("1", getResId("creator_hair_base_1_$color")), + SetupCustomization.createHairPonytail("3", getResId("creator_hair_base_3_$color")) + ) + } + + private fun getBangs(color: String): List { + return listOf( + SetupCustomization.createHairBangs("0", R.drawable.creator_blank_face), + SetupCustomization.createHairBangs("1", getResId("creator_hair_bangs_1_$color")), + SetupCustomization.createHairBangs("2", getResId("creator_hair_bangs_2_$color")), + SetupCustomization.createHairBangs("3", getResId("creator_hair_bangs_3_$color")) + ) + } + + private fun getShirts(size: String): List { + return if (size == "broad") { + listOf( + SetupCustomization.createShirt("black", R.drawable.creator_broad_shirt_black), + SetupCustomization.createShirt("blue", R.drawable.creator_broad_shirt_blue), + SetupCustomization.createShirt("green", R.drawable.creator_broad_shirt_green), + SetupCustomization.createShirt("pink", R.drawable.creator_broad_shirt_pink), + SetupCustomization.createShirt("white", R.drawable.creator_broad_shirt_white), + SetupCustomization.createShirt("yellow", R.drawable.creator_broad_shirt_yellow) + ) + } else { + listOf( + SetupCustomization.createShirt("black", R.drawable.creator_slim_shirt_black), + SetupCustomization.createShirt("blue", R.drawable.creator_slim_shirt_blue), + SetupCustomization.createShirt("green", R.drawable.creator_slim_shirt_green), + SetupCustomization.createShirt("pink", R.drawable.creator_slim_shirt_pink), + SetupCustomization.createShirt("white", R.drawable.creator_slim_shirt_white), + SetupCustomization.createShirt("yellow", R.drawable.creator_slim_shirt_yellow) + ) + } + } + + private fun getResId(resName: String): Int { + return try { + context.resources.getIdentifier(resName, "drawable", context.packageName) + } catch (e: Exception) { + -1 + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt index 306d67bca..a2e3f359c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt @@ -28,12 +28,12 @@ import java.util.UUID class SocialRepositoryImpl( localRepository: SocialLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ) : BaseRepositoryImpl(localRepository, apiClient, authenticationHandler), SocialRepository { override suspend fun transferGroupOwnership( groupID: String, - userID: String, + userID: String ): Group? { val group = localRepository.getGroup(groupID).first()?.let { localRepository.getUnmanagedCopy(it) } @@ -43,7 +43,7 @@ class SocialRepositoryImpl( override suspend fun removeMemberFromGroup( groupID: String, - userID: String, + userID: String ): List? { apiClient.removeMemberFromGroup(groupID, userID) return retrievePartyMembers(groupID, true) @@ -59,7 +59,7 @@ class SocialRepositoryImpl( override suspend fun updateMember( memberID: String, - data: Map>, + data: Map> ): Member? { return apiClient.updateMember(memberID, data) } @@ -72,14 +72,14 @@ class SocialRepositoryImpl( authenticationHandler.userIDFlow.flatMapLatest { localRepository.getGroupMembership( it, - id, + id ) } override fun getGroupMemberships(): Flow> { return authenticationHandler.userIDFlow.flatMapLatest { localRepository.getGroupMemberships( - it, + it ) } } @@ -101,7 +101,7 @@ class SocialRepositoryImpl( override suspend fun flagMessage( chatMessageID: String, additionalInfo: String, - groupID: String?, + groupID: String? ): Void? { return when { chatMessageID.isBlank() -> return null @@ -120,7 +120,7 @@ class SocialRepositoryImpl( override suspend fun reportMember( memberID: String, - data: Map, + data: Map ): Void? { return apiClient.reportMember(memberID, data) } @@ -147,7 +147,7 @@ class SocialRepositoryImpl( override suspend fun postGroupChat( groupId: String, - messageObject: HashMap, + messageObject: HashMap ): PostChatMessageResult? { val result = apiClient.postGroupChat(groupId, messageObject) result?.message?.groupId = groupId @@ -156,7 +156,7 @@ class SocialRepositoryImpl( override suspend fun postGroupChat( groupId: String, - message: String, + message: String ): PostChatMessageResult? { val messageObject = HashMap() messageObject["message"] = message @@ -179,7 +179,7 @@ class SocialRepositoryImpl( override suspend fun leaveGroup( id: String?, - keepChallenges: Boolean, + keepChallenges: Boolean ): Group? { if (id?.isNotBlank() != true) { return null @@ -208,7 +208,7 @@ class SocialRepositoryImpl( leader: String?, type: String?, privacy: String?, - leaderCreateChallenge: Boolean?, + leaderCreateChallenge: Boolean? ): Group? { val group = Group() group.name = name @@ -226,7 +226,7 @@ class SocialRepositoryImpl( name: String?, description: String?, leader: String?, - leaderCreateChallenge: Boolean?, + leaderCreateChallenge: Boolean? ): Group? { if (group == null) { return null @@ -247,13 +247,13 @@ class SocialRepositoryImpl( authenticationHandler.userIDFlow.flatMapLatest { localRepository.getInboxMessages( it, - replyToUserID, + replyToUserID ) } override suspend fun retrieveInboxMessages( uuid: String, - page: Int, + page: Int ): List? { val messages = apiClient.retrieveInboxMessages(uuid, page) ?: return null messages.forEach { @@ -271,7 +271,7 @@ class SocialRepositoryImpl( override suspend fun postPrivateMessage( recipientId: String, - messageObject: HashMap, + messageObject: HashMap ): List? { apiClient.postPrivateMessage(messageObject) return retrieveInboxMessages(recipientId, 0) @@ -279,7 +279,7 @@ class SocialRepositoryImpl( override suspend fun postPrivateMessage( recipientId: String, - message: String, + message: String ): List? { val messageObject = HashMap() messageObject["message"] = message @@ -293,7 +293,7 @@ class SocialRepositoryImpl( override suspend fun retrievePartyMembers( id: String, - includeAllPublicFields: Boolean, + includeAllPublicFields: Boolean ): List? { val members = apiClient.getGroupMembers(id, includeAllPublicFields) members?.let { localRepository.savePartyMembers(id, it) } @@ -302,13 +302,13 @@ class SocialRepositoryImpl( override suspend fun inviteToGroup( id: String, - inviteData: Map, + inviteData: Map ) = apiClient.inviteToGroup(id, inviteData) override suspend fun retrieveMember( userId: String?, - fromHall: Boolean, + fromHall: Boolean ): Member? { return if (userId == null) { null @@ -328,14 +328,14 @@ class SocialRepositoryImpl( override suspend fun retrievegroupInvites( id: String, - includeAllPublicFields: Boolean, + includeAllPublicFields: Boolean ) = apiClient.getGroupInvites(id, includeAllPublicFields) override suspend fun findUsernames( username: String, context: String?, - id: String?, + id: String? ): List? { return apiClient.findUsernames(username, context, id) } @@ -351,7 +351,7 @@ class SocialRepositoryImpl( override fun markSomePrivateMessagesAsRead( user: User?, - messages: List, + messages: List ) { if (user?.isManaged == true) { val numOfUnseenMessages = messages.count { !it.isSeen } @@ -376,7 +376,7 @@ class SocialRepositoryImpl( override suspend fun acceptQuest( user: User?, - partyId: String, + partyId: String ): Void? { apiClient.acceptQuest(partyId) user?.let { @@ -387,7 +387,7 @@ class SocialRepositoryImpl( override suspend fun rejectQuest( user: User?, - partyId: String, + partyId: String ): Void? { apiClient.rejectQuest(partyId) user?.let { @@ -434,7 +434,7 @@ class SocialRepositoryImpl( override suspend fun transferGems( giftedID: String, - amount: Int, + amount: Int ): Void? { return apiClient.transferGems(giftedID, amount) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TagRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TagRepositoryImpl.kt index 57de8ab46..ff13403b6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TagRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TagRepositoryImpl.kt @@ -14,7 +14,7 @@ import kotlinx.coroutines.flow.flatMapLatest class TagRepositoryImpl( localRepository: TagLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ) : BaseRepositoryImpl(localRepository, apiClient, authenticationHandler), TagRepository { override fun getTags() = authenticationHandler.userIDFlow.flatMapLatest { getTags(it) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt index 36efd8e50..553056143 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt @@ -38,7 +38,7 @@ class TaskRepositoryImpl( localRepository: TaskLocalRepository, apiClient: ApiClient, authenticationHandler: AuthenticationHandler, - val appConfigManager: AppConfigManager, + val appConfigManager: AppConfigManager ) : BaseRepositoryImpl(localRepository, apiClient, authenticationHandler), TaskRepository { private var lastTaskAction: Long = 0 @@ -46,25 +46,25 @@ class TaskRepositoryImpl( override fun getTasks( taskType: TaskType, userID: String?, - includedGroupIDs: Array, + includedGroupIDs: Array ): Flow> = this.localRepository.getTasks( taskType, userID ?: authenticationHandler.currentUserID ?: "", - includedGroupIDs, + includedGroupIDs ) override fun saveTasks( userId: String, order: TasksOrder, - tasks: TaskList, + tasks: TaskList ) { localRepository.saveTasks(userId, order, tasks) } override suspend fun retrieveTasks( userId: String, - tasksOrder: TasksOrder, + tasksOrder: TasksOrder ): TaskList? { val tasks = apiClient.getTasks() ?: return null this.localRepository.saveTasks(userId, tasksOrder, tasks) @@ -76,7 +76,7 @@ class TaskRepositoryImpl( val tasks = taskList.tasks this.localRepository.saveCompletedTodos( userId ?: authenticationHandler.currentUserID ?: "", - tasks.values, + tasks.values ) return taskList } @@ -84,7 +84,7 @@ class TaskRepositoryImpl( override suspend fun retrieveTasks( userId: String, tasksOrder: TasksOrder, - dueDate: Date, + dueDate: Date ): TaskList? { val formatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.US) val taskList = this.apiClient.getTasks("dailys", formatter.format(dueDate)) ?: return null @@ -98,14 +98,14 @@ class TaskRepositoryImpl( task: Task, up: Boolean, force: Boolean, - notifyFunc: ((TaskScoringResult) -> Unit)?, + notifyFunc: ((TaskScoringResult) -> Unit)? ): TaskScoringResult? { val localData = if (user != null && appConfigManager.enableLocalTaskScoring()) { ScoreTaskLocallyInteractor.score( user, task, - if (up) TaskDirection.UP else TaskDirection.DOWN, + if (up) TaskDirection.UP else TaskDirection.DOWN ) } else { null @@ -127,7 +127,7 @@ class TaskRepositoryImpl( val res = this.apiClient.postTaskDirection( id, - (if (up) TaskDirection.UP else TaskDirection.DOWN).text, + (if (up) TaskDirection.UP else TaskDirection.DOWN).text ) ?: return null // There are cases where the user object is not set correctly. So the app refetches it as a fallback val thisUser = @@ -142,8 +142,8 @@ class TaskRepositoryImpl( mapOf( "type" to (task.type ?: ""), "scored_up" to up, - "value" to task.value, - ), + "value" to task.value + ) ) if (res.lvl == 0) { // Team tasks that require approval have weird data that we should just ignore. @@ -166,7 +166,7 @@ class TaskRepositoryImpl( res: TaskDirectionData, task: Task, up: Boolean, - localDelta: Float, + localDelta: Float ) { this.localRepository.executeTransaction { val bgTask = localRepository.getLiveObject(task) ?: return@executeTransaction @@ -235,13 +235,13 @@ class TaskRepositoryImpl( bgUser.party?.quest?.progress?.up = ( bgUser.party?.quest?.progress?.up ?: 0F - ) + (res._tmp?.quest?.progressDelta?.toFloat() ?: 0F) + ) + (res._tmp?.quest?.progressDelta?.toFloat() ?: 0F) } } override suspend fun markTaskNeedsWork( task: Task, - userID: String, + userID: String ) { val savedTask = apiClient.markTaskNeedsWork(task.id ?: "", userID) if (savedTask != null) { @@ -260,7 +260,7 @@ class TaskRepositoryImpl( taskId: String, up: Boolean, force: Boolean, - notifyFunc: ((TaskScoringResult) -> Unit)?, + notifyFunc: ((TaskScoringResult) -> Unit)? ): TaskScoringResult? { val task = localRepository.getTask(taskId).firstOrNull() ?: return null return taskChecked(user, task, up, force, notifyFunc) @@ -268,7 +268,7 @@ class TaskRepositoryImpl( override suspend fun scoreChecklistItem( taskId: String, - itemId: String, + itemId: String ): Task? { val task = apiClient.scoreChecklistItem(taskId, itemId) val updatedItem: ChecklistItem? = task?.checklist?.lastOrNull { itemId == it.id } @@ -284,7 +284,7 @@ class TaskRepositoryImpl( override suspend fun createTask( task: Task, - force: Boolean, + force: Boolean ): Task? { val now = Date().time if (lastTaskAction > now - 500 && !force) { @@ -327,7 +327,7 @@ class TaskRepositoryImpl( @Suppress("ReturnCount") override suspend fun updateTask( task: Task, - force: Boolean, + force: Boolean ): Task? { val now = Date().time if ((lastTaskAction > now - 500 && !force) || !task.isValid) { @@ -368,21 +368,21 @@ class TaskRepositoryImpl( override fun markTaskCompleted( taskId: String, - isCompleted: Boolean, + isCompleted: Boolean ) { localRepository.markTaskCompleted(taskId, isCompleted) } override fun modify( obj: T, - transaction: (T) -> Unit, + transaction: (T) -> Unit ) { localRepository.modify(obj, transaction) } override fun swapTaskPosition( firstPosition: Int, - secondPosition: Int, + secondPosition: Int ) { localRepository.swapTaskPosition(firstPosition, secondPosition) } @@ -390,7 +390,7 @@ class TaskRepositoryImpl( override suspend fun updateTaskPosition( taskType: TaskType, taskID: String, - newPosition: Int, + newPosition: Int ): List? { val positions = apiClient.postTaskNewPosition(taskID, newPosition) ?: return null localRepository.updateTaskPositions(positions) @@ -402,7 +402,7 @@ class TaskRepositoryImpl( override fun updateTaskInBackground( task: Task, - assignChanges: Map>, + assignChanges: Map> ) { MainScope().launchCatching { val updatedTask = updateTask(task) ?: return@launchCatching @@ -412,7 +412,7 @@ class TaskRepositoryImpl( override fun createTaskInBackground( task: Task, - assignChanges: Map>, + assignChanges: Map> ) { MainScope().launchCatching { val createdTask = createTask(task) ?: return@launchCatching @@ -422,7 +422,7 @@ class TaskRepositoryImpl( private suspend fun handleAssignmentChanges( task: Task, - assignChanges: Map>, + assignChanges: Map> ) { val taskID = task.id ?: return assignChanges["assign"]?.let { assignments -> @@ -474,7 +474,7 @@ class TaskRepositoryImpl( override suspend fun unlinkAllTasks( challengeID: String?, - keepOption: String, + keepOption: String ): Void? { return apiClient.unlinkAllTasks(challengeID, keepOption) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TutorialRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TutorialRepositoryImpl.kt index e91f9ddc9..997e0a24f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TutorialRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TutorialRepositoryImpl.kt @@ -10,7 +10,7 @@ import kotlinx.coroutines.flow.Flow class TutorialRepositoryImpl( localRepository: TutorialLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ) : BaseRepositoryImpl(localRepository, apiClient, authenticationHandler), TutorialRepository { override fun getTutorialStep(key: String): Flow = diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt index 1c47a1e88..9cf61a464 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt @@ -40,7 +40,7 @@ class UserRepositoryImpl( apiClient: ApiClient, authenticationHandler: AuthenticationHandler, private val taskRepository: TaskRepository, - private val appConfigManager: AppConfigManager, + private val appConfigManager: AppConfigManager ) : BaseRepositoryImpl(localRepository, apiClient, authenticationHandler), UserRepository { companion object { private var lastReadNotification: String? = null @@ -65,7 +65,7 @@ class UserRepositoryImpl( private suspend fun updateUser( userID: String, - updateData: Map, + updateData: Map ): User? { val networkUser = apiClient.updateUser(updateData) ?: return null val oldUser = localRepository.getUser(userID).firstOrNull() @@ -75,7 +75,7 @@ class UserRepositoryImpl( private suspend fun updateUser( userID: String, key: String, - value: Any?, + value: Any? ): User? { return updateUser(userID, mapOf(key to value)) } @@ -86,7 +86,7 @@ class UserRepositoryImpl( override suspend fun updateUser( key: String, - value: Any?, + value: Any? ): User? { return updateUser(currentUserID, key, value) } @@ -95,7 +95,7 @@ class UserRepositoryImpl( override suspend fun retrieveUser( withTasks: Boolean, forced: Boolean, - overrideExisting: Boolean, + overrideExisting: Boolean ): User? { // Only retrieve again after 3 minutes or it's forced. if (forced || lastSync == null || Date().time - (lastSync?.time ?: 0) > 180000) { @@ -164,7 +164,7 @@ class UserRepositoryImpl( override suspend fun useSkill( key: String, target: String?, - taskId: String, + taskId: String ): SkillResponse? { val response = apiClient.useSkill(key, target ?: "", taskId) ?: return null val user = getLiveUser() ?: return response @@ -178,7 +178,7 @@ class UserRepositoryImpl( override suspend fun useSkill( key: String, - target: String?, + target: String? ): SkillResponse? { val response = apiClient.useSkill(key, target ?: "") ?: return null val user = getLiveUser() ?: return response @@ -203,7 +203,7 @@ class UserRepositoryImpl( override suspend fun unlockPath( path: String, - price: Int, + price: Int ): UnlockResponse? { val unlockResponse = apiClient.unlockPath(path) ?: return null val user = localRepository.getUser(currentUserID).firstOrNull() ?: return unlockResponse @@ -284,7 +284,7 @@ class UserRepositoryImpl( override suspend fun updateLoginName( newLoginName: String, - password: String?, + password: String? ): User? { if (!password.isNullOrEmpty()) { apiClient.updateLoginName(newLoginName.trim(), password.trim()) @@ -303,13 +303,13 @@ class UserRepositoryImpl( override suspend fun updateEmail( newEmail: String, - password: String, + password: String ) = apiClient.updateEmail(newEmail.trim(), password) override suspend fun updatePassword( oldPassword: String, newPassword: String, - newPasswordConfirmation: String, + newPasswordConfirmation: String ) = apiClient.updatePassword(oldPassword.trim(), newPassword.trim(), newPasswordConfirmation.trim()) override suspend fun allocatePoint(stat: Attribute): Stats? { @@ -343,14 +343,14 @@ class UserRepositoryImpl( strength: Int, intelligence: Int, constitution: Int, - perception: Int, + perception: Int ): Stats? { val stats = apiClient.bulkAllocatePoints( strength, intelligence, constitution, - perception, + perception ) ?: return null val user = getLiveUser() if (user != null) { @@ -391,7 +391,7 @@ class UserRepositoryImpl( override suspend fun useCustomization( type: String, category: String?, - identifier: String, + identifier: String ): User? { if (appConfigManager.enableLocalChanges()) { val liveUser = getLiveUser() @@ -466,7 +466,7 @@ class UserRepositoryImpl( localRepository.save( members.map { GroupMembership(it.id, id) - }, + } ) members.let { localRepository.save(members) } return team @@ -494,7 +494,7 @@ class UserRepositoryImpl( private fun mergeUser( oldUser: User?, - newUser: User, + newUser: User ): User { if (oldUser == null || !oldUser.isValid) { return oldUser ?: newUser diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt index 950a35485..7145525af 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt @@ -15,7 +15,7 @@ interface BaseLocalRepository { fun modify( obj: T, - transaction: (T) -> Unit, + transaction: (T) -> Unit ) fun getLiveObject(obj: T): T? diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/ChallengeLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/ChallengeLocalRepository.kt index f721c49ef..587b91da6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/ChallengeLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/ChallengeLocalRepository.kt @@ -17,25 +17,25 @@ interface ChallengeLocalRepository : BaseLocalRepository { fun setParticipating( userID: String, challengeID: String, - isParticipating: Boolean, + isParticipating: Boolean ) fun saveChallenges( challenges: List, clearChallenges: Boolean, memberOnly: Boolean, - userID: String, + userID: String ) fun getChallengeMembership( userId: String, - id: String, + id: String ): Flow fun getChallengeMemberships(userId: String): Flow> fun isChallengeMember( userID: String, - challengeID: String, + challengeID: String ): Flow } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/CustomizationLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/CustomizationLocalRepository.kt index b8ce0c371..1698e4f7a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/CustomizationLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/CustomizationLocalRepository.kt @@ -7,6 +7,6 @@ interface CustomizationLocalRepository : ContentLocalRepository { fun getCustomizations( type: String, category: String?, - onlyAvailable: Boolean, + onlyAvailable: Boolean ): Flow> } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt index ee2868044..13db1e770 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt @@ -42,17 +42,17 @@ interface InventoryLocalRepository : ContentLocalRepository { fun getOwnedItems( itemType: String, userID: String, - includeZero: Boolean, + includeZero: Boolean ): Flow> fun getOwnedItems( userID: String, - includeZero: Boolean, + includeZero: Boolean ): Flow> fun getEquipmentType( type: String, - set: String, + set: String ): Flow> fun getEquipment(key: String): Flow @@ -60,13 +60,13 @@ interface InventoryLocalRepository : ContentLocalRepository { fun getMounts( type: String?, group: String?, - color: String?, + color: String? ): Flow> fun getPets( type: String?, group: String?, - color: String?, + color: String? ): Flow> fun updateOwnedEquipment(user: User) @@ -75,24 +75,24 @@ interface InventoryLocalRepository : ContentLocalRepository { type: String, key: String, userID: String, - amountToAdd: Int, + amountToAdd: Int ) fun changeOwnedCount( item: OwnedItem, - amountToAdd: Int?, + amountToAdd: Int? ) fun getItem( type: String, - key: String, + key: String ): Flow fun getOwnedItem( userID: String, type: String, key: String, - includeZero: Boolean, + includeZero: Boolean ): Flow fun decrementMysteryItemCount(user: User?) @@ -102,20 +102,20 @@ interface InventoryLocalRepository : ContentLocalRepository { fun hatchPet( eggKey: String, potionKey: String, - userID: String, + userID: String ) fun unhatchPet( eggKey: String, potionKey: String, - userID: String, + userID: String ) fun feedPet( foodKey: String, petKey: String, feedValue: Int, - userID: String, + userID: String ) fun getLatestMysteryItem(): Flow @@ -123,14 +123,14 @@ interface InventoryLocalRepository : ContentLocalRepository { fun soldItem( userID: String, - updatedUser: User, + updatedUser: User ): User fun getAvailableLimitedItems(): Flow> fun save( items: Items, - userID: String, + userID: String ) fun getLiveObject(obj: OwnedItem): OwnedItem? @@ -139,6 +139,6 @@ interface InventoryLocalRepository : ContentLocalRepository { fun getItems( itemClass: Class, - keys: Array, + keys: Array ): Flow> } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt index c49772f6f..2987ad622 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.flow.Flow interface SocialLocalRepository : BaseLocalRepository { fun getUserGroups( userID: String, - type: String?, + type: String? ): Flow> fun getGroup(id: String): Flow @@ -29,30 +29,30 @@ interface SocialLocalRepository : BaseLocalRepository { fun updateRSVPNeeded( user: User?, - newValue: Boolean, + newValue: Boolean ) fun likeMessage( chatMessage: ChatMessage, userId: String, - liked: Boolean, + liked: Boolean ) fun savePartyMembers( groupId: String?, - members: List, + members: List ) fun removeQuest(partyId: String) fun setQuestActivity( party: Group?, - active: Boolean, + active: Boolean ) fun saveChatMessages( groupId: String?, - chatMessages: List, + chatMessages: List ) fun doesGroupExist(id: String): Boolean @@ -60,43 +60,43 @@ interface SocialLocalRepository : BaseLocalRepository { fun updateMembership( userId: String, id: String, - isMember: Boolean, + isMember: Boolean ) fun getGroupMembership( userId: String, - id: String, + id: String ): Flow fun getGroupMemberships(userId: String): Flow> fun rejectGroupInvitation( userID: String, - groupID: String, + groupID: String ) fun getInboxMessages( userId: String, - replyToUserID: String?, + replyToUserID: String? ): Flow> fun getInboxConversation(userId: String): Flow> fun saveGroupMemberships( userID: String?, - memberships: List, + memberships: List ) fun saveInboxMessages( userID: String, recipientID: String, messages: List, - page: Int, + page: Int ) fun saveInboxConversations( userID: String, - conversations: List, + conversations: List ) fun getMember(userID: String?): Flow diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.kt index 76442f3ee..72851d7ad 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.kt @@ -11,7 +11,7 @@ interface TaskLocalRepository : BaseLocalRepository { fun getTasks( taskType: TaskType, userID: String, - includedGroupIDs: Array, + includedGroupIDs: Array ): Flow> fun getTasks(userId: String): Flow> @@ -19,7 +19,7 @@ interface TaskLocalRepository : BaseLocalRepository { fun saveTasks( ownerID: String, tasksOrder: TasksOrder, - tasks: TaskList, + tasks: TaskList ) fun deleteTask(taskID: String) @@ -30,17 +30,17 @@ interface TaskLocalRepository : BaseLocalRepository { fun markTaskCompleted( taskId: String, - isCompleted: Boolean, + isCompleted: Boolean ) fun swapTaskPosition( firstPosition: Int, - secondPosition: Int, + secondPosition: Int ) fun getTaskAtPosition( taskType: String, - position: Int, + position: Int ): Flow fun updateIsdue(daily: TaskList): TaskList @@ -49,7 +49,7 @@ interface TaskLocalRepository : BaseLocalRepository { fun saveCompletedTodos( userId: String, - tasks: MutableCollection, + tasks: MutableCollection ) fun getErroredTasks(userID: String): Flow> @@ -58,6 +58,6 @@ interface TaskLocalRepository : BaseLocalRepository { fun getTasksForChallenge( challengeID: String?, - userID: String?, + userID: String? ): Flow> } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt index b9ab833b9..b64e86c1d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt @@ -19,7 +19,7 @@ interface UserLocalRepository : BaseLocalRepository { fun saveUser( user: User, - overrideExisting: Boolean = true, + overrideExisting: Boolean = true ) fun saveMessages(messages: List) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt index 4ac3727de..fffac9d3c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt @@ -16,129 +16,129 @@ import java.util.concurrent.atomic.AtomicBoolean abstract class RealmBaseLocalRepository internal constructor(override var realm: Realm) : BaseLocalRepository { - override val isClosed: Boolean - get() = realm.isClosed + override val isClosed: Boolean + get() = realm.isClosed - override fun close() { - realm.close() - } + override fun close() { + realm.close() + } - override fun executeTransaction(transaction: (Realm) -> Unit) { - pendingSaves.add(transaction) - if (isSaving.compareAndSet(false, true)) { - process() - } - } - - override fun getUnmanagedCopy(managedObject: T): T { - return if (managedObject is RealmObject && managedObject.isManaged && managedObject.isValid) { - realm.copyFromRealm(managedObject) - } else { - managedObject - } - } - - override fun getUnmanagedCopy(list: List): List { - if (isClosed) { - return emptyList() - } - return realm.copyFromRealm(list) - } - - companion object { - private var isSaving = AtomicBoolean(false) - private var pendingSaves = mutableListOf() - } - - private fun copy( - realm: Realm, - obj: T, - ) { - try { - realm.insertOrUpdate(obj) - } catch (_: java.lang.IllegalArgumentException) { - } - } - - private fun process() { - if (isClosed) { - return - } - realm.executeTransaction { - while (pendingSaves.isNotEmpty()) { - val pending = pendingSaves.removeFirst() - @Suppress("UNCHECKED_CAST") - if (pending is RealmModel) { - copy(it, pending) - } else if (pending as? List != null) { - it.insertOrUpdate(pending) - } else if (pending is Function0<*>) { - pending.invoke() - } else if (pending as? Function1 != null) { - pending.invoke(it) - } - } - isSaving.set(false) - } - } - - override fun save(obj: T) { - pendingSaves.add(obj) - if (isSaving.compareAndSet(false, true)) { - process() - } - } - - override fun save(objects: List) { - pendingSaves.add(objects) - if (isSaving.compareAndSet(false, true)) { - process() - } - } - - override fun modify( - obj: T, - transaction: (T) -> Unit, - ) { - if (isClosed) { - return - } - val liveObject = getLiveObject(obj) ?: return - executeTransaction { - transaction(liveObject) - } - } - - override fun delete(obj: T) { - if (isClosed) { - return - } - val liveObject = getLiveObject(obj) ?: return - executeTransaction { - liveObject.deleteFromRealm() - } - } - - override fun getLiveUser(id: String): User? { - return realm.where(User::class.java).equalTo("id", id).findFirst() - } - - override fun getLiveObject(obj: T): T? { - if (isClosed) return null - if (obj !is RealmObject || !obj.isManaged) return obj - val baseObject = obj as? BaseMainObject ?: return null - @Suppress("UNCHECKED_CAST") - return realm.where(baseObject.realmClass) - .equalTo(baseObject.primaryIdentifierName, baseObject.primaryIdentifier) - .findFirst() as? T - } - - fun queryUser(userID: String): Flow { - return realm.where(User::class.java) - .equalTo("id", userID) - .findAll() - .toFlow() - .filter { it.isLoaded && it.isValid && !it.isEmpty() } - .map { it.firstOrNull() } + override fun executeTransaction(transaction: (Realm) -> Unit) { + pendingSaves.add(transaction) + if (isSaving.compareAndSet(false, true)) { + process() } } + + override fun getUnmanagedCopy(managedObject: T): T { + return if (managedObject is RealmObject && managedObject.isManaged && managedObject.isValid) { + realm.copyFromRealm(managedObject) + } else { + managedObject + } + } + + override fun getUnmanagedCopy(list: List): List { + if (isClosed) { + return emptyList() + } + return realm.copyFromRealm(list) + } + + companion object { + private var isSaving = AtomicBoolean(false) + private var pendingSaves = mutableListOf() + } + + private fun copy( + realm: Realm, + obj: T + ) { + try { + realm.insertOrUpdate(obj) + } catch (_: java.lang.IllegalArgumentException) { + } + } + + private fun process() { + if (isClosed) { + return + } + realm.executeTransaction { + while (pendingSaves.isNotEmpty()) { + val pending = pendingSaves.removeFirst() + @Suppress("UNCHECKED_CAST") + if (pending is RealmModel) { + copy(it, pending) + } else if (pending as? List != null) { + it.insertOrUpdate(pending) + } else if (pending is Function0<*>) { + pending.invoke() + } else if (pending as? Function1 != null) { + pending.invoke(it) + } + } + isSaving.set(false) + } + } + + override fun save(obj: T) { + pendingSaves.add(obj) + if (isSaving.compareAndSet(false, true)) { + process() + } + } + + override fun save(objects: List) { + pendingSaves.add(objects) + if (isSaving.compareAndSet(false, true)) { + process() + } + } + + override fun modify( + obj: T, + transaction: (T) -> Unit + ) { + if (isClosed) { + return + } + val liveObject = getLiveObject(obj) ?: return + executeTransaction { + transaction(liveObject) + } + } + + override fun delete(obj: T) { + if (isClosed) { + return + } + val liveObject = getLiveObject(obj) ?: return + executeTransaction { + liveObject.deleteFromRealm() + } + } + + override fun getLiveUser(id: String): User? { + return realm.where(User::class.java).equalTo("id", id).findFirst() + } + + override fun getLiveObject(obj: T): T? { + if (isClosed) return null + if (obj !is RealmObject || !obj.isManaged) return obj + val baseObject = obj as? BaseMainObject ?: return null + @Suppress("UNCHECKED_CAST") + return realm.where(baseObject.realmClass) + .equalTo(baseObject.primaryIdentifierName, baseObject.primaryIdentifier) + .findFirst() as? T + } + + fun queryUser(userID: String): Flow { + return realm.where(User::class.java) + .equalTo("id", userID) + .findAll() + .toFlow() + .filter { it.isLoaded && it.isValid && !it.isEmpty() } + .map { it.firstOrNull() } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmChallengeLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmChallengeLocalRepository.kt index 0e34c12b7..644172277 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmChallengeLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmChallengeLocalRepository.kt @@ -20,7 +20,7 @@ class RealmChallengeLocalRepository(realm: Realm) : ChallengeLocalRepository { override fun isChallengeMember( userID: String, - challengeID: String, + challengeID: String ): Flow = realm.where(ChallengeMembership::class.java) .equalTo("userID", userID) @@ -32,7 +32,7 @@ class RealmChallengeLocalRepository(realm: Realm) : override fun getChallengeMembership( userId: String, - id: String, + id: String ) = realm.where(ChallengeMembership::class.java) .equalTo("userID", userId) @@ -106,7 +106,7 @@ class RealmChallengeLocalRepository(realm: Realm) : override fun setParticipating( userID: String, challengeID: String, - isParticipating: Boolean, + isParticipating: Boolean ) { val user = realm.where(User::class.java).equalTo("id", userID).findFirst() ?: return executeTransaction { @@ -125,7 +125,7 @@ class RealmChallengeLocalRepository(realm: Realm) : challenges: List, clearChallenges: Boolean, memberOnly: Boolean, - userID: String, + userID: String ) { if (clearChallenges || memberOnly) { val localChallenges = realm.where(Challenge::class.java).findAll().createSnapshot() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmCustomizationLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmCustomizationLocalRepository.kt index 48f363a14..08ca30e5b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmCustomizationLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmCustomizationLocalRepository.kt @@ -14,7 +14,7 @@ class RealmCustomizationLocalRepository(realm: Realm) : override fun getCustomizations( type: String, category: String?, - onlyAvailable: Boolean, + onlyAvailable: Boolean ): Flow> { var query = realm.where(Customization::class.java) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt index 188551ac3..bca0c255a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt @@ -90,7 +90,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun getEquipmentType( type: String, - set: String, + set: String ): Flow> { return realm.where(Equipment::class.java) .equalTo("type", type) @@ -103,7 +103,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun getOwnedItems( itemType: String, userID: String, - includeZero: Boolean, + includeZero: Boolean ): Flow> { return queryUser(userID).map { val items = @@ -130,7 +130,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun getItems( itemClass: Class, - keys: Array, + keys: Array ): Flow> { return realm.where(itemClass).`in`("key", keys).findAll().toFlow() .filter { it.isLoaded } @@ -138,7 +138,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun getOwnedItems( userID: String, - includeZero: Boolean, + includeZero: Boolean ): Flow> { return queryUser(userID) .filterNotNull() @@ -178,7 +178,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun getMounts( type: String?, group: String?, - color: String?, + color: String? ): Flow> { var query = realm.where(Mount::class.java) @@ -217,7 +217,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun getPets( type: String?, group: String?, - color: String?, + color: String? ): Flow> { var query = realm.where(Pet::class.java) @@ -256,7 +256,7 @@ class RealmInventoryLocalRepository(realm: Realm) : type: String, key: String, userID: String, - amountToAdd: Int, + amountToAdd: Int ) { val item = getOwnedItem(userID, type, key, true).firstOrNull() if (item != null) { @@ -266,7 +266,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun changeOwnedCount( item: OwnedItem, - amountToAdd: Int?, + amountToAdd: Int? ) { val liveItem = getLiveObject(item) ?: return amountToAdd?.let { amount -> @@ -278,7 +278,7 @@ class RealmInventoryLocalRepository(realm: Realm) : userID: String, type: String, key: String, - includeZero: Boolean, + includeZero: Boolean ): Flow { return queryUser(userID) .filterNotNull() @@ -291,7 +291,7 @@ class RealmInventoryLocalRepository(realm: Realm) : "quests" -> it.items?.quests else -> emptyList() } ?: emptyList() - ) + ) items = items.filter { it.key == key } if (includeZero) { items @@ -305,7 +305,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun getItem( type: String, - key: String, + key: String ): Flow { val itemClass: Class = when (type) { @@ -374,7 +374,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun hatchPet( eggKey: String, potionKey: String, - userID: String, + userID: String ) { val newPet = OwnedPet() newPet.key = "$eggKey-$potionKey" @@ -399,7 +399,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun save( items: Items, - userID: String, + userID: String ) { val user = realm.where(User::class.java).equalTo("id", userID).findFirst() ?: return items.setItemTypes() @@ -411,7 +411,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun unhatchPet( eggKey: String, potionKey: String, - userID: String, + userID: String ) { val pet = realm.where(OwnedPet::class.java).equalTo("key", "$eggKey-$potionKey").findFirst() val user = realm.where(User::class.java).equalTo("id", userID).findFirst() ?: return @@ -429,7 +429,7 @@ class RealmInventoryLocalRepository(realm: Realm) : foodKey: String, petKey: String, feedValue: Int, - userID: String, + userID: String ) { val user = realm.where(User::class.java).equalTo("id", userID).findFirst() ?: return val pet = user.items?.pets?.firstOrNull { it.key == petKey } ?: return @@ -484,7 +484,7 @@ class RealmInventoryLocalRepository(realm: Realm) : override fun soldItem( userID: String, - updatedUser: User, + updatedUser: User ): User { val user = realm.where(User::class.java) @@ -522,7 +522,7 @@ class RealmInventoryLocalRepository(realm: Realm) : realm.where(Food::class.java) .lessThan("event.start", Date()) .greaterThan("event.end", Date()) - .findAll().toFlow(), + .findAll().toFlow() ) { items, food -> items.addAll(food) items @@ -531,7 +531,7 @@ class RealmInventoryLocalRepository(realm: Realm) : realm.where(HatchingPotion::class.java) .lessThan("event.start", Date()) .greaterThan("event.end", Date()) - .findAll().toFlow(), + .findAll().toFlow() ) { items, food -> items.addAll(food) items @@ -540,7 +540,7 @@ class RealmInventoryLocalRepository(realm: Realm) : realm.where(QuestContent::class.java) .lessThan("event.start", Date()) .greaterThan("event.end", Date()) - .findAll().toFlow(), + .findAll().toFlow() ) { items, food -> items.addAll(food) items diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt index ad3d23474..a4dc536c2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt @@ -23,7 +23,7 @@ class RealmSocialLocalRepository(realm: Realm) : SocialLocalRepository { override fun getGroupMembership( userId: String, - id: String, + id: String ) = realm.where(GroupMembership::class.java) .equalTo("userID", userId) @@ -43,7 +43,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun updateMembership( userId: String, id: String, - isMember: Boolean, + isMember: Boolean ) { if (isMember) { save(GroupMembership(userId, id)) @@ -73,7 +73,7 @@ class RealmSocialLocalRepository(realm: Realm) : userID: String, recipientID: String, messages: List, - page: Int, + page: Int ) { messages.forEach { it.userID = userID } for (message in messages) { @@ -103,7 +103,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun saveInboxConversations( userID: String, - conversations: List, + conversations: List ) { conversations.forEach { it.userID = userID } save(conversations) @@ -131,7 +131,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun saveGroupMemberships( userID: String?, - memberships: List, + memberships: List ) { save(memberships) if (userID != null) { @@ -153,7 +153,7 @@ class RealmSocialLocalRepository(realm: Realm) : @OptIn(ExperimentalCoroutinesApi::class) override fun getUserGroups( userID: String, - type: String?, + type: String? ) = realm.where(GroupMembership::class.java) .equalTo("userID", userID) @@ -167,7 +167,7 @@ class RealmSocialLocalRepository(realm: Realm) : "id", memberships.map { return@map it.groupID - }.toTypedArray(), + }.toTypedArray() ) .sort("memberCount", Sort.DESCENDING) .findAll() @@ -213,7 +213,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun updateRSVPNeeded( user: User?, - newValue: Boolean, + newValue: Boolean ) { executeTransaction { user?.party?.quest?.rsvpNeeded = newValue } } @@ -221,7 +221,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun likeMessage( chatMessage: ChatMessage, userId: String, - liked: Boolean, + liked: Boolean ) { val liveMessage = getLiveObject(chatMessage) if (liveMessage == null) { @@ -253,7 +253,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun savePartyMembers( groupId: String?, - members: List, + members: List ) { save(members) if (groupId != null) { @@ -275,7 +275,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun rejectGroupInvitation( userID: String, - groupID: String, + groupID: String ) { val user = realm.where(User::class.java).equalTo("id", userID).findFirst() executeTransaction { @@ -292,7 +292,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun setQuestActivity( party: Group?, - active: Boolean, + active: Boolean ) { if (party == null) return val liveParty = getLiveObject(party) @@ -303,7 +303,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun saveChatMessages( groupId: String?, - chatMessages: List, + chatMessages: List ) { save(chatMessages) if (groupId != null) { @@ -331,7 +331,7 @@ class RealmSocialLocalRepository(realm: Realm) : override fun getInboxMessages( userId: String, - replyToUserID: String?, + replyToUserID: String? ) = realm.where(ChatMessage::class.java) .equalTo("isInboxMessage", true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt index 0a46d71dc..b35555be6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt @@ -24,7 +24,7 @@ class RealmTaskLocalRepository(realm: Realm) : override fun getTasks( taskType: TaskType, userID: String, - includedGroupIDs: Array, + includedGroupIDs: Array ): Flow> { if (realm.isClosed) return emptyFlow() return findTasks(taskType, userID) @@ -34,7 +34,7 @@ class RealmTaskLocalRepository(realm: Realm) : private fun findTasks( taskType: TaskType, - ownerID: String, + ownerID: String ): RealmResults { return realm.where(Task::class.java) .equalTo("typeValue", taskType.value) @@ -55,7 +55,7 @@ class RealmTaskLocalRepository(realm: Realm) : override fun saveTasks( ownerID: String, tasksOrder: TasksOrder, - tasks: TaskList, + tasks: TaskList ) { val sortedTasks = mutableListOf() sortedTasks.addAll(sortTasks(tasks.tasks, tasksOrder.habits)) @@ -85,7 +85,7 @@ class RealmTaskLocalRepository(realm: Realm) : override fun saveCompletedTodos( userId: String, - tasks: MutableCollection, + tasks: MutableCollection ) { removeCompletedTodos(userId, tasks) executeTransaction { realm1 -> realm1.insertOrUpdate(tasks) } @@ -113,7 +113,7 @@ class RealmTaskLocalRepository(realm: Realm) : private fun sortTasks( taskMap: MutableMap, - taskOrder: List, + taskOrder: List ): List { val taskList = ArrayList() var position = 0 @@ -131,7 +131,7 @@ class RealmTaskLocalRepository(realm: Realm) : private fun removeOldTasks( ownerID: String, - onlineTaskList: List, + onlineTaskList: List ) { if (realm.isClosed) return val localTasks = @@ -157,7 +157,7 @@ class RealmTaskLocalRepository(realm: Realm) : private fun removeCompletedTodos( userID: String, - onlineTaskList: MutableCollection, + onlineTaskList: MutableCollection ) { val localTasks = realm.where(Task::class.java) @@ -206,7 +206,7 @@ class RealmTaskLocalRepository(realm: Realm) : override fun markTaskCompleted( taskId: String, - isCompleted: Boolean, + isCompleted: Boolean ) { val task = realm.where(Task::class.java).equalTo("id", taskId).findFirst() executeTransaction { task?.completed = true } @@ -214,7 +214,7 @@ class RealmTaskLocalRepository(realm: Realm) : override fun swapTaskPosition( firstPosition: Int, - secondPosition: Int, + secondPosition: Int ) { val firstTask = realm.where(Task::class.java).equalTo("position", firstPosition).findFirst() val secondTask = @@ -229,7 +229,7 @@ class RealmTaskLocalRepository(realm: Realm) : override fun getTaskAtPosition( taskType: String, - position: Int, + position: Int ): Flow { return realm.where(Task::class.java).equalTo("typeValue", taskType) .equalTo("position", position) @@ -282,7 +282,7 @@ class RealmTaskLocalRepository(realm: Realm) : override fun getTasksForChallenge( challengeID: String?, - userID: String?, + userID: String? ): Flow> { return realm.where(Task::class.java) .equalTo("challengeID", challengeID) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt index 6d0a2f9dc..87e50e5c3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt @@ -84,7 +84,7 @@ class RealmUserLocalRepository(realm: Realm) : override fun saveUser( user: User, - overrideExisting: Boolean, + overrideExisting: Boolean ) { if (realm.isClosed) return val oldUser = @@ -108,7 +108,7 @@ class RealmUserLocalRepository(realm: Realm) : private fun removeOldTags( userId: String, - onlineTags: List, + onlineTags: List ) { val tags = realm.where(Tag::class.java).equalTo("userId", userId).findAll().createSnapshot() val tagsToDelete = tags.filterNot { onlineTags.contains(it) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AlertDialogExtensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AlertDialogExtensions.kt index 14414b30c..270423f2f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AlertDialogExtensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AlertDialogExtensions.kt @@ -5,21 +5,21 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog fun HabiticaAlertDialog.addOkButton( isPrimary: Boolean = true, - listener: ((HabiticaAlertDialog, Int) -> Unit)? = null, + listener: ((HabiticaAlertDialog, Int) -> Unit)? = null ) { this.addButton(R.string.ok, isPrimary, false, true, listener) } fun HabiticaAlertDialog.addCloseButton( isPrimary: Boolean = false, - listener: ((HabiticaAlertDialog, Int) -> Unit)? = null, + listener: ((HabiticaAlertDialog, Int) -> Unit)? = null ) { this.addButton(R.string.close, isPrimary, false, true, listener) } fun HabiticaAlertDialog.addCancelButton( isPrimary: Boolean = false, - listener: ((HabiticaAlertDialog, Int) -> Unit)? = null, + listener: ((HabiticaAlertDialog, Int) -> Unit)? = null ) { this.addButton(R.string.cancel, isPrimary, false, true, listener) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AnimalExtensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AnimalExtensions.kt index 61f97e1af..8dd4bd4a9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AnimalExtensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AnimalExtensions.kt @@ -10,7 +10,7 @@ fun Animal.getTranslatedType(c: Context?): String? { fun getTranslatedAnimalType( c: Context?, - type: String?, + type: String? ): String? { if (c == null) { return type diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AttributeSetExtentions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AttributeSetExtentions.kt index 0e5e57ce6..2edffbc3c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AttributeSetExtentions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AttributeSetExtentions.kt @@ -6,6 +6,6 @@ import android.util.AttributeSet fun AttributeSet.styledAttributes( context: Context?, - style: IntArray, + style: IntArray ): TypedArray? = context?.theme?.obtainStyledAttributes(this, style, 0, 0) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/DateExtensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/DateExtensions.kt index 1e4dac718..c6390ff54 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/DateExtensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/DateExtensions.kt @@ -17,7 +17,7 @@ class DateUtils { fun createDate( year: Int, month: Int, - day: Int, + day: Int ): Date { val cal = Calendar.getInstance() cal.set(Calendar.YEAR, year) @@ -32,7 +32,7 @@ class DateUtils { fun isSameDay( date1: Date, - date2: Date, + date2: Date ): Boolean { val cal1 = Calendar.getInstance() val cal2 = Calendar.getInstance() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/LocaleExtensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/LocaleExtensions.kt index c6691a7d0..7923733c7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/LocaleExtensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/LocaleExtensions.kt @@ -3,8 +3,6 @@ package com.habitrpg.android.habitica.extensions import com.habitrpg.common.habitica.helpers.LanguageHelper import java.util.Locale - - fun Locale.getSystemDefault(): Locale { return LanguageHelper.systemLocale } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ResourcesExtensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ResourcesExtensions.kt index 16ecda148..01c0933ad 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ResourcesExtensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ResourcesExtensions.kt @@ -10,7 +10,7 @@ import java.util.Locale fun Resources.forceLocale( activity: BaseActivity, - locale: Locale, + locale: Locale ) { Locale.setDefault(locale) val configuration = Configuration() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextWatcherExtensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextWatcherExtensions.kt index f58c23b06..aee7e7d84 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextWatcherExtensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextWatcherExtensions.kt @@ -12,7 +12,7 @@ class OnChangeTextWatcher(private var function: (CharSequence?, Int, Int, Int) - s: CharSequence?, start: Int, count: Int, - after: Int, + after: Int ) { // no-on } @@ -20,7 +20,7 @@ class OnChangeTextWatcher(private var function: (CharSequence?, Int, Int, Int) - s: CharSequence?, start: Int, before: Int, - count: Int, + count: Int ) { function(s, start, before, count) } @@ -35,7 +35,7 @@ class BeforeChangeTextWatcher(private var function: (CharSequence?, Int, Int, In s: CharSequence?, start: Int, count: Int, - after: Int, + after: Int ) { function(s, start, count, after) } @@ -44,7 +44,7 @@ class BeforeChangeTextWatcher(private var function: (CharSequence?, Int, Int, In s: CharSequence?, start: Int, before: Int, - count: Int, + count: Int ) { // no-on } } @@ -58,7 +58,7 @@ class AfterChangeTextWatcher(private var function: (Editable?) -> Unit) : TextWa s: CharSequence?, start: Int, count: Int, - after: Int, + after: Int ) { // no-on } @@ -66,7 +66,7 @@ class AfterChangeTextWatcher(private var function: (Editable?) -> Unit) : TextWa s: CharSequence?, start: Int, before: Int, - count: Int, + count: Int ) { // no-on } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/WindowExtensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/WindowExtensions.kt index bd40e239f..f7f87d104 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/WindowExtensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/WindowExtensions.kt @@ -8,7 +8,7 @@ import com.habitrpg.common.habitica.extensions.getThemeColor fun Window.updateStatusBarColor( color: Int, - isLight: Boolean, + isLight: Boolean ) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { statusBarColor = color diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ZonedDateExtensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ZonedDateExtensions.kt index b7641cfbb..007f8d550 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ZonedDateExtensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ZonedDateExtensions.kt @@ -16,7 +16,7 @@ fun String.parseToZonedDateTime(): ZonedDateTime? { formatter().parseBest( this, ZonedDateTime::from, - LocalDateTime::from, + LocalDateTime::from ) return if (parsed is ZonedDateTime) { parsed @@ -65,4 +65,4 @@ fun Calendar.matchesRepeatDays(repeatDays: Days?): Boolean { Calendar.SUNDAY -> repeatDays.su else -> false } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AdHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AdHandler.kt index 7316a32c1..b25eb52f4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AdHandler.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AdHandler.kt @@ -23,7 +23,7 @@ import kotlin.time.toDuration enum class AdType { ARMOIRE, SPELL, - FAINT, + FAINT ; val adUnitID: String @@ -68,7 +68,7 @@ class AdHandler(val activity: Activity, val type: AdType, val rewardAction: (Boo UNINITIALIZED, INITIALIZING, READY, - DISABLED, + DISABLED } private lateinit var sharedPreferences: SharedPreferences @@ -103,7 +103,7 @@ class AdHandler(val activity: Activity, val type: AdType, val rewardAction: (Boo fun initialize( context: Context, - onComplete: () -> Unit, + onComplete: () -> Unit ) { if (currentAdStatus != AdStatus.UNINITIALIZED) return @@ -125,7 +125,7 @@ class AdHandler(val activity: Activity, val type: AdType, val rewardAction: (Boo fun whenAdsInitialized( context: Context, - onComplete: () -> Unit, + onComplete: () -> Unit ) { when (currentAdStatus) { AdStatus.READY -> { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/Analytics.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/Analytics.kt index e4d582e87..f5af53090 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/Analytics.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/Analytics.kt @@ -13,12 +13,12 @@ import com.habitrpg.android.habitica.R enum class AnalyticsTarget { AMPLITUDE, - FIREBASE, + FIREBASE } enum class EventCategory(val key: String) { BEHAVIOUR("behaviour"), - NAVIGATION("navigation"), + NAVIGATION("navigation") } enum class HitType(val key: String) { @@ -26,7 +26,7 @@ enum class HitType(val key: String) { PAGEVIEW("pageview"), CREATE_WIDGET("create"), REMOVE_WIDGET("remove"), - UPDATE_WIDGET("update"), + UPDATE_WIDGET("update") } object Analytics { @@ -39,7 +39,7 @@ object Analytics { category: EventCategory?, hitType: HitType?, additionalData: Map? = null, - target: AnalyticsTarget? = null, + target: AnalyticsTarget? = null ) { if (BuildConfig.DEBUG) { return @@ -49,7 +49,7 @@ object Analytics { "eventAction" to eventAction, "eventCategory" to category?.key, "hitType" to hitType?.key, - "status" to "displayed", + "status" to "displayed" ) if (additionalData != null) { data.putAll(additionalData) @@ -79,8 +79,8 @@ object Analytics { Amplitude( Configuration( context.getString(R.string.amplitude_app_id), - context, - ), + context + ) ) firebase = FirebaseAnalytics.getInstance(context) } @@ -109,7 +109,7 @@ object Analytics { fun setUserProperty( identifier: String, - value: Any?, + value: Any? ) { if (this::amplitude.isInitialized) { amplitude.identify(mapOf(identifier to value)) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt index bbcb751a6..9ce438733 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt @@ -128,7 +128,7 @@ class AppConfigManager(contentRepository: ContentRepository) : getHabiticaPromotionFromKey( event.promo ?: event.eventKey ?: "", event.start, - event.end, + event.end ) if (thisPromo != null) { promo = thisPromo @@ -147,7 +147,6 @@ class AppConfigManager(contentRepository: ContentRepository) : return null } - fun knownIssues(): List> { val type = object : TypeToken>>() {}.type return Gson().fromJson(remoteConfig.getString("knownIssues"), type) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AprilFoolsHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AprilFoolsHandler.kt index 9ba769688..7305dd7fb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AprilFoolsHandler.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AprilFoolsHandler.kt @@ -8,7 +8,7 @@ class AprilFoolsHandler { fun handle( name: String?, - endDate: Date?, + endDate: Date? ) { if (endDate != null) { this.eventEnd = endDate diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/GroupPlanInfoProvider.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/GroupPlanInfoProvider.kt index e4f500444..236dbebf2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/GroupPlanInfoProvider.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/GroupPlanInfoProvider.kt @@ -6,7 +6,7 @@ import com.habitrpg.android.habitica.models.tasks.Task interface GroupPlanInfoProvider { fun assignedTextForTask( resources: Resources, - assignedUsers: List, + assignedUsers: List ): String fun canScoreTask(task: Task): Boolean diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LifecycleCollect.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LifecycleCollect.kt index 73a4ed1dc..afb5542f1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LifecycleCollect.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LifecycleCollect.kt @@ -15,18 +15,18 @@ import kotlin.coroutines.EmptyCoroutineContext @Composable fun rememberFlow( flow: Flow, - lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current, + lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current ): Flow { return remember( key1 = flow, - key2 = lifecycleOwner, + key2 = lifecycleOwner ) { flow.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.STARTED) } } @Composable fun Flow.collectAsStateLifecycleAware( initial: R, - context: CoroutineContext = EmptyCoroutineContext, + context: CoroutineContext = EmptyCoroutineContext ): State { val lifecycleAwareFlow = rememberFlow(flow = this) return lifecycleAwareFlow.collectAsState(initial = initial, context = context) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt index 1866964de..9cb025dd6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt @@ -13,7 +13,7 @@ class NotificationOpenHandler { companion object { fun handleOpenedByNotification( identifier: String, - intent: Intent, + intent: Intent ) { MainScope().launch(context = Dispatchers.Main) { when (identifier) { @@ -22,13 +22,13 @@ class NotificationOpenHandler { PushNotificationManager.QUEST_INVITE_PUSH_NOTIFICATION_KEY -> openPartyScreen() PushNotificationManager.GUILD_INVITE_PUSH_NOTIFICATION_KEY -> openGuildDetailScreen( - intent.getStringExtra("groupID"), + intent.getStringExtra("groupID") ) PushNotificationManager.RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY -> openPrivateMessageScreen( intent.getStringExtra("replyToUUID"), - intent.getStringExtra("replyToUsername"), + intent.getStringExtra("replyToUsername") ) PushNotificationManager.CHANGE_USERNAME_PUSH_NOTIFICATION_KEY -> openSettingsScreen() @@ -36,13 +36,13 @@ class NotificationOpenHandler { PushNotificationManager.CHAT_MENTION_NOTIFICATION_KEY -> handleChatMessage( intent.getStringExtra("type"), - intent.getStringExtra("groupID"), + intent.getStringExtra("groupID") ) PushNotificationManager.GROUP_ACTIVITY_NOTIFICATION_KEY -> handleChatMessage( intent.getStringExtra("type"), - intent.getStringExtra("groupID"), + intent.getStringExtra("groupID") ) PushNotificationManager.G1G1_PROMO_KEY -> openGiftOneGetOneInfoScreen() @@ -58,18 +58,18 @@ class NotificationOpenHandler { private fun openSubscriptionScreen() { MainNavigationController.navigate( R.id.gemPurchaseActivity, - bundleOf(Pair("openSubscription", true)), + bundleOf(Pair("openSubscription", true)) ) } private fun openPrivateMessageScreen( userID: String?, - userName: String?, + userName: String? ) { if (userID != null && userName != null) { MainNavigationController.navigate( R.id.inboxMessageListFragment, - bundleOf("userID" to userID, "username" to userName), + bundleOf("userID" to userID, "username" to userName) ) } else { MainNavigationController.navigate(R.id.inboxFragment) @@ -80,7 +80,7 @@ class NotificationOpenHandler { val tabToOpen = if (isChatNotification) 1 else 0 MainNavigationController.navigate( R.id.partyFragment, - bundleOf("tabToOpen" to tabToOpen), + bundleOf("tabToOpen" to tabToOpen) ) } @@ -106,7 +106,7 @@ class NotificationOpenHandler { private fun handleChatMessage( type: String?, - groupID: String?, + groupID: String? ) { when (type) { "party" -> openPartyScreen() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationsManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationsManager.kt index c0384d384..39167e79b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationsManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationsManager.kt @@ -27,7 +27,7 @@ interface NotificationsManager { fun dismissTaskNotification( context: Context, - task: Task, + task: Task ) } @@ -60,7 +60,7 @@ class MainNotificationsManager : NotificationsManager { override fun dismissTaskNotification( context: Context, - task: Task, + task: Task ) { NotificationManagerCompat.from(context).cancel(task.id.hashCode()) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt index fbee31fb0..415eda1a3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt @@ -23,7 +23,6 @@ import com.android.billingclient.api.acknowledgePurchase import com.android.billingclient.api.consumePurchase import com.android.billingclient.api.queryProductDetails import com.android.billingclient.api.queryPurchasesAsync -import com.google.api.Billing import com.google.firebase.crashlytics.FirebaseCrashlytics import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R @@ -64,21 +63,21 @@ class PurchaseHandler( override fun onPurchasesUpdated( result: BillingResult, - purchases: MutableList?, + purchases: MutableList? ) { purchases?.let { processPurchases(result, it) } } override fun onQueryPurchasesResponse( result: BillingResult, - purchases: MutableList, + purchases: MutableList ) { processPurchases(result, purchases) } private fun processPurchases( result: BillingResult, - purchases: List, + purchases: List ) { when (result.responseCode) { BillingClient.BillingResponseCode.OK -> { @@ -90,8 +89,8 @@ class PurchaseHandler( for (purchase in purchases) { if (plan?.isActive == true && PurchaseTypes.allSubscriptionTypes.contains( - purchase.products.firstOrNull(), - ) + purchase.products.firstOrNull() + ) ) { if (((plan.dateTerminated != null) == purchase.isAutoRenewing) || mostRecentSub?.orderId != purchase.orderId || @@ -139,7 +138,7 @@ class PurchaseHandler( READY, UNAVAILABLE, DISCONNECTED, - CONNECTING, + CONNECTING ; val canMaybePurchase: Boolean @@ -203,7 +202,7 @@ class PurchaseHandler( retryListening() } } - }, + } ) } @@ -228,13 +227,13 @@ class PurchaseHandler( val subResponse = billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.SUBS) - .build(), + .build() ) processPurchases(subResponse.billingResult, subResponse.purchasesList) val iapResponse = billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.INAPP) - .build(), + .build() ) processPurchases(iapResponse.billingResult, iapResponse.purchasesList) } @@ -256,13 +255,13 @@ class PurchaseHandler( private suspend fun getSKUs( type: String, - identifiers: List, + identifiers: List ) = loadInventory(type, identifiers) ?: emptyList() private suspend fun getSKU( type: String, - identifier: String, + identifier: String ): ProductDetails? { val inventory = loadInventory(type, listOf(identifier)) return inventory?.firstOrNull() @@ -270,11 +269,12 @@ class PurchaseHandler( private suspend fun loadInventory( type: String, - skus: List, + skus: List ): List? { retryUntil(8, initialDelay = 500, maxDelay = 2000) { if (billingClient.connectionState == BillingClient.ConnectionState.DISCONNECTED || - billingClient.connectionState == BillingClient.ConnectionState.CLOSED) { + billingClient.connectionState == BillingClient.ConnectionState.CLOSED + ) { startListening() } billingClientState.canMaybePurchase && billingClient.isReady @@ -283,7 +283,7 @@ class PurchaseHandler( QueryProductDetailsParams.newBuilder().setProductList( skus.map { Product.newBuilder().setProductId(it).setProductType(type).build() - }, + } ).build() val skuDetailsResult = withContext(Dispatchers.IO) { @@ -293,8 +293,8 @@ class PurchaseHandler( Log.e("PurchaseHandler", "Failed to load inventory: ${skuDetailsResult.billingResult.debugMessage}") FirebaseCrashlytics.getInstance().recordException( Throwable( - "Failed to load inventory: ${skuDetailsResult.billingResult.debugMessage}", - ), + "Failed to load inventory: ${skuDetailsResult.billingResult.debugMessage}" + ) ) return null } @@ -306,7 +306,7 @@ class PurchaseHandler( skuDetails: ProductDetails, recipient: String? = null, recipientUsername: String? = null, - isSaleGemPurchase: Boolean = false, + isSaleGemPurchase: Boolean = false ) { this.isSaleGemPurchase = isSaleGemPurchase recipient?.let { @@ -320,14 +320,14 @@ class PurchaseHandler( params = params.setOfferToken(offerToken) } return@map params.build() - }, + } ).build() billingClient.launchBillingFlow(activity, flowParams) } private suspend fun consume( purchase: Purchase, - retries: Int = 4, + retries: Int = 4 ) { retryUntil { billingClientState.canMaybePurchase && billingClient.isReady } val params = ConsumeParams.newBuilder().setPurchaseToken(purchase.purchaseToken).build() @@ -348,8 +348,8 @@ class PurchaseHandler( private fun handle(purchase: Purchase) { if (purchase.purchaseState != Purchase.PurchaseState.PURCHASED || processedPurchases.contains( - purchase.orderId, - ) + purchase.orderId + ) ) { return } @@ -433,7 +433,7 @@ class PurchaseHandler( private suspend fun acknowledgePurchase( purchase: Purchase, - retries: Int = 4, + retries: Int = 4 ) { val params = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase.purchaseToken).build() @@ -470,7 +470,7 @@ class PurchaseHandler( private fun handleError( throwable: Throwable, - purchase: Purchase, + purchase: Purchase ) { when (throwable) { is HttpException -> { @@ -576,7 +576,7 @@ class PurchaseHandler( private fun displayConfirmationDialog( purchase: Purchase, giftedToID: String? = null, - giftedTo: String? = null, + giftedTo: String? = null ) { if (displayedConfirmations.contains(purchase.orderId)) { return @@ -599,7 +599,7 @@ class PurchaseHandler( R.string.gift_confirmation_text_sub }, giftedTo, - durationString(sku), + durationString(sku) ) } @@ -609,7 +609,7 @@ class PurchaseHandler( } else { context.getString( R.string.subscription_confirmation_multiple, - durationString(sku), + durationString(sku) ) } } @@ -619,7 +619,7 @@ class PurchaseHandler( context.getString( R.string.gift_confirmation_text_gems_new, giftedTo, - gemAmountString(sku), + gemAmountString(sku) ) } @@ -648,7 +648,7 @@ class PurchaseHandler( private fun displayGryphatriceConfirmationDialog( purchase: Purchase, - giftedTo: String? = null, + giftedTo: String? = null ) { MainScope().launch(ExceptionHandler.coroutine()) { val application = @@ -681,7 +681,7 @@ class PurchaseHandler( fun addGift( sku: String, userID: String, - username: String, + username: String ) { pendingGifts[sku] = Triple(Date(), userID, username) savePendingGifts() @@ -708,7 +708,7 @@ suspend fun retryUntil( initialDelay: Long = 100, // 0.1 second maxDelay: Long = 1000, // 1 second factor: Double = 2.0, - block: suspend () -> Boolean, + block: suspend () -> Boolean ) { var currentDelay = initialDelay repeat(times - 1) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseTypes.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseTypes.kt index 26406fc58..d28f87af0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseTypes.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseTypes.kt @@ -16,7 +16,7 @@ object PurchaseTypes { SUBSCRIPTION_1_MONTH, SUBSCRIPTION_3_MONTH, SUBSCRIPTION_6_MONTH, - SUBSCRIPTION_12_MONTH, + SUBSCRIPTION_12_MONTH ) const val SUBSCRIPTION_1_MONTH_NORENEW = "com.habitrpg.android.habitica.norenew_subscription.1month" @@ -31,6 +31,6 @@ object PurchaseTypes { SUBSCRIPTION_1_MONTH_NORENEW, SUBSCRIPTION_3_MONTH_NORENEW, SUBSCRIPTION_6_MONTH_NORENEW, - SUBSCRIPTION_12_MONTH_NORENEW, + SUBSCRIPTION_12_MONTH_NORENEW ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/ReviewManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/ReviewManager.kt index e4ec54ba2..66d81dad2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/ReviewManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/ReviewManager.kt @@ -60,7 +60,7 @@ class ReviewManager(context: Context, private val configManager: AppConfigManage fun requestReview( activity: AppCompatActivity, - currentCheckins: Int, + currentCheckins: Int ) { if (!canRequestReview(currentCheckins)) return diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundManager.kt index 8e6d516eb..6fd73b4d0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundManager.kt @@ -7,65 +7,65 @@ import javax.inject.Singleton @Singleton class SoundManager - @Inject - constructor(var soundFileLoader: SoundFileLoader) { - var soundTheme: String = SOUND_THEME_OFF +@Inject +constructor(var soundFileLoader: SoundFileLoader) { + var soundTheme: String = SOUND_THEME_OFF - private val loadedSoundFiles: MutableMap = HashMap() + private val loadedSoundFiles: MutableMap = HashMap() - fun preloadAllFiles() { - loadedSoundFiles.clear() - if (soundTheme == SOUND_THEME_OFF) { - return - } - - val soundFiles = ArrayList() - soundFiles.add(SoundFile(soundTheme, SOUND_ACHIEVEMENT_UNLOCKED)) - soundFiles.add(SoundFile(soundTheme, SOUND_CHAT)) - soundFiles.add(SoundFile(soundTheme, SOUND_DAILY)) - soundFiles.add(SoundFile(soundTheme, SOUND_DEATH)) - soundFiles.add(SoundFile(soundTheme, SOUND_ITEM_DROP)) - soundFiles.add(SoundFile(soundTheme, SOUND_LEVEL_UP)) - soundFiles.add(SoundFile(soundTheme, SOUND_MINUS_HABIT)) - soundFiles.add(SoundFile(soundTheme, SOUND_PLUS_HABIT)) - soundFiles.add(SoundFile(soundTheme, SOUND_REWARD)) - soundFiles.add(SoundFile(soundTheme, SOUND_TODO)) - MainScope().launchCatching { - soundFileLoader.download(soundFiles) - } + fun preloadAllFiles() { + loadedSoundFiles.clear() + if (soundTheme == SOUND_THEME_OFF) { + return } - fun loadAndPlayAudio(type: String) { - if (soundTheme == SOUND_THEME_OFF) { - return - } - - if (loadedSoundFiles.containsKey(type)) { - loadedSoundFiles[type]?.play() - } else { - val soundFiles = ArrayList() - - soundFiles.add(SoundFile(soundTheme, type)) - MainScope().launchCatching { - val newFiles = soundFileLoader.download(soundFiles) - val file = newFiles[0] - loadedSoundFiles[type] = file - file.play() - } - } - } - - companion object { - const val SOUND_ACHIEVEMENT_UNLOCKED = "Achievement_Unlocked" - const val SOUND_CHAT = "Chat" - const val SOUND_DAILY = "Daily" - const val SOUND_DEATH = "Death" - const val SOUND_ITEM_DROP = "Item_Drop" - const val SOUND_LEVEL_UP = "Level_Up" - const val SOUND_MINUS_HABIT = "Minus_Habit" - const val SOUND_PLUS_HABIT = "Plus_Habit" - const val SOUND_REWARD = "Reward" - const val SOUND_TODO = "Todo" - const val SOUND_THEME_OFF = "off" + val soundFiles = ArrayList() + soundFiles.add(SoundFile(soundTheme, SOUND_ACHIEVEMENT_UNLOCKED)) + soundFiles.add(SoundFile(soundTheme, SOUND_CHAT)) + soundFiles.add(SoundFile(soundTheme, SOUND_DAILY)) + soundFiles.add(SoundFile(soundTheme, SOUND_DEATH)) + soundFiles.add(SoundFile(soundTheme, SOUND_ITEM_DROP)) + soundFiles.add(SoundFile(soundTheme, SOUND_LEVEL_UP)) + soundFiles.add(SoundFile(soundTheme, SOUND_MINUS_HABIT)) + soundFiles.add(SoundFile(soundTheme, SOUND_PLUS_HABIT)) + soundFiles.add(SoundFile(soundTheme, SOUND_REWARD)) + soundFiles.add(SoundFile(soundTheme, SOUND_TODO)) + MainScope().launchCatching { + soundFileLoader.download(soundFiles) } } + + fun loadAndPlayAudio(type: String) { + if (soundTheme == SOUND_THEME_OFF) { + return + } + + if (loadedSoundFiles.containsKey(type)) { + loadedSoundFiles[type]?.play() + } else { + val soundFiles = ArrayList() + + soundFiles.add(SoundFile(soundTheme, type)) + MainScope().launchCatching { + val newFiles = soundFileLoader.download(soundFiles) + val file = newFiles[0] + loadedSoundFiles[type] = file + file.play() + } + } + } + + companion object { + const val SOUND_ACHIEVEMENT_UNLOCKED = "Achievement_Unlocked" + const val SOUND_CHAT = "Chat" + const val SOUND_DAILY = "Daily" + const val SOUND_DEATH = "Death" + const val SOUND_ITEM_DROP = "Item_Drop" + const val SOUND_LEVEL_UP = "Level_Up" + const val SOUND_MINUS_HABIT = "Minus_Habit" + const val SOUND_PLUS_HABIT = "Plus_Habit" + const val SOUND_REWARD = "Reward" + const val SOUND_TODO = "Todo" + const val SOUND_THEME_OFF = "off" + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.kt index e0094f9bb..cd4b9a81f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.kt @@ -34,7 +34,7 @@ import java.util.Date class TaskAlarmManager( private var context: Context, private var taskRepository: TaskRepository, - private var authenticationHandler: AuthenticationHandler, + private var authenticationHandler: AuthenticationHandler ) { private val am: AlarmManager? = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager private val upcomingReminderOccurrencesToSchedule = 3 @@ -141,7 +141,7 @@ class TaskAlarmManager( private fun setAlarmForRemindersItem( reminderItemTask: Task, remindersItem: RemindersItem?, - occurrenceIndex: Int, + occurrenceIndex: Int ) { if (remindersItem == null) return @@ -166,7 +166,7 @@ class TaskAlarmManager( context, intentId, intent, - withImmutableFlag(PendingIntent.FLAG_NO_CREATE), + withImmutableFlag(PendingIntent.FLAG_NO_CREATE) ) if (previousSender != null) { previousSender.cancel() @@ -178,7 +178,7 @@ class TaskAlarmManager( context, intentId, intent, - withImmutableFlag(PendingIntent.FLAG_CANCEL_CURRENT), + withImmutableFlag(PendingIntent.FLAG_CANCEL_CURRENT) ) CoroutineScope(Dispatchers.IO).launch { @@ -188,7 +188,7 @@ class TaskAlarmManager( private fun removeAlarmForRemindersItem( remindersItem: RemindersItem, - occurrenceIndex: Int? = null, + occurrenceIndex: Int? = null ) { val intent = Intent(context, TaskReceiver::class.java) intent.action = remindersItem.id @@ -197,19 +197,19 @@ class TaskAlarmManager( ( remindersItem.id?.hashCode() ?: (0 and 0xfffffff) - ) + occurrenceIndex + ) + occurrenceIndex } else { ( remindersItem.id?.hashCode() ?: (0 and 0xfffffff) - ) + ) } val sender = PendingIntent.getBroadcast( context, intentId, intent, - withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) val am = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager sender.cancel() @@ -250,7 +250,7 @@ class TaskAlarmManager( context, 0, notificationIntent, - withImmutableFlag(PendingIntent.FLAG_NO_CREATE), + withImmutableFlag(PendingIntent.FLAG_NO_CREATE) ) if (previousSender != null) { previousSender.cancel() @@ -262,7 +262,7 @@ class TaskAlarmManager( context, 0, notificationIntent, - withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) setAlarm(context, triggerTime, pendingIntent) @@ -280,7 +280,7 @@ class TaskAlarmManager( private fun setAlarm( context: Context, time: Long, - pendingIntent: PendingIntent?, + pendingIntent: PendingIntent? ) { val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager @@ -297,15 +297,17 @@ class TaskAlarmManager( } if (canScheduleExact) { alarmManager.setExactAndAllowWhileIdle(notificationType, time, pendingIntent) - HLogger.log(LogLevel.DEBUG, + HLogger.log( + LogLevel.DEBUG, "TaskAlarmManager", - "setAlarm: Scheduling for $time using setExact ${Date().time}", + "setAlarm: Scheduling for $time using setExact ${Date().time}" ) } else { alarmManager.setAndAllowWhileIdle(notificationType, time, pendingIntent) - HLogger.log(LogLevel.DEBUG, + HLogger.log( + LogLevel.DEBUG, "TaskAlarmManager", - "setAlarm: Scheduling for $time using setAndAllowWhileIdle", + "setAlarm: Scheduling for $time using setAndAllowWhileIdle" ) } } catch (ex: Exception) { @@ -315,7 +317,7 @@ class TaskAlarmManager( notificationType, time, 600000, - pendingIntent, + pendingIntent ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskDescriptionBuilder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskDescriptionBuilder.kt index f55f7561d..43c5bb86b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskDescriptionBuilder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskDescriptionBuilder.kt @@ -13,7 +13,6 @@ import com.habitrpg.shared.habitica.models.tasks.TaskDifficulty import com.habitrpg.shared.habitica.models.tasks.TaskType import java.text.DateFormat import java.util.Date -import java.util.Locale class TaskDescriptionBuilder(private val context: Context) { fun describe(task: Task): String { @@ -22,7 +21,7 @@ class TaskDescriptionBuilder(private val context: Context) { context.getString( R.string.habit_summary_description, describeHabitDirections(task.up ?: false, task.down ?: false), - describeDifficulty(task.priority), + describeDifficulty(task.priority) ) TaskType.TODO -> { @@ -30,12 +29,12 @@ class TaskDescriptionBuilder(private val context: Context) { context.getString( R.string.todo_summary_description_duedate, describeDifficulty(task.priority), - describeDate(task.dueDate!!), + describeDate(task.dueDate!!) ) } else { context.getString( R.string.todo_summary_description, - describeDifficulty(task.priority), + describeDifficulty(task.priority) ) } } @@ -45,7 +44,7 @@ class TaskDescriptionBuilder(private val context: Context) { R.string.daily_summary_description, describeDifficulty(task.priority), describeRepeatInterval(task.frequency, task.everyX ?: 1), - describeRepeatDays(task), + describeRepeatDays(task) ) else -> "" @@ -102,7 +101,7 @@ class TaskDescriptionBuilder(private val context: Context) { context.getString( R.string.on_the_x_of_month, occurrence, - joinToCount(dayStrings), + joinToCount(dayStrings) ) } else { "" @@ -116,7 +115,7 @@ class TaskDescriptionBuilder(private val context: Context) { task.startDate?.let { val flags = DateUtils.FORMAT_SHOW_DATE + DateUtils.FORMAT_NO_YEAR DateUtils.formatDateTime(context, it.time, flags) - } ?: "", + } ?: "" ) else -> "" @@ -141,7 +140,7 @@ class TaskDescriptionBuilder(private val context: Context) { private fun describeRepeatInterval( interval: Frequency?, - everyX: Int, + everyX: Int ): String { if (everyX == 0) { return context.getString(R.string.never) @@ -151,28 +150,28 @@ class TaskDescriptionBuilder(private val context: Context) { context.resources.getQuantityString( R.plurals.repeat_daily, everyX, - everyX, + everyX ) Frequency.WEEKLY -> context.resources.getQuantityString( R.plurals.repeat_weekly, everyX, - everyX, + everyX ) Frequency.MONTHLY -> context.resources.getQuantityString( R.plurals.repeat_monthly, everyX, - everyX, + everyX ) Frequency.YEARLY -> context.resources.getQuantityString( R.plurals.repeat_yearly, everyX, - everyX, + everyX ) null -> "" @@ -181,7 +180,7 @@ class TaskDescriptionBuilder(private val context: Context) { private fun describeHabitDirections( up: Boolean, - down: Boolean, + down: Boolean ): String { return if (up && down) { context.getString(R.string.positive_and_negative) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserStatComputer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserStatComputer.kt index 4d63049ff..3525cd3d7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserStatComputer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserStatComputer.kt @@ -26,7 +26,7 @@ class UserStatComputer { fun computeClassBonus( equipmentList: List?, - user: Avatar, + user: Avatar ): List { val skillRows = ArrayList() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GroupActivityNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GroupActivityNotification.kt index d886ee113..64b714753 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GroupActivityNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GroupActivityNotification.kt @@ -62,13 +62,13 @@ class GroupActivityNotification(context: Context, identifier: String?) : return NotificationCompat.MessagingStyle.Message( messageText, timestamp.time, - sender, + sender ) } override fun setNotificationActions( notificationId: Int, - data: Map, + data: Map ) { super.setNotificationActions(notificationId, data) val groupID = data["groupID"] ?: return @@ -89,14 +89,14 @@ class GroupActivityNotification(context: Context, identifier: String?) : context, groupID.hashCode(), intent, - withMutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withMutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) val action: NotificationCompat.Action = NotificationCompat.Action.Builder( R.drawable.ic_send_grey_600_24dp, context.getString(R.string.reply), - replyPendingIntent, + replyPendingIntent ) .addRemoteInput(remoteInput) .build() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.kt index 1ed419c60..492e0d7fc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GuildInviteLocalNotification.kt @@ -19,7 +19,7 @@ class GuildInviteLocalNotification(context: Context, identifier: String?) : override fun setNotificationActions( notificationId: Int, - data: Map, + data: Map ) { super.setNotificationActions(notificationId, data) val res = context.resources @@ -34,7 +34,7 @@ class GuildInviteLocalNotification(context: Context, identifier: String?) : context, groupID.hashCode(), acceptInviteIntent, - withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) notificationBuilder.addAction(0, "Accept", pendingIntentAccept) @@ -47,7 +47,7 @@ class GuildInviteLocalNotification(context: Context, identifier: String?) : context, groupID.hashCode() + 1, rejectInviteIntent, - withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) notificationBuilder.addAction(0, "Reject", pendingIntentReject) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.kt index 4b77af004..16e4b3a2e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotification.kt @@ -18,7 +18,7 @@ import java.util.Date */ abstract class HabiticaLocalNotification( protected var context: Context, - protected var identifier: String?, + protected var identifier: String? ) { protected var data: Map? = null protected var title: String? = null @@ -40,7 +40,7 @@ abstract class HabiticaLocalNotification( open fun notifyLocally( title: String?, message: String?, - data: MutableMap, + data: MutableMap ) { this.title = title this.message = message @@ -71,7 +71,7 @@ abstract class HabiticaLocalNotification( protected open fun setNotificationActions( notificationId: Int, - data: Map, + data: Map ) { val intent = Intent(context, MainActivity::class.java) configureMainIntent(intent) @@ -81,7 +81,7 @@ abstract class HabiticaLocalNotification( context, 3000, intent, - withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) notificationBuilder.setContentIntent(pendingIntent) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.kt index 4c4f242a8..737d3411b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaLocalNotificationFactory.kt @@ -6,89 +6,89 @@ class HabiticaLocalNotificationFactory { // use getShape method to get object of type shape fun build( notificationType: String?, - context: Context?, + context: Context? ): HabiticaLocalNotification { return when { PushNotificationManager.PARTY_INVITE_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { PartyInviteLocalNotification(context!!, notificationType) } PushNotificationManager.RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { ReceivedPrivateMessageLocalNotification(context!!, notificationType) } PushNotificationManager.RECEIVED_GEMS_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { ReceivedGemsGiftLocalNotification(context!!, notificationType) } PushNotificationManager.RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { ReceivedSubscriptionGiftLocalNotification(context!!, notificationType) } PushNotificationManager.GUILD_INVITE_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { GuildInviteLocalNotification(context!!, notificationType) } PushNotificationManager.QUEST_INVITE_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { QuestInviteLocalNotification(context!!, notificationType) } PushNotificationManager.QUEST_BEGUN_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { QuestBegunLocalNotification(context!!, notificationType) } PushNotificationManager.WON_CHALLENGE_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { WonChallengeLocalNotification(context!!, notificationType) } PushNotificationManager.CHANGE_USERNAME_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { ChangeUsernameLocalNotification(context!!, notificationType) } PushNotificationManager.GIFT_ONE_GET_ONE_PUSH_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { GiftOneGetOneLocalNotification(context!!, notificationType) } PushNotificationManager.CHAT_MENTION_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { ChatMentionNotification(context!!, notificationType) } PushNotificationManager.GROUP_ACTIVITY_NOTIFICATION_KEY.equals( notificationType, - true, + true ) -> { GroupActivityNotification(context!!, notificationType) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.kt index 8e98cf970..ce9f3772e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PartyInviteLocalNotification.kt @@ -14,7 +14,7 @@ class PartyInviteLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) { override fun setNotificationActions( notificationId: Int, - data: Map, + data: Map ) { super.setNotificationActions(notificationId, data) val res = context.resources @@ -29,7 +29,7 @@ class PartyInviteLocalNotification(context: Context, identifier: String?) : context, groupID.hashCode(), acceptInviteIntent, - withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) notificationBuilder.addAction(0, context.getString(R.string.accept), pendingIntentAccept) @@ -42,7 +42,7 @@ class PartyInviteLocalNotification(context: Context, identifier: String?) : context, groupID.hashCode() + 1, rejectInviteIntent, - withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) notificationBuilder.addAction(0, context.getString(R.string.reject), pendingIntentReject) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.kt index c7fde3266..63e9e7f50 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.kt @@ -18,7 +18,7 @@ import java.io.IOException class PushNotificationManager( var apiClient: ApiClient, private val sharedPreferences: SharedPreferences, - private val context: Context, + private val context: Context ) { var refreshedToken: String = "" set(value) { @@ -136,7 +136,7 @@ class PushNotificationManager( fun displayNotification( remoteMessage: RemoteMessage, context: Context, - pushNotificationManager: PushNotificationManager? = null, + pushNotificationManager: PushNotificationManager? = null ) { val remoteMessageIdentifier = remoteMessage.data["identifier"] @@ -148,7 +148,7 @@ class PushNotificationManager( "receive notification", EventCategory.BEHAVIOUR, HitType.EVENT, - additionalData, + additionalData ) } @@ -156,7 +156,7 @@ class PushNotificationManager( val localNotification = notificationFactory.build( remoteMessageIdentifier, - context, + context ) localNotification.setExtras(remoteMessage.data) val notification = remoteMessage.notification @@ -164,13 +164,13 @@ class PushNotificationManager( localNotification.notifyLocally( notification.title ?: remoteMessage.data["title"], notification.body ?: remoteMessage.data["body"], - remoteMessage.data, + remoteMessage.data ) } else { localNotification.notifyLocally( remoteMessage.data["title"], remoteMessage.data["body"], - remoteMessage.data, + remoteMessage.data ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.kt index 846c00b1c..cdef17223 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/QuestInviteLocalNotification.kt @@ -18,7 +18,7 @@ class QuestInviteLocalNotification(context: Context, identifier: String?) : override fun setNotificationActions( notificationId: Int, - data: Map, + data: Map ) { super.setNotificationActions(notificationId, data) val res = context.resources @@ -37,7 +37,7 @@ class QuestInviteLocalNotification(context: Context, identifier: String?) : context, 3001, acceptInviteIntent, - flags, + flags ) notificationBuilder.addAction(0, "Accept", pendingIntentAccept) @@ -49,7 +49,7 @@ class QuestInviteLocalNotification(context: Context, identifier: String?) : context, 2001, rejectInviteIntent, - flags, + flags ) notificationBuilder.addAction(0, "Reject", pendingIntentReject) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.kt index 070c57939..3efb5401f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ReceivedPrivateMessageLocalNotification.kt @@ -44,7 +44,7 @@ class ReceivedPrivateMessageLocalNotification(context: Context, identifier: Stri context.getString( R.string.inbox_messages_title, oldMessages.size, - data["senderName"], + data["senderName"] ) } else { context.getString(R.string.inbox_messages_title_nosender, oldMessages.size) @@ -60,8 +60,8 @@ class ReceivedPrivateMessageLocalNotification(context: Context, identifier: Stri notification.setContentTitle( context.getString( R.string.inbox_messages_title_single, - data["senderName"], - ), + data["senderName"] + ) ) } return notification @@ -79,7 +79,7 @@ class ReceivedPrivateMessageLocalNotification(context: Context, identifier: Stri override fun setNotificationActions( notificationId: Int, - data: Map, + data: Map ) { super.setNotificationActions(notificationId, data) val senderID = data["replyTo"] ?: return @@ -100,14 +100,14 @@ class ReceivedPrivateMessageLocalNotification(context: Context, identifier: Stri context, senderID.hashCode(), intent, - withMutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withMutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) val action: NotificationCompat.Action = NotificationCompat.Action.Builder( R.drawable.ic_send_grey_600_24dp, context.getString(R.string.reply), - replyPendingIntent, + replyPendingIntent ) .addRemoteInput(remoteInput) .build() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/BuyRewardUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/BuyRewardUseCase.kt index 953038c92..b74355013 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/BuyRewardUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/BuyRewardUseCase.kt @@ -8,27 +8,27 @@ import com.habitrpg.shared.habitica.models.responses.TaskScoringResult import javax.inject.Inject class BuyRewardUseCase - @Inject - constructor( - private val taskRepository: TaskRepository, - private val soundManager: SoundManager, - ) : UseCase() { - override suspend fun run(requestValues: RequestValues): TaskScoringResult? { - val response = - taskRepository.taskChecked( - requestValues.user, - requestValues.task, - false, - false, - requestValues.notifyFunc, - ) - soundManager.loadAndPlayAudio(SoundManager.SOUND_REWARD) - return response - } - - class RequestValues( - internal val user: User?, - val task: Task, - val notifyFunc: (TaskScoringResult) -> Unit, - ) : UseCase.RequestValues +@Inject +constructor( + private val taskRepository: TaskRepository, + private val soundManager: SoundManager +) : UseCase() { + override suspend fun run(requestValues: RequestValues): TaskScoringResult? { + val response = + taskRepository.taskChecked( + requestValues.user, + requestValues.task, + false, + false, + requestValues.notifyFunc + ) + soundManager.loadAndPlayAudio(SoundManager.SOUND_REWARD) + return response } + + class RequestValues( + internal val user: User?, + val task: Task, + val notifyFunc: (TaskScoringResult) -> Unit + ) : UseCase.RequestValues +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/CheckClassSelectionUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/CheckClassSelectionUseCase.kt index 9c3a8822d..e1b3d5c5e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/CheckClassSelectionUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/CheckClassSelectionUseCase.kt @@ -8,45 +8,45 @@ import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity import javax.inject.Inject class CheckClassSelectionUseCase - @Inject - constructor() : +@Inject +constructor() : UseCase() { - override suspend fun run(requestValues: RequestValues) { - val user = requestValues.user - if (requestValues.currentClass == null) { - if ((user?.stats?.lvl ?: 0) >= 9 && - user?.preferences?.disableClasses != true && - user?.flags?.classSelected != true - ) { - displayClassSelectionActivity(false, null, requestValues.activity) - } - } else { - displayClassSelectionActivity( - requestValues.isClassSelected, - requestValues.currentClass, - requestValues.activity, - ) + override suspend fun run(requestValues: RequestValues) { + val user = requestValues.user + if (requestValues.currentClass == null) { + if ((user?.stats?.lvl ?: 0) >= 9 && + user?.preferences?.disableClasses != true && + user?.flags?.classSelected != true + ) { + displayClassSelectionActivity(false, null, requestValues.activity) } + } else { + displayClassSelectionActivity( + requestValues.isClassSelected, + requestValues.currentClass, + requestValues.activity + ) } - - private fun displayClassSelectionActivity( - isClassSelected: Boolean, - currentClass: String?, - activity: Activity, - ) { - val bundle = Bundle() - bundle.putBoolean("isClassSelected", isClassSelected) - bundle.putString("currentClass", currentClass) - - val intent = Intent(activity, ClassSelectionActivity::class.java) - intent.putExtras(bundle) - activity.startActivity(intent) - } - - class RequestValues( - val user: User?, - val isClassSelected: Boolean, - val currentClass: String?, - val activity: Activity, - ) : UseCase.RequestValues } + + private fun displayClassSelectionActivity( + isClassSelected: Boolean, + currentClass: String?, + activity: Activity + ) { + val bundle = Bundle() + bundle.putBoolean("isClassSelected", isClassSelected) + bundle.putString("currentClass", currentClass) + + val intent = Intent(activity, ClassSelectionActivity::class.java) + intent.putExtras(bundle) + activity.startActivity(intent) + } + + class RequestValues( + val user: User?, + val isClassSelected: Boolean, + val currentClass: String?, + val activity: Activity + ) : UseCase.RequestValues +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/DisplayItemDropUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/DisplayItemDropUseCase.kt index db315a1a9..911fc2790 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/DisplayItemDropUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/DisplayItemDropUseCase.kt @@ -13,44 +13,44 @@ import kotlinx.coroutines.launch import javax.inject.Inject class DisplayItemDropUseCase - @Inject - constructor(private val soundManager: SoundManager) : +@Inject +constructor(private val soundManager: SoundManager) : UseCase() { - override suspend fun run(requestValues: RequestValues) { - val data = requestValues.data - val snackbarText = StringBuilder(data?.drop?.dialog ?: "") - - if ((data?.questItemsFound ?: 0) > 0 && requestValues.showQuestItems) { - if (snackbarText.isNotEmpty()) { - snackbarText.append('\n') - } - snackbarText.append( - requestValues.context.getString( - R.string.quest_items_found, - data!!.questItemsFound, - ), - ) - } + override suspend fun run(requestValues: RequestValues) { + val data = requestValues.data + val snackbarText = StringBuilder(data?.drop?.dialog ?: "") + if ((data?.questItemsFound ?: 0) > 0 && requestValues.showQuestItems) { if (snackbarText.isNotEmpty()) { - MainScope().launch(context = Dispatchers.Main) { - delay(3000L) - HabiticaSnackbar.showSnackbar( - requestValues.snackbarTargetView, - snackbarText, - HabiticaSnackbar.SnackbarDisplayType.DROP, - true, - ) - soundManager.loadAndPlayAudio(SoundManager.SOUND_ITEM_DROP) - } + snackbarText.append('\n') } - return + snackbarText.append( + requestValues.context.getString( + R.string.quest_items_found, + data!!.questItemsFound + ) + ) } - class RequestValues( - val data: TaskScoringResult?, - val context: AppCompatActivity, - val snackbarTargetView: ViewGroup, - val showQuestItems: Boolean, - ) : UseCase.RequestValues + if (snackbarText.isNotEmpty()) { + MainScope().launch(context = Dispatchers.Main) { + delay(3000L) + HabiticaSnackbar.showSnackbar( + requestValues.snackbarTargetView, + snackbarText, + HabiticaSnackbar.SnackbarDisplayType.DROP, + true + ) + soundManager.loadAndPlayAudio(SoundManager.SOUND_ITEM_DROP) + } + } + return } + + class RequestValues( + val data: TaskScoringResult?, + val context: AppCompatActivity, + val snackbarTargetView: ViewGroup, + val showQuestItems: Boolean + ) : UseCase.RequestValues +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/FeedPetUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/FeedPetUseCase.kt index a11dc9005..209ad53aa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/FeedPetUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/FeedPetUseCase.kt @@ -22,64 +22,64 @@ import kotlinx.coroutines.MainScope import javax.inject.Inject class FeedPetUseCase - @Inject - constructor( - private val inventoryRepository: InventoryRepository, - ) : UseCase() { - override suspend fun run(requestValues: RequestValues): FeedResponse? { - val feedResponse = inventoryRepository.feedPet(requestValues.pet, requestValues.food) - (requestValues.context as? SnackbarActivity)?.showSnackbar(content = feedResponse?.message) - if (feedResponse?.value == -1) { - val mountWrapper = MountImageviewBinding.inflate(requestValues.context.layoutInflater) +@Inject +constructor( + private val inventoryRepository: InventoryRepository +) : UseCase() { + override suspend fun run(requestValues: RequestValues): FeedResponse? { + val feedResponse = inventoryRepository.feedPet(requestValues.pet, requestValues.food) + (requestValues.context as? SnackbarActivity)?.showSnackbar(content = feedResponse?.message) + if (feedResponse?.value == -1) { + val mountWrapper = MountImageviewBinding.inflate(requestValues.context.layoutInflater) - mountWrapper.mountImageview.setMount(requestValues.pet.key) - val currentActivity = - HabiticaBaseApplication.getInstance(requestValues.context)?.currentActivity?.get() - val dialog = HabiticaAlertDialog(requestValues.context) - if (currentActivity != null) { - mountWrapper.backgroundView.setContent { - HabiticaTheme { - BackgroundScene(Modifier.clip(HabiticaTheme.shapes.large)) - } - } - dialog.window?.let { - mountWrapper.root.setViewTreeSavedStateRegistryOwner(currentActivity) - it.decorView.setViewTreeSavedStateRegistryOwner(currentActivity) - mountWrapper.root.setViewTreeLifecycleOwner(currentActivity) - it.decorView.setViewTreeLifecycleOwner(currentActivity) + mountWrapper.mountImageview.setMount(requestValues.pet.key) + val currentActivity = + HabiticaBaseApplication.getInstance(requestValues.context)?.currentActivity?.get() + val dialog = HabiticaAlertDialog(requestValues.context) + if (currentActivity != null) { + mountWrapper.backgroundView.setContent { + HabiticaTheme { + BackgroundScene(Modifier.clip(HabiticaTheme.shapes.large)) } } - dialog.setTitle( - requestValues.context.getString( - R.string.evolved_pet_title, - requestValues.pet.text, - ), - ) - dialog.isCelebratory = true - dialog.setAdditionalContentView(mountWrapper.root) - dialog.addButton(R.string.onwards, true) - dialog.addButton(R.string.share, false) { hatchingDialog, _ -> - val message = - requestValues.context.getString( - R.string.share_raised, - requestValues.pet.text, - ) - MainScope().launchCatching { - ShareMountUseCase().callInteractor( - ShareMountUseCase.RequestValues( - requestValues.pet.key, - message, - requestValues.context, - ), - ) - } - hatchingDialog.dismiss() + dialog.window?.let { + mountWrapper.root.setViewTreeSavedStateRegistryOwner(currentActivity) + it.decorView.setViewTreeSavedStateRegistryOwner(currentActivity) + mountWrapper.root.setViewTreeLifecycleOwner(currentActivity) + it.decorView.setViewTreeLifecycleOwner(currentActivity) } - dialog.enqueue() } - return feedResponse + dialog.setTitle( + requestValues.context.getString( + R.string.evolved_pet_title, + requestValues.pet.text + ) + ) + dialog.isCelebratory = true + dialog.setAdditionalContentView(mountWrapper.root) + dialog.addButton(R.string.onwards, true) + dialog.addButton(R.string.share, false) { hatchingDialog, _ -> + val message = + requestValues.context.getString( + R.string.share_raised, + requestValues.pet.text + ) + MainScope().launchCatching { + ShareMountUseCase().callInteractor( + ShareMountUseCase.RequestValues( + requestValues.pet.key, + message, + requestValues.context + ) + ) + } + hatchingDialog.dismiss() + } + dialog.enqueue() } - - class RequestValues(val pet: Pet, val food: Food, val context: Context) : - UseCase.RequestValues + return feedResponse } + + class RequestValues(val pet: Pet, val food: Food, val context: Context) : + UseCase.RequestValues +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/HatchPetUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/HatchPetUseCase.kt index 92ab251a5..4e11d4a8a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/HatchPetUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/HatchPetUseCase.kt @@ -23,71 +23,71 @@ import kotlinx.coroutines.MainScope import javax.inject.Inject class HatchPetUseCase - @Inject - constructor( - private val inventoryRepository: InventoryRepository, - ) : UseCase() { - override suspend fun run(requestValues: RequestValues): Items? { - return inventoryRepository.hatchPet(requestValues.egg, requestValues.potion) { - val petWrapper = PetImageviewBinding.inflate(requestValues.context.layoutInflater) - val petKey = requestValues.egg.key + "-" + requestValues.potion.key - petWrapper.petImageview.loadImage("stable_Pet-$petKey") - val potionName = requestValues.potion.text - val eggName = requestValues.egg.text - val currentActivity = - HabiticaBaseApplication.getInstance(requestValues.context)?.currentActivity?.get() - val dialog = HabiticaAlertDialog(requestValues.context) - if (currentActivity != null) { - petWrapper.backgroundView.setContent { - HabiticaTheme { - BackgroundScene(Modifier.clip(HabiticaTheme.shapes.large)) - } - } - dialog.window?.let { - petWrapper.root.setViewTreeSavedStateRegistryOwner(currentActivity) - it.decorView.setViewTreeSavedStateRegistryOwner(currentActivity) - petWrapper.root.setViewTreeLifecycleOwner(currentActivity) - it.decorView.setViewTreeLifecycleOwner(currentActivity) +@Inject +constructor( + private val inventoryRepository: InventoryRepository +) : UseCase() { + override suspend fun run(requestValues: RequestValues): Items? { + return inventoryRepository.hatchPet(requestValues.egg, requestValues.potion) { + val petWrapper = PetImageviewBinding.inflate(requestValues.context.layoutInflater) + val petKey = requestValues.egg.key + "-" + requestValues.potion.key + petWrapper.petImageview.loadImage("stable_Pet-$petKey") + val potionName = requestValues.potion.text + val eggName = requestValues.egg.text + val currentActivity = + HabiticaBaseApplication.getInstance(requestValues.context)?.currentActivity?.get() + val dialog = HabiticaAlertDialog(requestValues.context) + if (currentActivity != null) { + petWrapper.backgroundView.setContent { + HabiticaTheme { + BackgroundScene(Modifier.clip(HabiticaTheme.shapes.large)) } } - dialog.isCelebratory = true - dialog.setTitle( - requestValues.context.getString( - R.string.hatched_pet_title, - potionName, - eggName, - ), - ) - dialog.setAdditionalContentView(petWrapper.root) - dialog.addButton(R.string.equip, true) { _, _ -> - MainScope().launchCatching { - inventoryRepository.equip( - "pet", - requestValues.egg.key + "-" + requestValues.potion.key, - ) - } + dialog.window?.let { + petWrapper.root.setViewTreeSavedStateRegistryOwner(currentActivity) + it.decorView.setViewTreeSavedStateRegistryOwner(currentActivity) + petWrapper.root.setViewTreeLifecycleOwner(currentActivity) + it.decorView.setViewTreeLifecycleOwner(currentActivity) } - dialog.addButton(R.string.share, false) { hatchingDialog, _ -> - MainScope().launchCatching { - SharePetUseCase().callInteractor( - SharePetUseCase.RequestValues( - petKey, - requestValues.context.getString( - R.string.share_hatched, - potionName, - eggName, - ), - requestValues.context, - ), - ) - } - hatchingDialog.dismiss() - } - dialog.setExtraCloseButtonVisibility(View.VISIBLE) - dialog.enqueue() } + dialog.isCelebratory = true + dialog.setTitle( + requestValues.context.getString( + R.string.hatched_pet_title, + potionName, + eggName + ) + ) + dialog.setAdditionalContentView(petWrapper.root) + dialog.addButton(R.string.equip, true) { _, _ -> + MainScope().launchCatching { + inventoryRepository.equip( + "pet", + requestValues.egg.key + "-" + requestValues.potion.key + ) + } + } + dialog.addButton(R.string.share, false) { hatchingDialog, _ -> + MainScope().launchCatching { + SharePetUseCase().callInteractor( + SharePetUseCase.RequestValues( + petKey, + requestValues.context.getString( + R.string.share_hatched, + potionName, + eggName + ), + requestValues.context + ) + ) + } + hatchingDialog.dismiss() + } + dialog.setExtraCloseButtonVisibility(View.VISIBLE) + dialog.enqueue() } - - class RequestValues(val potion: HatchingPotion, val egg: Egg, val context: Context) : - UseCase.RequestValues } + + class RequestValues(val potion: HatchingPotion, val egg: Egg, val context: Context) : + UseCase.RequestValues +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/InsufficientGemsUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/InsufficientGemsUseCase.kt index 4acc149a0..fd396dabd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/InsufficientGemsUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/InsufficientGemsUseCase.kt @@ -7,21 +7,21 @@ import com.habitrpg.android.habitica.ui.activities.MainActivity import javax.inject.Inject class InsufficientGemsUseCase - @Inject - constructor( - private val purchaseHandler: PurchaseHandler, - ) : UseCase() { - override suspend fun run(requestValues: RequestValues) { - val activity = requestValues.activity as? MainActivity ?: return - val gemSku = - if (requestValues.gemPrice > 4) { - PurchaseTypes.PURCHASE_21_GEMS - } else { - PurchaseTypes.PURCHASE_4_GEMS - } - val sku = purchaseHandler.getInAppPurchaseSKU(gemSku) ?: return - purchaseHandler.purchase(activity, sku) - } - - class RequestValues(val gemPrice: Int, val activity: Activity) : UseCase.RequestValues +@Inject +constructor( + private val purchaseHandler: PurchaseHandler +) : UseCase() { + override suspend fun run(requestValues: RequestValues) { + val activity = requestValues.activity as? MainActivity ?: return + val gemSku = + if (requestValues.gemPrice > 4) { + PurchaseTypes.PURCHASE_21_GEMS + } else { + PurchaseTypes.PURCHASE_4_GEMS + } + val sku = purchaseHandler.getInAppPurchaseSKU(gemSku) ?: return + purchaseHandler.purchase(activity, sku) } + + class RequestValues(val gemPrice: Int, val activity: Activity) : UseCase.RequestValues +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/LevelUpUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/LevelUpUseCase.kt index 2c6da2244..d91285618 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/LevelUpUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/LevelUpUseCase.kt @@ -16,116 +16,116 @@ import kotlinx.coroutines.MainScope import javax.inject.Inject class LevelUpUseCase - @Inject - constructor( - private val soundManager: SoundManager, - private val checkClassSelectionUseCase: CheckClassSelectionUseCase, - ) : UseCase() { - override suspend fun run(requestValues: RequestValues): Stats? { - soundManager.loadAndPlayAudio(SoundManager.SOUND_LEVEL_UP) - val suppressedModals = requestValues.user.preferences?.suppressModals +@Inject +constructor( + private val soundManager: SoundManager, + private val checkClassSelectionUseCase: CheckClassSelectionUseCase +) : UseCase() { + override suspend fun run(requestValues: RequestValues): Stats? { + soundManager.loadAndPlayAudio(SoundManager.SOUND_LEVEL_UP) + val suppressedModals = requestValues.user.preferences?.suppressModals - if (requestValues.newLevel == 10) { - val binding = DialogLevelup10Binding.inflate(requestValues.activity.layoutInflater) - binding.healerIconView.setImageBitmap(HabiticaIconsHelper.imageOfHealerLightBg()) - binding.mageIconView.setImageBitmap(HabiticaIconsHelper.imageOfMageLightBg()) - binding.rogueIconView.setImageBitmap(HabiticaIconsHelper.imageOfRogueLightBg()) - binding.warriorIconView.setImageBitmap(HabiticaIconsHelper.imageOfWarriorLightBg()) + if (requestValues.newLevel == 10) { + val binding = DialogLevelup10Binding.inflate(requestValues.activity.layoutInflater) + binding.healerIconView.setImageBitmap(HabiticaIconsHelper.imageOfHealerLightBg()) + binding.mageIconView.setImageBitmap(HabiticaIconsHelper.imageOfMageLightBg()) + binding.rogueIconView.setImageBitmap(HabiticaIconsHelper.imageOfRogueLightBg()) + binding.warriorIconView.setImageBitmap(HabiticaIconsHelper.imageOfWarriorLightBg()) - val alert = HabiticaAlertDialog(requestValues.activity) - alert.setTitle( - requestValues.activity.getString( - R.string.levelup_header, - requestValues.newLevel, - ), + val alert = HabiticaAlertDialog(requestValues.activity) + alert.setTitle( + requestValues.activity.getString( + R.string.levelup_header, + requestValues.newLevel ) - alert.setAdditionalContentView(binding.root) - alert.addButton(R.string.select_class, true) { _, _ -> - MainScope().launchCatching { - showClassSelection(requestValues) - } - } - alert.addButton(R.string.not_now, false) - alert.isCelebratory = true - - if (!requestValues.activity.isFinishing) { - alert.enqueue() - } - } else { - if (suppressedModals?.levelUp == true) { - HabiticaSnackbar.showSnackbar( - requestValues.snackbarTargetView, - requestValues.activity.getString( - R.string.levelup_header, - requestValues.newLevel, - ), - HabiticaSnackbar.SnackbarDisplayType.SUCCESS, - true, - ) - return requestValues.user.stats - } - val customView = - requestValues.activity.layoutInflater.inflate(R.layout.dialog_levelup, null) - if (customView != null) { - val dialogAvatarView = customView.findViewById(R.id.avatarView) - dialogAvatarView.setAvatar(requestValues.user) - } - - val alert = HabiticaAlertDialog(requestValues.activity) - alert.setTitle( - requestValues.activity.getString( - R.string.levelup_header, - requestValues.newLevel, - ), - ) - alert.setAdditionalContentView(customView) - alert.addButton(R.string.onwards, true) { _, _ -> - MainScope().launchCatching { - showClassSelection(requestValues) - } - } - alert.addButton(R.string.share, false) { _, _ -> - MainScope().launchCatching { - val usecase = ShareAvatarUseCase() - usecase.callInteractor( - ShareAvatarUseCase.RequestValues( - requestValues.activity, - requestValues.user, - requestValues.activity.getString( - R.string.share_levelup, - requestValues.newLevel, - ), - "levelup", - ), - ) - } - } - alert.isCelebratory = true - - if (!requestValues.activity.isFinishing) { - alert.enqueue() + ) + alert.setAdditionalContentView(binding.root) + alert.addButton(R.string.select_class, true) { _, _ -> + MainScope().launchCatching { + showClassSelection(requestValues) } } - return requestValues.user.stats - } + alert.addButton(R.string.not_now, false) + alert.isCelebratory = true - private suspend fun showClassSelection(requestValues: RequestValues) { - checkClassSelectionUseCase.callInteractor( - CheckClassSelectionUseCase.RequestValues( - requestValues.user, - true, - null, - requestValues.activity, - ), + if (!requestValues.activity.isFinishing) { + alert.enqueue() + } + } else { + if (suppressedModals?.levelUp == true) { + HabiticaSnackbar.showSnackbar( + requestValues.snackbarTargetView, + requestValues.activity.getString( + R.string.levelup_header, + requestValues.newLevel + ), + HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + true + ) + return requestValues.user.stats + } + val customView = + requestValues.activity.layoutInflater.inflate(R.layout.dialog_levelup, null) + if (customView != null) { + val dialogAvatarView = customView.findViewById(R.id.avatarView) + dialogAvatarView.setAvatar(requestValues.user) + } + + val alert = HabiticaAlertDialog(requestValues.activity) + alert.setTitle( + requestValues.activity.getString( + R.string.levelup_header, + requestValues.newLevel + ) ) - } + alert.setAdditionalContentView(customView) + alert.addButton(R.string.onwards, true) { _, _ -> + MainScope().launchCatching { + showClassSelection(requestValues) + } + } + alert.addButton(R.string.share, false) { _, _ -> + MainScope().launchCatching { + val usecase = ShareAvatarUseCase() + usecase.callInteractor( + ShareAvatarUseCase.RequestValues( + requestValues.activity, + requestValues.user, + requestValues.activity.getString( + R.string.share_levelup, + requestValues.newLevel + ), + "levelup" + ) + ) + } + } + alert.isCelebratory = true - class RequestValues( - val user: User, - val level: Int?, - val activity: BaseActivity, - val snackbarTargetView: ViewGroup, - ) : UseCase.RequestValues { - val newLevel: Int = level ?: 0 + if (!requestValues.activity.isFinishing) { + alert.enqueue() + } } + return requestValues.user.stats } + + private suspend fun showClassSelection(requestValues: RequestValues) { + checkClassSelectionUseCase.callInteractor( + CheckClassSelectionUseCase.RequestValues( + requestValues.user, + true, + null, + requestValues.activity + ) + ) + } + + class RequestValues( + val user: User, + val level: Int?, + val activity: BaseActivity, + val snackbarTargetView: ViewGroup + ) : UseCase.RequestValues { + val newLevel: Int = level ?: 0 + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/NotifyUserUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/NotifyUserUseCase.kt index 866df6fcf..5eda77fc6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/NotifyUserUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/NotifyUserUseCase.kt @@ -24,187 +24,187 @@ import javax.inject.Inject import kotlin.math.abs class NotifyUserUseCase - @Inject - constructor( - private val levelUpUseCase: LevelUpUseCase, - private val userRepository: UserRepository, - ) : UseCase() { - override suspend fun run(requestValues: RequestValues): Stats? { - if (requestValues.user == null) { - return null - } - val pair = - getNotificationAndAddStatsToUser( - requestValues.context, - requestValues.xp, - requestValues.hp, - requestValues.gold, - requestValues.mp, - requestValues.questDamage, +@Inject +constructor( + private val levelUpUseCase: LevelUpUseCase, + private val userRepository: UserRepository +) : UseCase() { + override suspend fun run(requestValues: RequestValues): Stats? { + if (requestValues.user == null) { + return null + } + val pair = + getNotificationAndAddStatsToUser( + requestValues.context, + requestValues.xp, + requestValues.hp, + requestValues.gold, + requestValues.mp, + requestValues.questDamage, + requestValues.user + ) + val view = pair.first + val type = pair.second + if (view != null && type != null) { + HabiticaSnackbar.showSnackbar(requestValues.snackbarTargetView, null, null, view, type) + } + if (requestValues.hasLeveledUp == true) { + levelUpUseCase.callInteractor( + LevelUpUseCase.RequestValues( requestValues.user, + requestValues.level, + requestValues.context, + requestValues.snackbarTargetView ) - val view = pair.first - val type = pair.second - if (view != null && type != null) { - HabiticaSnackbar.showSnackbar(requestValues.snackbarTargetView, null, null, view, type) + ) + userRepository.retrieveUser(true) + } + return requestValues.user.stats + } + + class RequestValues( + val context: BaseActivity, + val snackbarTargetView: ViewGroup, + val user: User?, + val xp: Double?, + val hp: Double?, + val gold: Double?, + val mp: Double?, + val questDamage: Double?, + val hasLeveledUp: Boolean?, + val level: Int? + ) : UseCase.RequestValues + + companion object { + val formatter = + NumberFormat.getInstance().apply { + this.minimumFractionDigits = 0 + this.maximumFractionDigits = 2 } - if (requestValues.hasLeveledUp == true) { - levelUpUseCase.callInteractor( - LevelUpUseCase.RequestValues( - requestValues.user, - requestValues.level, - requestValues.context, - requestValues.snackbarTargetView, - ), + + fun getNotificationAndAddStatsToUser( + context: Context, + xp: Double?, + hp: Double?, + gold: Double?, + mp: Double?, + questDamage: Double?, + user: User? + ): Pair { + var displayType = SnackbarDisplayType.SUCCESS + + val container = LinearLayout(context) + container.orientation = LinearLayout.HORIZONTAL + + if (xp != null && xp > 0) { + container.addView( + createTextView( + context, + xp, + HabiticaIconsHelper.imageOfExperience() + ) ) - userRepository.retrieveUser(true) } - return requestValues.user.stats + if (hp != null && hp != 0.0) { + if (hp < 0) { + displayType = SnackbarDisplayType.FAILURE + } + container.addView( + createTextView( + context, + hp, + HabiticaIconsHelper.imageOfHeartDarkBg() + ) + ) + } + if (gold != null && gold != 0.0) { + container.addView(createTextView(context, gold, HabiticaIconsHelper.imageOfGold())) + if (gold < 0) { + displayType = SnackbarDisplayType.FAILURE + } + } + if (mp != null && mp > 0 && user?.hasClass == true) { + container.addView(createTextView(context, mp, HabiticaIconsHelper.imageOfMagic())) + } + if (questDamage != null && questDamage > 0) { + container.addView( + createTextView( + context, + questDamage, + HabiticaIconsHelper.imageOfDamage() + ) + ) + } + + val childCount = container.childCount + if (childCount == 0) { + return Pair(null, displayType) + } + val padding = context.resources.getDimension(R.dimen.spacing_medium).toInt() + (1 until childCount) + .map { container.getChildAt(it) } + .forEach { it.setPadding(padding, 0, 0, 0) } + + return Pair(container, displayType) } - class RequestValues( - val context: BaseActivity, - val snackbarTargetView: ViewGroup, - val user: User?, - val xp: Double?, - val hp: Double?, - val gold: Double?, - val mp: Double?, - val questDamage: Double?, - val hasLeveledUp: Boolean?, - val level: Int?, - ) : UseCase.RequestValues - - companion object { - val formatter = - NumberFormat.getInstance().apply { - this.minimumFractionDigits = 0 - this.maximumFractionDigits = 2 - } - - fun getNotificationAndAddStatsToUser( - context: Context, - xp: Double?, - hp: Double?, - gold: Double?, - mp: Double?, - questDamage: Double?, - user: User?, - ): Pair { - var displayType = SnackbarDisplayType.SUCCESS - - val container = LinearLayout(context) - container.orientation = LinearLayout.HORIZONTAL - - if (xp != null && xp > 0) { - container.addView( - createTextView( - context, - xp, - HabiticaIconsHelper.imageOfExperience(), - ), - ) - } - if (hp != null && hp != 0.0) { - if (hp < 0) { - displayType = SnackbarDisplayType.FAILURE - } - container.addView( - createTextView( - context, - hp, - HabiticaIconsHelper.imageOfHeartDarkBg(), - ), - ) - } - if (gold != null && gold != 0.0) { - container.addView(createTextView(context, gold, HabiticaIconsHelper.imageOfGold())) - if (gold < 0) { - displayType = SnackbarDisplayType.FAILURE - } - } - if (mp != null && mp > 0 && user?.hasClass == true) { - container.addView(createTextView(context, mp, HabiticaIconsHelper.imageOfMagic())) - } - if (questDamage != null && questDamage > 0) { - container.addView( - createTextView( - context, - questDamage, - HabiticaIconsHelper.imageOfDamage(), - ), - ) - } - - val childCount = container.childCount - if (childCount == 0) { - return Pair(null, displayType) - } - val padding = context.resources.getDimension(R.dimen.spacing_medium).toInt() - (1 until childCount) - .map { container.getChildAt(it) } - .forEach { it.setPadding(padding, 0, 0, 0) } - - return Pair(container, displayType) - } - - private fun createTextView( - context: Context, - value: Double, - icon: Bitmap, - ): View { - val textView = TextView(context) - val iconDrawable = BitmapDrawable(context.resources, icon) - textView.setCompoundDrawablesWithIntrinsicBounds(iconDrawable, null, null, null) - val text: String = - if (value > 0) { - " + " + formatter.format(abs(value)) - } else { - " - " + formatter.format(abs(value)) - } - textView.text = text - textView.gravity = Gravity.CENTER_VERTICAL - textView.setTextColor(ContextCompat.getColor(context, R.color.white)) - return textView - } - - private fun formatValue(value: Double): String { - return if (value >= 0) { + private fun createTextView( + context: Context, + value: Double, + icon: Bitmap + ): View { + val textView = TextView(context) + val iconDrawable = BitmapDrawable(context.resources, icon) + textView.setCompoundDrawablesWithIntrinsicBounds(iconDrawable, null, null, null) + val text: String = + if (value > 0) { " + " + formatter.format(abs(value)) } else { " - " + formatter.format(abs(value)) } - } + textView.text = text + textView.gravity = Gravity.CENTER_VERTICAL + textView.setTextColor(ContextCompat.getColor(context, R.color.white)) + return textView + } - fun getNotificationAndAddStatsToUserAsText( - xp: Double?, - hp: Double?, - gold: Double?, - mp: Double?, - ): Pair { - val builder = SpannableStringBuilder() - var displayType = SnackbarDisplayType.NORMAL - - if (xp != null && xp != 0.0) { - builder.append(formatValue(xp)).append(" Exp") - } - if (hp != null && hp != 0.0) { - if (hp < 0) { - displayType = SnackbarDisplayType.FAILURE - } - builder.append(formatValue(hp)).append(" Health") - } - if (gold != null && gold != 0.0) { - if (gold < 0) { - displayType = SnackbarDisplayType.FAILURE - } - builder.append(formatValue(gold)).append(" Gold") - } - if (mp != null && mp != 0.0) { - builder.append(formatValue(mp)).append(" Exp").append(" Mana") - } - - return Pair(builder, displayType) + private fun formatValue(value: Double): String { + return if (value >= 0) { + " + " + formatter.format(abs(value)) + } else { + " - " + formatter.format(abs(value)) } } + + fun getNotificationAndAddStatsToUserAsText( + xp: Double?, + hp: Double?, + gold: Double?, + mp: Double? + ): Pair { + val builder = SpannableStringBuilder() + var displayType = SnackbarDisplayType.NORMAL + + if (xp != null && xp != 0.0) { + builder.append(formatValue(xp)).append(" Exp") + } + if (hp != null && hp != 0.0) { + if (hp < 0) { + displayType = SnackbarDisplayType.FAILURE + } + builder.append(formatValue(hp)).append(" Health") + } + if (gold != null && gold != 0.0) { + if (gold < 0) { + displayType = SnackbarDisplayType.FAILURE + } + builder.append(formatValue(gold)).append(" Gold") + } + if (mp != null && mp != 0.0) { + builder.append(formatValue(mp)).append(" Exp").append(" Mana") + } + + return Pair(builder, displayType) + } } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ScoreTaskLocallyInteractor.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ScoreTaskLocallyInteractor.kt index 609fb6246..95ffaee66 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ScoreTaskLocallyInteractor.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ScoreTaskLocallyInteractor.kt @@ -18,7 +18,7 @@ class ScoreTaskLocallyInteractor { private fun calculateDelta( task: Task, - direction: TaskDirection, + direction: TaskDirection ): Double { val currentValue = when { @@ -35,7 +35,7 @@ class ScoreTaskLocallyInteractor { nextDelta *= 1 + ( task.checklist?.map { if (it.completed) 1 else 0 }?.reduce { _, _ -> 0 } ?: 0 - ) + ) } } @@ -45,35 +45,35 @@ class ScoreTaskLocallyInteractor { private fun scoreHabit( user: User, task: Task, - direction: TaskDirection, + direction: TaskDirection ) { } private fun scoreDaily( user: User, task: Task, - direction: TaskDirection, + direction: TaskDirection ) { } private fun scoreToDo( user: User, task: Task, - direction: TaskDirection, + direction: TaskDirection ) { } private fun scoreReward( user: User, task: Task, - direction: TaskDirection, + direction: TaskDirection ) { } fun score( user: User, task: Task, - direction: TaskDirection, + direction: TaskDirection ): TaskDirectionData? { return if (task.type == TaskType.HABIT || direction == TaskDirection.UP) { val stats = user.stats ?: return null @@ -121,7 +121,7 @@ class ScoreTaskLocallyInteractor { delta: Double, stats: Stats, computedStats: Stats, - task: Task, + task: Task ) { var conBonus = 1f - ((computedStats.constitution?.toFloat() ?: 0f) / 250f) if (conBonus < 0.1) { @@ -137,13 +137,13 @@ class ScoreTaskLocallyInteractor { stats: Stats, computedStats: Stats, task: Task, - direction: TaskDirection, + direction: TaskDirection ) { val intBonus = 1f + ((computedStats.intelligence?.toFloat() ?: 0f) * 0.025f) result.exp = ( stats.exp ?: 0.0 - ) + (delta * intBonus * task.priority * 6).roundToLong().toDouble() + ) + (delta * intBonus * task.priority * 6).roundToLong().toDouble() val perBonus = 1f + ((computedStats.per?.toFloat() ?: 0f) * 0.02f) val goldMod = delta * task.priority * perBonus diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShareAvatarUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShareAvatarUseCase.kt index 034f08624..60d53147e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShareAvatarUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShareAvatarUseCase.kt @@ -8,32 +8,32 @@ import com.habitrpg.shared.habitica.models.Avatar import javax.inject.Inject class ShareAvatarUseCase - @Inject - constructor() : UseCase() { - override suspend fun run(requestValues: RequestValues) { - val avatarView = - AvatarView( - requestValues.activity, - showBackground = true, - showMount = true, - showPet = true, - ) - avatarView.setAvatar(requestValues.avatar) - var sharedImage: Bitmap? = null - avatarView.onAvatarImageReady { image -> - sharedImage = image?.scale(image.width * 3, image.height * 3, false) - requestValues.activity.shareContent( - requestValues.identifier, - requestValues.message, - sharedImage, - ) - } +@Inject +constructor() : UseCase() { + override suspend fun run(requestValues: RequestValues) { + val avatarView = + AvatarView( + requestValues.activity, + showBackground = true, + showMount = true, + showPet = true + ) + avatarView.setAvatar(requestValues.avatar) + var sharedImage: Bitmap? = null + avatarView.onAvatarImageReady { image -> + sharedImage = image?.scale(image.width * 3, image.height * 3, false) + requestValues.activity.shareContent( + requestValues.identifier, + requestValues.message, + sharedImage + ) } - - class RequestValues( - val activity: BaseActivity, - val avatar: Avatar, - val message: String?, - val identifier: String, - ) : UseCase.RequestValues } + + class RequestValues( + val activity: BaseActivity, + val avatar: Avatar, + val message: String?, + val identifier: String + ) : UseCase.RequestValues +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShareMountUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShareMountUseCase.kt index f308d720a..28a5dc75b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShareMountUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShareMountUseCase.kt @@ -52,7 +52,7 @@ class ShareMountUseCase : UseCase() { Bitmap.createBitmap( width, height, - Bitmap.Config.ARGB_8888, + Bitmap.Config.ARGB_8888 ) val canvas = Canvas(sharedImage) var attempts = 0 @@ -65,9 +65,9 @@ class ShareMountUseCase : UseCase() { mountWrapper.root.draw(canvas) ( (requestValues.context as? BaseActivity) ?: HabiticaBaseApplication.getInstance( - requestValues.context, + requestValues.context )?.currentActivity?.get() - )?.shareContent("pet", requestValues.message, sharedImage) + )?.shareContent("pet", requestValues.message, sharedImage) containerView?.removeView(mountWrapper.root) } // trigger layout diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/SharePetUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/SharePetUseCase.kt index efce3f7c8..d1df0b132 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/SharePetUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/SharePetUseCase.kt @@ -51,7 +51,7 @@ class SharePetUseCase : UseCase() { Bitmap.createBitmap( width, height, - Bitmap.Config.ARGB_8888, + Bitmap.Config.ARGB_8888 ) val canvas = Canvas(sharedImage) var attempts = 0 @@ -63,9 +63,9 @@ class SharePetUseCase : UseCase() { petWrapper.root.draw(canvas) ( (requestValues.context as? BaseActivity) ?: HabiticaBaseApplication.getInstance( - requestValues.context, + requestValues.context )?.currentActivity?.get() - )?.shareContent("pet", requestValues.message, sharedImage) + )?.shareContent("pet", requestValues.message, sharedImage) containerView?.removeView(petWrapper.root) } val m = FrameLayout.LayoutParams(width, height) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShowNotificationInteractor.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShowNotificationInteractor.kt index d19a7900b..6f91d69bf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShowNotificationInteractor.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShowNotificationInteractor.kt @@ -28,7 +28,7 @@ import kotlinx.coroutines.launch class ShowNotificationInteractor( private val activity: Activity, - private val lifecycleScope: LifecycleCoroutineScope, + private val lifecycleScope: LifecycleCoroutineScope ) { fun handleNotification(notification: Notification): Boolean { when (notification.type) { @@ -41,7 +41,7 @@ class ShowNotificationInteractor( Notification.Type.ACHIEVEMENT_GUILD_JOINED.type -> showAchievementDialog(notification) Notification.Type.ACHIEVEMENT_CHALLENGE_JOINED.type -> showAchievementDialog( - notification, + notification ) Notification.Type.ACHIEVEMENT_INVITED_FRIEND.type -> showAchievementDialog(notification) @@ -52,12 +52,12 @@ class ShowNotificationInteractor( Notification.Type.ACHIEVEMENT_JUST_ADD_WATER.type -> showAchievementDialog(notification) Notification.Type.ACHIEVEMENT_LOST_MASTERCLASSER.type -> showAchievementDialog( - notification, + notification ) Notification.Type.ACHIEVEMENT_MIND_OVER_MATTER.type -> showAchievementDialog( - notification, + notification ) Notification.Type.ACHIEVEMENT_DUST_DEVIL.type -> showAchievementDialog(notification) @@ -65,12 +65,12 @@ class ShowNotificationInteractor( Notification.Type.ACHIEVEMENT_MONSTER_MAGUS.type -> showAchievementDialog(notification) Notification.Type.ACHIEVEMENT_UNDEAD_UNDERTAKER.type -> showAchievementDialog( - notification, + notification ) Notification.Type.ACHIEVEMENT_PRIMED_FOR_PAINTING.type -> showAchievementDialog( - notification, + notification ) Notification.Type.ACHIEVEMENT_PEARLY_PRO.type -> showAchievementDialog(notification) @@ -79,18 +79,18 @@ class ShowNotificationInteractor( Notification.Type.ACHIEVEMENT_BUG_BONANZA.type -> showAchievementDialog(notification) Notification.Type.ACHIEVEMENT_BARE_NECESSITIES.type -> showAchievementDialog( - notification, + notification ) Notification.Type.ACHIEVEMENT_FRESHWATER_FRIENDS.type -> showAchievementDialog( - notification, + notification ) Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> showAchievementDialog(notification) Notification.Type.ACHIEVEMENT_ALL_THAT_GLITTERS.type -> showAchievementDialog( - notification, + notification ) Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> showAchievementDialog(notification) @@ -102,7 +102,7 @@ class ShowNotificationInteractor( Notification.Type.ACHIEVEMENT_GENERIC.type -> showAchievementDialog(notification) Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type -> showAchievementDialog( - notification, + notification ) Notification.Type.FIRST_DROP.type -> showFirstDropDialog(notification) @@ -152,7 +152,7 @@ class ShowNotificationInteractor( (activity as? SnackbarActivity)?.showSnackbar( title = notificationData?.message, content = nextUnlockText, - displayType = HabiticaSnackbar.SnackbarDisplayType.BLUE, + displayType = HabiticaSnackbar.SnackbarDisplayType.BLUE ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/CustomizationFilter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/CustomizationFilter.kt index c3bf30ff6..3dc625ec2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/CustomizationFilter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/CustomizationFilter.kt @@ -3,7 +3,7 @@ package com.habitrpg.android.habitica.models data class CustomizationFilter( var onlyPurchased: Boolean = false, var ascending: Boolean = false, - var months: MutableList = mutableListOf(), + var months: MutableList = mutableListOf() ) { val isFiltering: Boolean get() { @@ -14,7 +14,7 @@ data class CustomizationFilter( if (other is CustomizationFilter) { return onlyPurchased == other.onlyPurchased && ascending == other.ascending && months.size == other.months.size && months.containsAll( - other.months, + other.months ) } return super.equals(other) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/SetupCustomization.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/SetupCustomization.kt index 8c49152aa..bab85f388 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/SetupCustomization.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/SetupCustomization.kt @@ -13,7 +13,7 @@ class SetupCustomization { fun createSize( key: String, drawableId: Int, - text: String, + text: String ): SetupCustomization { val customization = SetupCustomization() customization.key = key @@ -27,7 +27,7 @@ class SetupCustomization { fun createShirt( key: String, - drawableId: Int, + drawableId: Int ): SetupCustomization { val customization = SetupCustomization() customization.key = key @@ -40,7 +40,7 @@ class SetupCustomization { fun createSkin( key: String, - colorId: Int?, + colorId: Int? ): SetupCustomization { val customization = SetupCustomization() customization.key = key @@ -52,7 +52,7 @@ class SetupCustomization { fun createHairColor( key: String, - colorId: Int?, + colorId: Int? ): SetupCustomization { val customization = SetupCustomization() customization.key = key @@ -65,7 +65,7 @@ class SetupCustomization { fun createHairBangs( key: String, - drawableId: Int?, + drawableId: Int? ): SetupCustomization { val customization = SetupCustomization() customization.key = key @@ -78,7 +78,7 @@ class SetupCustomization { fun createHairPonytail( key: String, - drawableId: Int?, + drawableId: Int? ): SetupCustomization { val customization = SetupCustomization() customization.key = key @@ -91,7 +91,7 @@ class SetupCustomization { fun createGlasses( key: String, - drawableId: Int?, + drawableId: Int? ): SetupCustomization { val customization = SetupCustomization() customization.key = key @@ -104,7 +104,7 @@ class SetupCustomization { fun createFlower( key: String, - drawableId: Int?, + drawableId: Int? ): SetupCustomization { val customization = SetupCustomization() customization.key = key @@ -117,7 +117,7 @@ class SetupCustomization { fun createWheelchair( key: String, - drawableId: Int?, + drawableId: Int? ): SetupCustomization { val customization = SetupCustomization() customization.key = key diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/TutorialStep.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/TutorialStep.kt index 11d05f8fc..71c789f3f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/TutorialStep.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/TutorialStep.kt @@ -27,8 +27,8 @@ open class TutorialStep : RealmObject(), BaseMainObject { this.displayedOn == null || Date().time - ( displayedOn?.time ?: 0 - ) > 86400000 - ) + ) > 86400000 + ) } override val realmClass: Class get() = TutorialStep::class.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Customization.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Customization.kt index 3d4191ffc..88d9af8b1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Customization.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Customization.kt @@ -49,7 +49,7 @@ open class Customization : RealmObject(), BaseObject { fun getIconName( userSize: String?, - hairColor: String?, + hairColor: String? ): String? { if (this.type == "hair" && this.category == "color") { return "icon_color_hair_bangs_1_$identifier" @@ -60,7 +60,7 @@ open class Customization : RealmObject(), BaseObject { fun getImageName( userSize: String?, - hairColor: String?, + hairColor: String? ): String? { if (!this.isValid) { return null @@ -96,7 +96,7 @@ open class Customization : RealmObject(), BaseObject { path + this.customizationSet?.substring( 5, - 7, + 7 ) + this.customizationSet?.substring(0, 4) } else { path + "." + this.customizationSet diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/EquipmentSet.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/EquipmentSet.kt index 3cbd1a65b..35ed4581d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/EquipmentSet.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/EquipmentSet.kt @@ -3,7 +3,7 @@ package com.habitrpg.android.habitica.models.inventory import io.realm.RealmObject import io.realm.annotations.PrimaryKey -open class EquipmentSet: RealmObject() { +open class EquipmentSet : RealmObject() { @PrimaryKey var key: String = "" var text: String = "" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/FallExtraGemsHabiticaPromotion.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/FallExtraGemsHabiticaPromotion.kt index 2fdefa5b2..44c925572 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/FallExtraGemsHabiticaPromotion.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/FallExtraGemsHabiticaPromotion.kt @@ -54,14 +54,14 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic view.setSubtitleImage( ContextCompat.getDrawable( context, - R.drawable.fall_promo_menu_description, - ), + R.drawable.fall_promo_menu_description + ) ) view.setSubtitleText(null) view.setDecoration( ContextCompat.getDrawable(context, R.drawable.fall_promo_menu_left), - ContextCompat.getDrawable(context, R.drawable.fall_promo_menu_right), + ContextCompat.getDrawable(context, R.drawable.fall_promo_menu_right) ) view.binding.button.backgroundTintList = @@ -84,27 +84,27 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic binding.promoBannerLeftImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.fall_promo_banner_left, - ), + R.drawable.fall_promo_banner_left + ) ) binding.promoBannerRightImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.fall_promo_banner_right, - ), + R.drawable.fall_promo_banner_right + ) ) binding.promoBannerTitleImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.fall_promo_title, - ), + R.drawable.fall_promo_title + ) ) val formatter = SimpleDateFormat("MMM d", Locale.getDefault()) binding.promoBannerDurationView.text = context.getString( R.string.x_to_y, formatter.format(startDate), - formatter.format(endDate), + formatter.format(endDate) ) binding.promoBannerDurationView.setTextColor(Color.parseColor("#FEE2B6")) } @@ -115,7 +115,7 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic @SuppressLint("SetTextI18n") override fun configureGemView( binding: PurchaseGemViewBinding, - regularAmount: Int, + regularAmount: Int ) { val context = binding.root.context binding.root.background = promoBackgroundDrawable(context) @@ -156,20 +156,20 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic fragment.binding?.promoBannerLeftImage?.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.fall_promo_info_left, - ), + R.drawable.fall_promo_info_left + ) ) fragment.binding?.promoBannerRightImage?.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.fall_promo_info_right, - ), + R.drawable.fall_promo_info_right + ) ) fragment.binding?.promoBannerTitleImage?.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.fall_promo_title, - ), + R.drawable.fall_promo_title + ) ) fragment.binding?.promoBannerSubtitleView?.setText(R.string.limited_event) fragment.binding?.promoBannerDurationView?.setTextColor(Color.parseColor("#FEE2B6")) @@ -178,13 +178,13 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic context.getString( R.string.x_to_y, formatter.format(startDate), - formatter.format(endDate), + formatter.format(endDate) ) fragment.binding?.promoBannerDurationView?.setTextColor( ContextCompat.getColor( context, - R.color.white, - ), + R.color.white + ) ) fragment.binding?.promptText?.setText(R.string.fall_promo_info_prompt) fragment.binding?.promptText?.setTextColor(Color.parseColor("#F78E2F")) @@ -197,7 +197,7 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic context.getString( R.string.fall_promo_info_instructions, formatter.format(startDate), - formatter.format(endDate), + formatter.format(endDate) ) val limitationsFormatter = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.LONG, SimpleDateFormat.LONG) @@ -209,7 +209,7 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic limitationsFormatter.format(startDate), utcTimeFormatter.format(startDate), limitationsFormatter.format(endDate), - utcTimeFormatter.format(endDate), + utcTimeFormatter.format(endDate) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/GiftOneGetOneHabiticaPromotion.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/GiftOneGetOneHabiticaPromotion.kt index 5b0c8e901..dd9b74608 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/GiftOneGetOneHabiticaPromotion.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/GiftOneGetOneHabiticaPromotion.kt @@ -18,7 +18,6 @@ import com.habitrpg.common.habitica.helpers.MainNavigationController import java.text.SimpleDateFormat import java.util.Date import java.util.Locale -import java.util.TimeZone class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() { override val identifier: String @@ -54,7 +53,7 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic view.setDecoration( ContextCompat.getDrawable(context, R.drawable.g1g1_promo_menu_left), - ContextCompat.getDrawable(context, R.drawable.g1g1_promo_menu_right), + ContextCompat.getDrawable(context, R.drawable.g1g1_promo_menu_right) ) view.binding.button.backgroundTintList = @@ -81,14 +80,14 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic binding.promoBannerLeftImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.g1g1_promo_left, - ), + R.drawable.g1g1_promo_left + ) ) binding.promoBannerRightImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.g1g1_promo_right, - ), + R.drawable.g1g1_promo_right + ) ) binding.promoBannerTitleImage.visibility = View.GONE binding.promoBannerDurationView.visibility = View.GONE @@ -107,14 +106,14 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic binding.content.promoBannerLeftImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.g1g1_promo_left, - ), + R.drawable.g1g1_promo_left + ) ) binding.content.promoBannerRightImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.g1g1_promo_right, - ), + R.drawable.g1g1_promo_right + ) ) binding.content.promoBannerTitleImage.visibility = View.GONE binding.content.promoBannerDurationView.visibility = View.GONE @@ -128,7 +127,7 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic override fun configureGemView( binding: PurchaseGemViewBinding, - regularAmount: Int, + regularAmount: Int ) { } @@ -138,14 +137,14 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic fragment.binding?.promoBannerLeftImage?.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.g1g1_promo_left, - ), + R.drawable.g1g1_promo_left + ) ) fragment.binding?.promoBannerRightImage?.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.g1g1_promo_right, - ), + R.drawable.g1g1_promo_right + ) ) fragment.binding?.promoBannerTitleImage?.visibility = View.GONE fragment.binding?.promoBannerTitleText?.visibility = View.VISIBLE @@ -156,20 +155,20 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic context.getString( R.string.x_to_y, formatter.format(startDate), - formatter.format(endDate), + formatter.format(endDate) ) fragment.binding?.promoBannerDurationView?.setTextColor( ContextCompat.getColor( context, - R.color.white, - ), + R.color.white + ) ) fragment.binding?.promptText?.setText(R.string.g1g1_promo_info_prompt) fragment.binding?.promptText?.setTextColor( ContextCompat.getColor( context, - R.color.text_teal, - ), + R.color.text_teal + ) ) fragment.binding?.promptButton?.background = ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_brand_400) @@ -178,7 +177,7 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic fragment.binding?.promptButton?.setOnClickListener { fragment.context?.let { context -> SubscriptionFragment.showGiftSubscriptionDialog( - context, + context ) } } @@ -191,7 +190,7 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic context.getString( R.string.g1g1_promo_info_limitations_noutc, limitationsFormatter.format(startDate), - limitationsFormatter.format(endDate), + limitationsFormatter.format(endDate) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/HabiticaPromotion.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/HabiticaPromotion.kt index 1fd1895fb..e1fee16a1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/HabiticaPromotion.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/HabiticaPromotion.kt @@ -14,7 +14,7 @@ enum class PromoType { GEMS_AMOUNT, GEMS_PRICE, SUBSCRIPTION, - SURVEY, + SURVEY } abstract class HabiticaPromotion { @@ -50,7 +50,7 @@ abstract class HabiticaPromotion { abstract fun configureGemView( binding: PurchaseGemViewBinding, - regularAmount: Int, + regularAmount: Int ) abstract fun configureInfoFragment(fragment: PromoInfoFragment) @@ -59,19 +59,19 @@ abstract class HabiticaPromotion { fun getHabiticaPromotionFromKey( key: String, startDate: Date?, - endDate: Date?, + endDate: Date? ): HabiticaPromotion? { return when (key) { "fall_extra_gems", "fall2020", "testFall2020" -> FallExtraGemsHabiticaPromotion( startDate, - endDate, + endDate ) "spooky_extra_gems", "fall2020SecondPromo", "spooky2020" -> SpookyExtraGemsHabiticaPromotion( startDate, - endDate, + endDate ) "g1g1" -> GiftOneGetOneHabiticaPromotion(startDate, endDate) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/SpookyExtraGemsHabiticaPromotion.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/SpookyExtraGemsHabiticaPromotion.kt index a0e80477c..4d5519cd2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/SpookyExtraGemsHabiticaPromotion.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/SpookyExtraGemsHabiticaPromotion.kt @@ -55,14 +55,14 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit view.setSubtitleImage( ContextCompat.getDrawable( context, - R.drawable.spooky_promo_menu_description, - ), + R.drawable.spooky_promo_menu_description + ) ) view.setSubtitleText(null) view.setDecoration( ContextCompat.getDrawable(context, R.drawable.spooky_promo_menu_left), - ContextCompat.getDrawable(context, R.drawable.spooky_promo_menu_right), + ContextCompat.getDrawable(context, R.drawable.spooky_promo_menu_right) ) view.binding.button.backgroundTintList = @@ -85,27 +85,27 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit binding.promoBannerLeftImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.spooky_promo_banner_left, - ), + R.drawable.spooky_promo_banner_left + ) ) binding.promoBannerRightImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.spooky_promo_banner_right, - ), + R.drawable.spooky_promo_banner_right + ) ) binding.promoBannerTitleImage.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.spooky_promo_title, - ), + R.drawable.spooky_promo_title + ) ) val formatter = SimpleDateFormat("MMM d", Locale.getDefault()) binding.promoBannerDurationView.text = context.getString( R.string.x_to_y, formatter.format(startDate), - formatter.format(endDate), + formatter.format(endDate) ) binding.promoBannerDurationView.setTextColor(ContextCompat.getColor(context, R.color.white)) } @@ -116,7 +116,7 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit @SuppressLint("SetTextI18n") override fun configureGemView( binding: PurchaseGemViewBinding, - regularAmount: Int, + regularAmount: Int ) { val context = binding.root.context binding.root.background = promoBackgroundDrawable(context) @@ -157,47 +157,47 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit fragment.binding?.promoBannerLeftImage?.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.spooky_promo_info_left, - ), + R.drawable.spooky_promo_info_left + ) ) fragment.binding?.promoBannerRightImage?.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.spooky_promo_info_right, - ), + R.drawable.spooky_promo_info_right + ) ) fragment.binding?.promoBannerTitleImage?.setImageDrawable( ContextCompat.getDrawable( context, - R.drawable.spooky_promo_title, - ), + R.drawable.spooky_promo_title + ) ) fragment.binding?.promoBannerSubtitleView?.setText(R.string.limited_event) fragment.binding?.promoBannerDurationView?.setTextColor( ContextCompat.getColor( context, - R.color.white, - ), + R.color.white + ) ) val formatter = SimpleDateFormat("MMM d", Locale.getDefault()) fragment.binding?.promoBannerDurationView?.text = context.getString( R.string.x_to_y, formatter.format(startDate), - formatter.format(endDate), + formatter.format(endDate) ) fragment.binding?.promoBannerDurationView?.setTextColor( ContextCompat.getColor( context, - R.color.white, - ), + R.color.white + ) ) fragment.binding?.promptText?.setText(R.string.spooky_promo_info_prompt) fragment.binding?.promptText?.setTextColor( ContextCompat.getColor( context, - R.color.orange_50, - ), + R.color.orange_50 + ) ) fragment.binding?.promptButton?.background = buttonDrawable(context) fragment.binding?.promptButton?.setText(R.string.view_gem_bundles) @@ -208,7 +208,7 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit context.getString( R.string.spooky_promo_info_instructions, formatter.format(startDate), - formatter.format(endDate), + formatter.format(endDate) ) val limitationsFormatter = SimpleDateFormat.getDateTimeInstance() val utcTimeFormatter = SimpleDateFormat.getTimeInstance(SimpleDateFormat.LONG) @@ -219,7 +219,7 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit limitationsFormatter.format(startDate), utcTimeFormatter.format(startDate), limitationsFormatter.format(endDate), - utcTimeFormatter.format(endDate), + utcTimeFormatter.format(endDate) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/Survey2021Promotion.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/Survey2021Promotion.kt index 270e15a99..609cfc8b8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/Survey2021Promotion.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/Survey2021Promotion.kt @@ -52,7 +52,7 @@ class Survey2021Promotion : HabiticaPromotion(), HabiticaWebPromotion { view.setDecoration( ContextCompat.getDrawable(context, R.drawable.survey_art_left), - ContextCompat.getDrawable(context, R.drawable.survey_art_right), + ContextCompat.getDrawable(context, R.drawable.survey_art_right) ) view.binding.button.backgroundTintList = @@ -67,7 +67,7 @@ class Survey2021Promotion : HabiticaPromotion(), HabiticaWebPromotion { override fun menuOnNavigation(context: Context) { MainNavigationController.navigate( R.id.promoWebFragment, - PromoWebFragmentArgs.Builder(url ?: "").build().toBundle(), + PromoWebFragmentArgs.Builder(url ?: "").build().toBundle() ) } @@ -79,7 +79,7 @@ class Survey2021Promotion : HabiticaPromotion(), HabiticaWebPromotion { override fun configureGemView( binding: PurchaseGemViewBinding, - regularAmount: Int, + regularAmount: Int ) { } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopCategory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopCategory.kt index 6c7ff09e4..d3f700888 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopCategory.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopCategory.kt @@ -10,6 +10,7 @@ class ShopCategory { var path: String = "" var purchaseAll: Boolean? = null var pinType: String = "" + @SerializedName("end") var endDate: Date? = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItem.kt index db3a3300a..81efddf59 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItem.kt @@ -61,6 +61,7 @@ open class ShopItem : RealmObject(), BaseObject { @SerializedName("lvl") var level: Int? = null var event: ItemEvent? = null + @SerializedName("end") var endDate: Date? = null @@ -94,7 +95,7 @@ open class ShopItem : RealmObject(), BaseObject { fun canAfford( user: User?, - quantity: Int, + quantity: Int ): Boolean = when (currency) { "gold" -> (value * quantity) <= (user?.stats?.gp ?: 0.0) @@ -189,7 +190,7 @@ open class ShopItem : RealmObject(), BaseObject { fun fromCustomization( customization: Customization, userSize: String?, - hairColor: String?, + hairColor: String? ): ShopItem { val item = ShopItem() item.key = customization.identifier ?: "" @@ -214,7 +215,7 @@ open class ShopItem : RealmObject(), BaseObject { set: CustomizationSet, additionalSetItems: List?, userSize: String?, - hairColor: String?, + hairColor: String? ): ShopItem { val item = ShopItem() var path = "" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItemUnlockCondition.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItemUnlockCondition.kt index 308d6c3c4..8a3b1370e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItemUnlockCondition.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItemUnlockCondition.kt @@ -18,7 +18,7 @@ open class ShopItemUnlockCondition : RealmObject(), BaseObject { if (incentiveThreshold != null) { context.getString( R.string.login_incentive_count, - incentiveThreshold, + incentiveThreshold ) } else { context.getString(R.string.login_incentive) @@ -35,7 +35,7 @@ open class ShopItemUnlockCondition : RealmObject(), BaseObject { if (incentiveThreshold != null) { context.getString( R.string.login_incentive_short_count, - incentiveThreshold, + incentiveThreshold ) } else { context.getString(R.string.login_incentive_short) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/ChecklistItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/ChecklistItem.kt index 7d78867e1..2b2ad7164 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/ChecklistItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/ChecklistItem.kt @@ -45,7 +45,7 @@ open class ChecklistItem : RealmObject, BaseMainObject, Parcelable { override fun writeToParcel( dest: Parcel, - flags: Int, + flags: Int ) { dest.writeString(id) dest.writeString(text) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Days.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Days.kt index 0282057ed..9a2c43102 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Days.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Days.kt @@ -21,14 +21,16 @@ open class Days() : io.realm.RealmObject(), Parcelable { var s: Boolean = true var su: Boolean = true - constructor(m: Boolean? = null, + constructor( + m: Boolean? = null, t: Boolean? = null, w: Boolean? = null, th: Boolean? = null, f: Boolean? = null, s: Boolean? = null, su: Boolean? = null, - default: Boolean = true) : this() { + default: Boolean = true + ) : this() { this.m = m ?: default this.t = t ?: default this.w = w ?: default @@ -40,7 +42,7 @@ open class Days() : io.realm.RealmObject(), Parcelable { override fun writeToParcel( dest: Parcel, - flags: Int, + flags: Int ) { dest.writeByte(if (m) 1.toByte() else 0.toByte()) dest.writeByte(if (t) 1.toByte() else 0.toByte()) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/RemindersItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/RemindersItem.kt index d0a2c3b28..b997ca2ff 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/RemindersItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/RemindersItem.kt @@ -28,7 +28,7 @@ open class RemindersItem : RealmObject, Parcelable { override fun writeToParcel( dest: Parcel, - flags: Int, + flags: Int ) { dest.writeString(id) dest.writeString(startDate) @@ -78,7 +78,7 @@ open class RemindersItem : RealmObject, Parcelable { formatter.parseBest( time, ZonedDateTime::from, - LocalDateTime::from, + LocalDateTime::from ) return if (parsed is ZonedDateTime) { parsed @@ -100,7 +100,7 @@ open class RemindersItem : RealmObject, Parcelable { formatter.parseBest( time, ZonedDateTime::from, - LocalDateTime::from, + LocalDateTime::from ) return if (parsed is ZonedDateTime) { parsed.withZoneSameLocal(ZoneId.systemDefault())?.toInstant() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt index b4f5ad8df..60bbf5406 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt @@ -147,7 +147,7 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { fun completeForUser( userID: String?, - completed: Boolean, + completed: Boolean ) { if (isGroupTask && group?.assignedUsersDetail?.isNotEmpty() == true) { group?.assignedUsersDetail?.firstOrNull { it.assignedUserID == userID }?.completed = @@ -183,8 +183,8 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { val streakString: String? get() { return if (counterUp != null && ( - counterUp - ?: 0 + counterUp + ?: 0 ) > 0 && counterDown != null && (counterDown ?: 0) > 0 ) { "+" + counterUp.toString() + " | -" + counterDown?.toString() @@ -368,7 +368,7 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { */ fun getNextReminderOccurrences( remindersItem: RemindersItem?, - occurrences: Int, + occurrences: Int ): List? { if (remindersItem == null) return null @@ -380,8 +380,8 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { if (this.type == TaskType.TODO) { occurrencesList.add( (remindersItem.getZonedDateTime() ?: this.dueDate?.toZonedDateTime())?.withHour( - reminderTime.hour, - )?.withMinute(reminderTime.minute) ?: return null, + reminderTime.hour + )?.withMinute(reminderTime.minute) ?: return null ) return occurrencesList } @@ -418,11 +418,11 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { val todayWithTime = dateTimeOccurenceToSchedule .withHour(reminderTime.hour).withMinute(reminderTime.minute) dateTimeOccurenceToSchedule = if (occurrencesList.isEmpty() && todayWithTime.isAfter(now)) { - todayWithTime - } else { - dateTimeOccurenceToSchedule.plusDays(everyX) - .withHour(reminderTime.hour).withMinute(reminderTime.minute) - } + todayWithTime + } else { + dateTimeOccurenceToSchedule.plusDays(everyX) + .withHour(reminderTime.hour).withMinute(reminderTime.minute) + } dateTimeOccurenceToSchedule } @@ -462,7 +462,7 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { val weeksSinceStart = ChronoUnit.WEEKS.between( startDate.toLocalDate(), - nextDueDate.toLocalDate(), + nextDueDate.toLocalDate() ) if (weeksSinceStart % everyX != 0L) { val weeksToNextValidInterval = everyX - (weeksSinceStart % everyX) @@ -479,7 +479,7 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { } // Set time to the reminder time dateTimeOccurenceToSchedule.withHour(reminderTime.hour) - .withMinute(reminderTime.minute) + .withMinute(reminderTime.minute) } Frequency.MONTHLY -> { @@ -641,7 +641,7 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask { override fun writeToParcel( dest: Parcel, - flags: Int, + flags: Int ) { dest.writeString(this.ownerID) dest.writeValue(this.priority) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlan.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlan.kt index e1d81b326..7ba434182 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlan.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlan.kt @@ -51,7 +51,6 @@ open class SubscriptionPlan : RealmObject(), BaseObject { return totalNumberOfGems - (gemsBought ?: 0) } - val monthsUntilNextHourglass: Int get() { return 1 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt index 05313ec6d..9ad701eeb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt @@ -21,7 +21,7 @@ import java.util.Date enum class Permission { MODERATOR, - USER_SUPPORT, + USER_SUPPORT } open class User : RealmObject(), BaseMainObject, Avatar, VersionedObject { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/UserQuestStatus.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/UserQuestStatus.kt index 39cd6f1e0..7c4a000de 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/UserQuestStatus.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/UserQuestStatus.kt @@ -4,5 +4,5 @@ enum class UserQuestStatus { NO_QUEST, QUEST_COLLECT, QUEST_BOSS, - QUEST_UNKNOWN, + QUEST_UNKNOWN } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.kt index 1499d714a..689e93ca3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.kt @@ -28,7 +28,7 @@ open class ApiModule { fun providesHostConfig( sharedPreferences: SharedPreferences, keyHelper: KeyHelper?, - @ApplicationContext context: Context, + @ApplicationContext context: Context ): HostConfig { return HostConfig(sharedPreferences, keyHelper, context) } @@ -50,14 +50,14 @@ open class ApiModule { gsonConverter: GsonConverterFactory, hostConfig: HostConfig, notificationsManager: NotificationsManager, - @ApplicationContext context: Context, + @ApplicationContext context: Context ): ApiClient { val apiClient = ApiClientImpl( gsonConverter, hostConfig, notificationsManager, - context, + context ) notificationsManager.apiClient = WeakReference(apiClient) return apiClient diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.kt index e830f5ca8..2b6f1dfe2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.kt @@ -32,7 +32,7 @@ class AppModule { @Provides @Singleton fun provideSharedPreferences( - @ApplicationContext context: Context, + @ApplicationContext context: Context ): SharedPreferences { return PreferenceManager.getDefaultSharedPreferences(context) } @@ -59,7 +59,7 @@ class AppModule { fun provideKeyHelper( @ApplicationContext context: Context, sharedPreferences: SharedPreferences, - keyStore: KeyStore?, + keyStore: KeyStore? ): KeyHelper? { return if (keyStore == null) { null @@ -80,14 +80,14 @@ class AppModule { @Provides fun providesResources( - @ApplicationContext context: Context, + @ApplicationContext context: Context ): Resources { return context.resources } @Provides fun providesSoundFileLoader( - @ApplicationContext context: Context, + @ApplicationContext context: Context ): SoundFileLoader { return SoundFileLoader(context) } @@ -97,7 +97,7 @@ class AppModule { fun pushNotificationManager( apiClient: ApiClient, sharedPreferences: SharedPreferences, - @ApplicationContext context: Context, + @ApplicationContext context: Context ): PushNotificationManager { return PushNotificationManager(apiClient, sharedPreferences, context) } @@ -111,7 +111,7 @@ class AppModule { @Provides fun providesReviewManager( @ApplicationContext context: Context, - configManager: AppConfigManager, + configManager: AppConfigManager ): ReviewManager { return ReviewManager(context, configManager) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.kt index 696ed5585..928e692fd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.kt @@ -31,13 +31,13 @@ open class RepositoryModule { contentLocalRepository: ContentLocalRepository, apiClient: ApiClient, @ApplicationContext context: Context, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ): ContentRepository { return ContentRepositoryImpl( contentLocalRepository, apiClient, context, - authenticationHandler, + authenticationHandler ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserModule.kt index 6bb47a744..e05646d13 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserModule.kt @@ -47,7 +47,7 @@ class UserModule { fun providesTaskAlarmManager( @ApplicationContext context: Context, taskRepository: TaskRepository, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ): TaskAlarmManager { return TaskAlarmManager(context, taskRepository, authenticationHandler) } @@ -57,6 +57,6 @@ class UserModule { fun providesUserViewModel( authenticationHandler: AuthenticationHandler, userRepository: UserRepository, - socialRepository: SocialRepository, + socialRepository: SocialRepository ) = MainUserViewModel(authenticationHandler, userRepository, socialRepository) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserRepositoryModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserRepositoryModule.kt index e705899b5..2ddeb11c8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserRepositoryModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserRepositoryModule.kt @@ -56,7 +56,7 @@ import javax.inject.Singleton class UserRepositoryModule { @Provides fun providesSetupCustomizationRepository( - @ApplicationContext context: Context, + @ApplicationContext context: Context ): SetupCustomizationRepository { return SetupCustomizationRepositoryImpl(context) } @@ -71,13 +71,13 @@ class UserRepositoryModule { localRepository: TaskLocalRepository, apiClient: ApiClient, authenticationHandler: AuthenticationHandler, - appConfigManager: AppConfigManager, + appConfigManager: AppConfigManager ): TaskRepository { return TaskRepositoryImpl( localRepository, apiClient, authenticationHandler, - appConfigManager, + appConfigManager ) } @@ -90,7 +90,7 @@ class UserRepositoryModule { fun providesTagRepository( localRepository: TagLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ): TagRepository { return TagRepositoryImpl(localRepository, apiClient, authenticationHandler) } @@ -104,7 +104,7 @@ class UserRepositoryModule { fun providesChallengeRepository( localRepository: ChallengeLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ): ChallengeRepository { return ChallengeRepositoryImpl(localRepository, apiClient, authenticationHandler) } @@ -120,14 +120,14 @@ class UserRepositoryModule { apiClient: ApiClient, authenticationHandler: AuthenticationHandler, taskRepository: TaskRepository, - appConfigManager: AppConfigManager, + appConfigManager: AppConfigManager ): UserRepository { return UserRepositoryImpl( localRepository, apiClient, authenticationHandler, taskRepository, - appConfigManager, + appConfigManager ) } @@ -140,14 +140,14 @@ class UserRepositoryModule { fun providesSocialRepository( localRepository: SocialLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ): SocialRepository { return SocialRepositoryImpl(localRepository, apiClient, authenticationHandler) } @Provides fun providesInventoryLocalRepository( - realm: Realm, + realm: Realm ): InventoryLocalRepository { return RealmInventoryLocalRepository(realm) } @@ -157,13 +157,13 @@ class UserRepositoryModule { localRepository: InventoryLocalRepository, apiClient: ApiClient, authenticationHandler: AuthenticationHandler, - remoteConfig: AppConfigManager, + remoteConfig: AppConfigManager ): InventoryRepository { return InventoryRepositoryImpl( localRepository, apiClient, authenticationHandler, - remoteConfig, + remoteConfig ) } @@ -176,7 +176,7 @@ class UserRepositoryModule { fun providesFAQRepository( localRepository: FAQLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ): FAQRepository { return FAQRepositoryImpl(localRepository, apiClient, authenticationHandler) } @@ -190,7 +190,7 @@ class UserRepositoryModule { fun providesTutorialRepository( localRepository: TutorialLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ): TutorialRepository { return TutorialRepositoryImpl(localRepository, apiClient, authenticationHandler) } @@ -204,7 +204,7 @@ class UserRepositoryModule { fun providesCustomizationRepository( localRepository: CustomizationLocalRepository, apiClient: ApiClient, - authenticationHandler: AuthenticationHandler, + authenticationHandler: AuthenticationHandler ): CustomizationRepository { return CustomizationRepositoryImpl(localRepository, apiClient, authenticationHandler) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/prefs/TimePreference.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/prefs/TimePreference.kt index b12d4fd4a..d9d059c36 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/prefs/TimePreference.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/prefs/TimePreference.kt @@ -14,7 +14,7 @@ class TimePreference(ctxt: Context, attrs: AttributeSet?) : DialogPreference(ctx override fun onGetDefaultValue( a: TypedArray, - index: Int, + index: Int ): Any { return a.getString(index)!! } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt index dde61030d..4a88ea35c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt @@ -32,7 +32,7 @@ class DeviceCommunicationService : WearableListenerService() { private fun openActivity( event: MessageEvent, - activityClass: Class<*>, + activityClass: Class<*> ) { val intent = Intent(this, activityClass) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK @@ -55,7 +55,7 @@ class DeviceCommunicationService : WearableListenerService() { messageClient.sendMessage( event.sourceNodeId, "/auth", - "${hostConfig.userID}:${hostConfig.apiKey}".toByteArray(), + "${hostConfig.userID}:${hostConfig.apiKey}".toByteArray() ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt index e7b6016ac..26d03dd86 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt @@ -48,7 +48,7 @@ class LocalNotificationActionReceiver : BroadcastReceiver() { override fun onReceive( context: Context, - intent: Intent, + intent: Intent ) { this.intent = intent this.context = context @@ -136,7 +136,7 @@ class LocalNotificationActionReceiver : BroadcastReceiver() { it.experienceDelta, it.healthDelta, it.goldDelta, - it.manaDelta, + it.manaDelta ) showToast(pair.first) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.kt index e2b7d66eb..bb52aa381 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.kt @@ -43,7 +43,7 @@ class NotificationPublisher : BroadcastReceiver() { override fun onReceive( context: Context, - intent: Intent, + intent: Intent ) { this.context = context if (!wasInjected) { @@ -74,7 +74,7 @@ class NotificationPublisher : BroadcastReceiver() { if (showNotifications) { notify( intent, - buildNotification(wasInactive, user?.authentication?.timestamps?.createdAt), + buildNotification(wasInactive, user?.authentication?.timestamps?.createdAt) ) } } @@ -85,7 +85,7 @@ class NotificationPublisher : BroadcastReceiver() { private fun notify( intent: Intent, - notification: Notification?, + notification: Notification? ) { val context = context ?: return val notificationManager = NotificationManagerCompat.from(context) @@ -97,7 +97,7 @@ class NotificationPublisher : BroadcastReceiver() { private fun buildNotification( wasInactive: Boolean, - registrationDate: Date? = null, + registrationDate: Date? = null ): Notification? { val thisContext = context ?: return null val notification: Notification @@ -111,11 +111,11 @@ class NotificationPublisher : BroadcastReceiver() { val isSameDay = ( registrationCal.get(Calendar.YEAR) == todayCal.get(Calendar.YEAR) && registrationCal.get(Calendar.DAY_OF_YEAR) == todayCal.get(Calendar.DAY_OF_YEAR) - ) + ) val isPreviousDay = ( registrationCal.get(Calendar.YEAR) == todayCal.get(Calendar.YEAR) && registrationCal.get(Calendar.DAY_OF_YEAR) == (todayCal.get(Calendar.DAY_OF_YEAR) - 1) - ) + ) if (isSameDay) { builder.setContentTitle(thisContext.getString(R.string.same_day_reminder_title)) notificationText = thisContext.getString(R.string.same_day_reminder_text) @@ -142,7 +142,7 @@ class NotificationPublisher : BroadcastReceiver() { thisContext, 0, notificationIntent, - withImmutableFlag(0), + withImmutableFlag(0) ) builder.setContentIntent(intent) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskAlarmBootReceiver.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskAlarmBootReceiver.kt index 18ed98138..9fa4b0dec 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskAlarmBootReceiver.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskAlarmBootReceiver.kt @@ -24,18 +24,19 @@ class TaskAlarmBootReceiver : BroadcastReceiver() { override fun onReceive( context: Context, - intent: Intent, + intent: Intent ) { - if (intent.action != Intent.ACTION_BOOT_COMPLETED - && intent.action != AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED) { + if (intent.action != Intent.ACTION_BOOT_COMPLETED && + intent.action != AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED + ) { return } MainScope().launch(ExceptionHandler.coroutine()) { taskAlarmManager.scheduleAllSavedAlarms( sharedPreferences.getBoolean( "preventDailyReminder", - false, - ), + false + ) ) } HLogger.log(LogLevel.INFO, this::javaClass.name, "onReceive") diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.kt index dfde12b54..108374f21 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.kt @@ -39,7 +39,7 @@ class TaskReceiver : BroadcastReceiver() { override fun onReceive( context: Context, - intent: Intent, + intent: Intent ) { HLogger.log(LogLevel.INFO, this::javaClass.name, "onReceive") val extras = intent.extras @@ -62,7 +62,7 @@ class TaskReceiver : BroadcastReceiver() { private fun createNotification( context: Context, - task: Task, + task: Task ) { val intent = Intent(context, MainActivity::class.java) HLogger.log(LogLevel.INFO, this::javaClass.name, "Create Notification") @@ -73,7 +73,7 @@ class TaskReceiver : BroadcastReceiver() { context, System.currentTimeMillis().toInt(), intent, - withImmutableFlag(0), + withImmutableFlag(0) ) val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) @@ -84,7 +84,7 @@ class TaskReceiver : BroadcastReceiver() { .setContentTitle(task.text) .setStyle( NotificationCompat.BigTextStyle() - .bigText(task.notes), + .bigText(task.notes) ) .setPriority(NotificationCompat.PRIORITY_MAX) .setSound(soundUri) @@ -107,12 +107,12 @@ class TaskReceiver : BroadcastReceiver() { context, task.id.hashCode(), completeIntent, - withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT), + withImmutableFlag(PendingIntent.FLAG_UPDATE_CURRENT) ) notificationBuilder.addAction( 0, context.getString(R.string.complete), - pendingIntentComplete, + pendingIntentComplete ) } val notificationManager = NotificationManagerCompat.from(context) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.kt index b8073ac42..1a121546a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.kt @@ -19,7 +19,7 @@ class GemPurchaseOptionsView(context: Context, attrs: AttributeSet) : FrameLayou attrs, R.styleable.GemPurchaseOptionsView, 0, - 0, + 0 ) binding.gemAmount.text = a.getText(R.styleable.GemPurchaseOptionsView_gemAmount) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/RoundedFrameLayout.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/RoundedFrameLayout.kt index 5a6a2ac6d..15239518c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/RoundedFrameLayout.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/RoundedFrameLayout.kt @@ -9,23 +9,23 @@ import android.widget.FrameLayout import androidx.core.graphics.toRectF class RoundedFrameLayout - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - ) : FrameLayout(context, attrs, defStyleAttr) { - var radius = 4f - var isCirclular = true - val clipPath = Path() - val bounds = Rect() +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout(context, attrs, defStyleAttr) { + var radius = 4f + var isCirclular = true + val clipPath = Path() + val bounds = Rect() - override fun onDraw(canvas: Canvas) { - clipPath.reset() - val radius = if (isCirclular) (height / 2).toFloat() else radius - canvas.getClipBounds(bounds) - clipPath.addRoundRect(bounds.toRectF(), radius, radius, Path.Direction.CW) - canvas.clipPath(clipPath) - super.onDraw(canvas) - } + override fun onDraw(canvas: Canvas) { + clipPath.reset() + val radius = if (isCirclular) (height / 2).toFloat() else radius + canvas.getClipBounds(bounds) + clipPath.addRoundRect(bounds.toRectF(), radius, radius, Path.Direction.CW) + canvas.clipPath(clipPath) + super.onDraw(canvas) } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/SpeechBubbleView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/SpeechBubbleView.kt index afff384cd..0bf89dd0b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/SpeechBubbleView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/SpeechBubbleView.kt @@ -20,7 +20,7 @@ class SpeechBubbleView(context: Context, attrs: AttributeSet) : attrs, R.styleable.SpeechBubbleView, 0, - 0, + 0 ) binding.namePlate.text = attributes.getString(R.styleable.SpeechBubbleView_namePlate) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/TutorialView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/TutorialView.kt index 2e6798a1c..e6617f079 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/TutorialView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/TutorialView.kt @@ -13,7 +13,7 @@ import com.habitrpg.common.habitica.helpers.MainNavigationController class TutorialView( context: Context, val step: TutorialStep, - private val onReaction: OnTutorialReaction, + private val onReaction: OnTutorialReaction ) : FrameLayout(context) { private val binding = OverlayTutorialBinding.inflate(context.layoutInflater, this, true) private var tutorialTexts: List = emptyList() @@ -29,7 +29,7 @@ class TutorialView( override fun showNextStep() { displayNextTutorialText() } - }, + } ) binding.speechBubbleView.binding.completeButton.setOnClickListener { completeButtonClicked() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.kt index e18f1c7a8..aa2274df2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.kt @@ -30,7 +30,7 @@ class AddTaskWidgetActivity : AppCompatActivity() { widgetId = extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID ) } @@ -75,7 +75,7 @@ class AddTaskWidgetActivity : AppCompatActivity() { AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, - AddTaskWidgetProvider::class.java, + AddTaskWidgetProvider::class.java ) intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(widgetId)) sendBroadcast(intent) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt index 6039cecbf..21aab52e0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt @@ -50,7 +50,7 @@ class AdventureGuideActivity : BaseActivity() { Pair("completedTask", getString(R.string.complete_task_title)), Pair("hatchedPet", getString(R.string.hatch_pet_title)), Pair("fedPet", getString(R.string.feedPet_title)), - Pair("purchasedEquipment", getString(R.string.purchase_equipment_title)), + Pair("purchasedEquipment", getString(R.string.purchase_equipment_title)) ) achievementDescriptions = mapOf( @@ -58,7 +58,7 @@ class AdventureGuideActivity : BaseActivity() { Pair("completedTask", getString(R.string.complete_task_description)), Pair("hatchedPet", getString(R.string.hatch_pet_description)), Pair("fedPet", getString(R.string.feedPet_description)), - Pair("purchasedEquipment", getString(R.string.purchase_equipment_description)), + Pair("purchasedEquipment", getString(R.string.purchase_equipment_description)) ) val descriptionText = getString(R.string.adventure_guide_description_new) @@ -95,7 +95,7 @@ class AdventureGuideActivity : BaseActivity() { binding.progressTextview.text = getString( R.string.percent_completed, - ((completed / achievements.size.toFloat()) * 100).toInt(), + ((completed / achievements.size.toFloat()) * 100).toInt() ) } @@ -105,7 +105,7 @@ class AdventureGuideActivity : BaseActivity() { AdventureGuideItemBinding.inflate( layoutInflater, binding.achievementContainer, - true, + true ) itemBinding.titleView.text = achievementTitles[achievement.key] itemBinding.descriptionView.text = achievementDescriptions[achievement.key] @@ -123,27 +123,27 @@ class AdventureGuideActivity : BaseActivity() { itemBinding.titleView.setTextColor( ContextCompat.getColor( this, - R.color.text_ternary, - ), + R.color.text_ternary + ) ) itemBinding.descriptionView.setTextColor( ContextCompat.getColor( this, - R.color.text_ternary, - ), + R.color.text_ternary + ) ) } else { itemBinding.titleView.setTextColor( ContextCompat.getColor( this, - R.color.text_primary, - ), + R.color.text_primary + ) ) itemBinding.descriptionView.setTextColor( ContextCompat.getColor( this, - R.color.text_primary, - ), + R.color.text_primary + ) ) itemBinding.iconView.alpha = 0.5f } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt index 6732640c2..7442c6e7d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt @@ -38,7 +38,6 @@ import kotlinx.coroutines.MainScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch -import java.util.Locale import javax.inject.Inject @AndroidEntryPoint @@ -186,7 +185,7 @@ class ArmoireActivity : BaseActivity() { } subscriptionBottomSheet.show( supportFragmentManager, - EventOutcomeSubscriptionBottomSheetFragment.TAG, + EventOutcomeSubscriptionBottomSheetFragment.TAG ) } @@ -205,19 +204,19 @@ class ArmoireActivity : BaseActivity() { binding.dropRateButtonUnsubbed.setOnClickListener { showDropRateDialog() } - intent.extras?.let { - val args = ArmoireActivityArgs.fromBundle(it) - equipmentKey = args.key - configure(args.type, args.key, args.text, args.value) + intent.extras?.let { + val args = ArmoireActivityArgs.fromBundle(it) + equipmentKey = args.key + configure(args.type, args.key, args.text, args.value) - if (args.type == "gear") { - userViewModel.user.observeOnce(this) { user -> - user?.loginIncentives?.let { totalCheckins -> - reviewManager.requestReview(this@ArmoireActivity, totalCheckins) - } + if (args.type == "gear") { + userViewModel.user.observeOnce(this) { user -> + user?.loginIncentives?.let { totalCheckins -> + reviewManager.requestReview(this@ArmoireActivity, totalCheckins) } } } + } } private fun giveUserArmoire(): Boolean { @@ -268,7 +267,7 @@ class ArmoireActivity : BaseActivity() { buyResponse.armoire["type"] ?: "", buyResponse.armoire["dropKey"] ?: "", buyResponse.armoire["dropText"] ?: "", - buyResponse.armoire["value"] ?: "", + buyResponse.armoire["value"] ?: "" ) hasAnimatedChanges = false gold = null @@ -311,7 +310,7 @@ class ArmoireActivity : BaseActivity() { createParticles(container, R.drawable.confetti_yellow) createParticles(container, R.drawable.confetti_purple) }, - 500, + 500 ) binding.iconView.startAnimation(Animations.bobbingAnimation()) @@ -343,13 +342,13 @@ class ArmoireActivity : BaseActivity() { private fun createParticles( container: FrameLayout, - resource: Int, + resource: Int ) { ParticleSystem( container, 30, ContextCompat.getDrawable(this, resource), - 6000, + 6000 ) .setRotationSpeed(144f) .setScaleRange(1.0f, 1.6f) @@ -362,7 +361,7 @@ class ArmoireActivity : BaseActivity() { type: String, key: String, text: String, - value: String? = "", + value: String? = "" ) { lastType = type lastKey = key diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt index 4bda7572b..63b5e7f64 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt @@ -6,7 +6,6 @@ import android.content.Intent import android.content.SharedPreferences import android.content.res.Configuration import android.graphics.Bitmap -import android.graphics.Color import android.net.Uri import android.os.Build import android.os.Bundle @@ -73,7 +72,7 @@ abstract class BaseActivity : AppCompatActivity() { open fun getContentView(layoutResId: Int? = getLayoutResId()): View { return (getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater).inflate( layoutResId ?: 0, - null, + null ) } @@ -108,7 +107,7 @@ abstract class BaseActivity : AppCompatActivity() { notificationsManager.displayNotificationEvents.collect { if (ShowNotificationInteractor( this@BaseActivity, - lifecycleScope, + lifecycleScope ).handleNotification(it) ) { lifecycleScope.launch(ExceptionHandler.coroutine()) { @@ -149,7 +148,7 @@ abstract class BaseActivity : AppCompatActivity() { internal open fun loadTheme( sharedPreferences: SharedPreferences, - forced: Boolean = false, + forced: Boolean = false ) { val theme = forcedTheme ?: sharedPreferences.getString("theme_name", "purple") if (theme != currentTheme || forced) { @@ -164,7 +163,7 @@ abstract class BaseActivity : AppCompatActivity() { "teal" -> R.style.MainAppTheme_Teal_Dark "blue" -> R.style.MainAppTheme_Blue_Dark else -> R.style.MainAppTheme_Dark - }, + } ) } else { setTheme( @@ -177,7 +176,7 @@ abstract class BaseActivity : AppCompatActivity() { "teal" -> R.style.MainAppTheme_Teal "blue" -> R.style.MainAppTheme_Blue else -> R.style.MainAppTheme - }, + } ) } } @@ -243,7 +242,7 @@ abstract class BaseActivity : AppCompatActivity() { errorCount: Int, title: String?, message: String, - isFromUserInput: Boolean, + isFromUserInput: Boolean ) { val alert = HabiticaAlertDialog(this) alert.setTitle(title) @@ -252,7 +251,7 @@ abstract class BaseActivity : AppCompatActivity() { android.R.string.ok, isPrimary = true, isDestructive = false, - function = null, + function = null ) alert.enqueue() } @@ -263,13 +262,13 @@ abstract class BaseActivity : AppCompatActivity() { fun shareContent( identifier: String, message: String?, - image: Bitmap? = null, + image: Bitmap? = null ) { Analytics.sendEvent( "shared", EventCategory.BEHAVIOUR, HitType.EVENT, - mapOf("identifier" to identifier), + mapOf("identifier" to identifier) ) val sharingIntent = Intent(Intent.ACTION_SEND) sharingIntent.type = "image/*" @@ -287,7 +286,7 @@ abstract class BaseActivity : AppCompatActivity() { contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png") contentValues.put( MediaStore.MediaColumns.RELATIVE_PATH, - Environment.DIRECTORY_PICTURES, + Environment.DIRECTORY_PICTURES ) uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt index 9427d2a8f..fb3af7247 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt @@ -128,7 +128,7 @@ class BirthdayActivity : BaseActivity() { "show insufficient gems modal", EventCategory.BEHAVIOUR, HitType.EVENT, - mapOf("reason" to "birthday"), + mapOf("reason" to "birthday") ) dialog.show() return@launchCatching @@ -138,12 +138,12 @@ class BirthdayActivity : BaseActivity() { dialog.setTitle( getString( R.string.purchase_gryphatrice_confirmation, - 60, - ), + 60 + ) ) dialog.addButton( getString(R.string.buy_for_x, "60 Gems"), - true, + true ) { _, _ -> lifecycleScope.launchCatching { purchaseWithGems() @@ -154,7 +154,7 @@ class BirthdayActivity : BaseActivity() { } dialog.show() } - }, + } ) { lifecycleScope.launchCatching { inventoryRepository.equip("pet", "Gryphatrice-Jubilant") @@ -196,16 +196,16 @@ fun BirthdayTitle(text: String) { Row( verticalAlignment = Alignment.CenterVertically, modifier = - Modifier - .fillMaxWidth() - .padding(top = 20.dp, bottom = 8.dp), + Modifier + .fillMaxWidth() + .padding(top = 20.dp, bottom = 8.dp) ) { Box( modifier = - Modifier - .height(1.dp) - .weight(1f) - .background(colorResource(id = R.color.brand_50)), + Modifier + .height(1.dp) + .weight(1f) + .background(colorResource(id = R.color.brand_50)) ) Image(painterResource(id = R.drawable.birthday_textdeco_left), null) Text( @@ -213,15 +213,15 @@ fun BirthdayTitle(text: String) { fontSize = 16.sp, color = Color.White, fontWeight = FontWeight.Bold, - modifier = Modifier.padding(horizontal = 16.dp), + modifier = Modifier.padding(horizontal = 16.dp) ) Image(painterResource(id = R.drawable.birthday_textdeco_right), null) Box( modifier = - Modifier - .height(1.dp) - .weight(1f) - .background(colorResource(id = R.color.brand_50)), + Modifier + .height(1.dp) + .weight(1f) + .background(colorResource(id = R.color.brand_50)) ) } } @@ -236,7 +236,7 @@ fun BirthdayActivityView( endDate: Date, onPurchaseClick: () -> Unit, onGemPurchaseClick: () -> Unit, - onEquipClick: () -> Unit, + onEquipClick: () -> Unit ) { val activity = LocalContext.current as? Activity val dateFormat = SimpleDateFormat("MMM dd", java.util.Locale.getDefault()) @@ -254,21 +254,20 @@ fun BirthdayActivityView( onDispose {} } - Scaffold( - ) { padding -> + Scaffold() { padding -> Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = - Modifier - .background( - Brush.verticalGradient( - Pair(0.0f, colorResource(id = R.color.brand_300)), - Pair(1.0f, colorResource(id = R.color.brand_200)), - ), + Modifier + .background( + Brush.verticalGradient( + Pair(0.0f, colorResource(id = R.color.brand_300)), + Pair(1.0f, colorResource(id = R.color.brand_200)) ) - .fillMaxWidth() - .verticalScroll(rememberScrollState()) - .padding(padding), + ) + .fillMaxWidth() + .verticalScroll(rememberScrollState()) + .padding(padding) ) { Button( onClick = { @@ -280,57 +279,57 @@ fun BirthdayActivityView( }, colors = ButtonDefaults.textButtonColors(contentColor = textColor), elevation = ButtonDefaults.buttonElevation(0.dp, 0.dp), - modifier = Modifier.align(Alignment.Start), + modifier = Modifier.align(Alignment.Start) ) { Image( painterResource(R.drawable.arrow_back), stringResource(R.string.action_back), colorFilter = - ColorFilter.tint( - textColor, - ), + ColorFilter.tint( + textColor + ) ) } Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = - Modifier - .padding(horizontal = 20.dp) - .fillMaxWidth(), + Modifier + .padding(horizontal = 20.dp) + .fillMaxWidth() ) { Image( painterResource(R.drawable.birthday_header), null, - Modifier.padding(bottom = 8.dp), + Modifier.padding(bottom = 8.dp) ) Row(verticalAlignment = Alignment.CenterVertically) { Image(painterResource(R.drawable.birthday_gifts), null) Column( horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.padding(horizontal = 22.dp), + modifier = Modifier.padding(horizontal = 22.dp) ) { Text( stringResource(id = R.string.limited_event).toUpperCase(Locale.current), fontSize = 12.sp, color = specialTextColor, - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Bold ) Text( stringResource( R.string.x_to_y, dateFormat.format(startDate), - dateFormat.format(endDate), + dateFormat.format(endDate) ), fontSize = 12.sp, color = textColor, - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Bold ) } // right image should be flipped Image( painterResource(id = R.drawable.birthday_gifts), null, - modifier = Modifier.scale(-1f, 1f), + modifier = Modifier.scale(-1f, 1f) ) } Text( @@ -339,27 +338,27 @@ fun BirthdayActivityView( color = specialTextColor, fontWeight = FontWeight.SemiBold, textAlign = TextAlign.Center, - modifier = Modifier.padding(top = 22.dp), + modifier = Modifier.padding(top = 22.dp) ) BirthdayTitle(stringResource(id = R.string.animated_gryphatrice_pet)) Box( contentAlignment = Alignment.Center, modifier = - Modifier - .padding(vertical = 20.dp) - .size(161.dp, 129.dp) - .background(colorResource(R.color.brand_50), RoundedCornerShape(8.dp)), + Modifier + .padding(vertical = 20.dp) + .size(161.dp, 129.dp) + .background(colorResource(R.color.brand_50), RoundedCornerShape(8.dp)) ) { PixelArtView( imageName = "stable_Pet-Gryphatrice-Jubilant", - Modifier.size(104.dp), + Modifier.size(104.dp) ) } Text( stringResource(R.string.limited_edition).toUpperCase(Locale.current), fontSize = 12.sp, color = specialTextColor, - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Bold ) Text( stringResource(R.string.gryphatrice_description), @@ -367,14 +366,14 @@ fun BirthdayActivityView( color = textColor, textAlign = TextAlign.Center, lineHeight = 20.sp, - modifier = Modifier.padding(bottom = 16.dp), + modifier = Modifier.padding(bottom = 16.dp) ) if (hasGryphatrice) { Text( stringResource(R.string.thanks_for_support), fontSize = 12.sp, color = textColor, - fontWeight = FontWeight.SemiBold, + fontWeight = FontWeight.SemiBold ) HabiticaButton( Color.White, @@ -382,11 +381,11 @@ fun BirthdayActivityView( { onEquipClick() }, - modifier = Modifier.padding(top = 20.dp), + modifier = Modifier.padding(top = 20.dp) ) { Text( stringResource(if (hasEquipped) R.string.unequip else R.string.equip), - fontSize = 18.sp, + fontSize = 18.sp ) } } else if (isPurchasing) { @@ -403,7 +402,7 @@ fun BirthdayActivityView( append("60 Gems") } }, - color = Color.White, + color = Color.White ) HabiticaButton( Color.White, @@ -411,7 +410,7 @@ fun BirthdayActivityView( { onPurchaseClick() }, - modifier = Modifier.padding(top = 20.dp), + modifier = Modifier.padding(top = 20.dp) ) { Text(stringResource(R.string.buy_for_x, price), fontSize = 18.sp) } @@ -421,11 +420,11 @@ fun BirthdayActivityView( { onGemPurchaseClick() }, - modifier = Modifier.padding(top = 20.dp), + modifier = Modifier.padding(top = 20.dp) ) { Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(4.dp), + horizontalArrangement = Arrangement.spacedBy(4.dp) ) { Text(stringResource(R.string.buy_for), fontSize = 18.sp) CurrencyText(currency = "gems", value = 60, fontSize = 18.sp) @@ -438,7 +437,7 @@ fun BirthdayActivityView( fontSize = 16.sp, color = textColor, textAlign = TextAlign.Center, - lineHeight = 20.sp, + lineHeight = 20.sp ) PotionGrid() HabiticaButton( @@ -451,7 +450,7 @@ fun BirthdayActivityView( MainNavigationController.navigate(R.id.marketFragment) } }, - modifier = Modifier.padding(top = 20.dp), + modifier = Modifier.padding(top = 20.dp) ) { Text(stringResource(R.string.visit_the_market), fontSize = 18.sp) } @@ -461,44 +460,44 @@ fun BirthdayActivityView( fontSize = 16.sp, color = textColor, textAlign = TextAlign.Center, - lineHeight = 20.sp, + lineHeight = 20.sp ) Column( verticalArrangement = Arrangement.spacedBy(14.dp), - modifier = Modifier.padding(vertical = 20.dp), + modifier = Modifier.padding(vertical = 20.dp) ) { Row( horizontalArrangement = Arrangement.spacedBy(14.dp), - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth() ) { FourFreeItem( day = 1, title = stringResource(R.string.a_party_robe), imageName = "birthday10_robes", - modifier = Modifier.weight(1f), + modifier = Modifier.weight(1f) ) FourFreeItem( day = 1, title = stringResource(R.string.twenty_gems), image = painterResource(R.drawable.birthday_gems), - modifier = Modifier.weight(1f), + modifier = Modifier.weight(1f) ) } Row( horizontalArrangement = Arrangement.spacedBy(14.dp), - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth() ) { FourFreeItem( day = 5, title = stringResource(R.string.birthday_set), imageName = "birthday10_hero", - modifier = Modifier.weight(1f), + modifier = Modifier.weight(1f) ) FourFreeItem( day = 10, title = stringResource(R.string.background), imageName = "birthday10_background", - modifier = Modifier.weight(1f), + modifier = Modifier.weight(1f) ) } } @@ -506,29 +505,29 @@ fun BirthdayActivityView( Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = - Modifier - .padding(top = 20.dp) - .background(colorResource(R.color.brand_50)) - .padding(horizontal = 20.dp) - .padding(top = 20.dp, bottom = 60.dp), + Modifier + .padding(top = 20.dp) + .background(colorResource(R.color.brand_50)) + .padding(horizontal = 20.dp) + .padding(top = 20.dp, bottom = 60.dp) ) { Text( stringResource(R.string.limitations), fontSize = 16.sp, color = colorResource(R.color.brand_600), fontWeight = FontWeight.Bold, - textAlign = TextAlign.Center, + textAlign = TextAlign.Center ) Text( stringResource( R.string.birthday_limitations, complexDateFormat.format(startDate), - complexDateFormat.format(endDate), + complexDateFormat.format(endDate) ), fontSize = 14.sp, color = colorResource(R.color.brand_600), lineHeight = 20.sp, - textAlign = TextAlign.Center, + textAlign = TextAlign.Center ) } } @@ -548,12 +547,12 @@ fun PotionGrid() { "AutumnLeaf", "SandSculpture", "Peppermint", - "Shimmer", + "Shimmer" ).windowed(4, 4, true) Column( verticalArrangement = Arrangement.spacedBy(8.dp), horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.padding(top = 20.dp), + modifier = Modifier.padding(top = 20.dp) ) { for (potionGroup in potions) { Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { @@ -561,16 +560,16 @@ fun PotionGrid() { Box( Modifier .size(68.dp) - .background(colorResource(R.color.brand_50), RoundedCornerShape(8.dp)), + .background(colorResource(R.color.brand_50), RoundedCornerShape(8.dp)) ) { AsyncImage( model = - DataBindingUtils.BASE_IMAGE_URL + - DataBindingUtils.getFullFilename( - "Pet_HatchingPotion_$potion", - ), + DataBindingUtils.BASE_IMAGE_URL + + DataBindingUtils.getFullFilename( + "Pet_HatchingPotion_$potion" + ), null, - Modifier.size(68.dp), + Modifier.size(68.dp) ) } } @@ -585,28 +584,28 @@ fun FourFreeItem( title: String, modifier: Modifier = Modifier, imageName: String? = null, - image: Painter? = null, + image: Painter? = null ) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(18.dp), modifier = - modifier - .background(colorResource(R.color.brand_50), HabiticaTheme.shapes.medium) - .padding(16.dp), + modifier + .background(colorResource(R.color.brand_50), HabiticaTheme.shapes.medium) + .padding(16.dp) ) { Text( stringResource(R.string.day_x, day).uppercase(), color = colorResource(R.color.yellow_50), fontSize = 12.sp, - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Bold ) Box( contentAlignment = Alignment.Center, modifier = - Modifier - .size(121.dp, 84.dp) - .background(colorResource(R.color.brand_100), HabiticaTheme.shapes.medium), + Modifier + .size(121.dp, 84.dp) + .background(colorResource(R.color.brand_100), HabiticaTheme.shapes.medium) ) { if (image != null) { Image(image, null) @@ -614,7 +613,7 @@ fun FourFreeItem( PixelArtView( imageName, Modifier - .size(84.dp), + .size(84.dp) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt index 76543eb26..3fd263339 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt @@ -155,8 +155,8 @@ class ChallengeFormActivity : BaseActivity() { delay(500L) MainNavigationController.navigate( ChallengesOverviewFragmentDirections.openChallengeDetail( - challengeId ?: "", - ), + challengeId ?: "" + ) ) } } @@ -232,7 +232,7 @@ class ChallengeFormActivity : BaseActivity() { this, "", openTaskDisabled = false, - taskActionsDisabled = true, + taskActionsDisabled = true ).also { challengeTasks = it } challengeTasks.onTaskOpen = { @@ -376,7 +376,7 @@ class ChallengeFormActivity : BaseActivity() { adapterView: AdapterView<*>, view: View?, i: Int, - l: Long, + l: Long ) { checkPrizeAndMinimumForTavern() } @@ -410,12 +410,12 @@ class ChallengeFormActivity : BaseActivity() { androidx.recyclerview.widget.RecyclerView.SimpleOnItemTouchListener() { override fun onInterceptTouchEvent( rv: androidx.recyclerview.widget.RecyclerView, - e: MotionEvent, + e: MotionEvent ): Boolean { // Stop only scrolling. return rv.scrollState == androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_DRAGGING } - }, + } ) binding.createChallengeTaskList.adapter = challengeTasks binding.createChallengeTaskList.layoutManager = @@ -457,7 +457,7 @@ class ChallengeFormActivity : BaseActivity() { private fun openNewTaskActivity( type: TaskType?, - task: Task?, + task: Task? ) { val bundle = Bundle() @@ -513,13 +513,13 @@ class ChallengeFormActivity : BaseActivity() { taskList, ArrayList(addedTasks.values), ArrayList(updatedTasks.values), - ArrayList(removedTasks.keys), + ArrayList(removedTasks.keys) ) } private fun addOrUpdateTaskInList( task: Task, - isExistingTask: Boolean = false, + isExistingTask: Boolean = false ) { if (!challengeTasks.replaceTask(task)) { val taskAbove = @@ -557,7 +557,7 @@ class ChallengeFormActivity : BaseActivity() { override fun getView( position: Int, convertView: View?, - parent: ViewGroup, + parent: ViewGroup ): View { val checkedTextView = super.getView(position, convertView, parent) as? TextView checkedTextView?.text = getItem(position)?.name @@ -567,7 +567,7 @@ class ChallengeFormActivity : BaseActivity() { override fun getDropDownView( position: Int, convertView: View?, - parent: ViewGroup, + parent: ViewGroup ): View { val checkedTextView = super.getDropDownView(position, convertView, parent) as? AppCompatCheckedTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.kt index a7a457cb6..8d6f93f84 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.kt @@ -153,7 +153,7 @@ class ClassSelectionActivity : BaseActivity() { private fun makeUser( preferences: Preferences, - outfit: Outfit, + outfit: Outfit ): User { val user = User() user.preferences = preferences @@ -169,20 +169,20 @@ class ClassSelectionActivity : BaseActivity() { binding.selectedWrapperView.setBackgroundColor( ContextCompat.getColor( this, - R.color.yellow_100, - ), + R.color.yellow_100 + ) ) binding.selectedTitleTextView.setTextColor(ContextCompat.getColor(this, R.color.dark_brown)) binding.selectedDescriptionTextView.setTextColor( ContextCompat.getColor( this, - R.color.dark_brown, - ), + R.color.dark_brown + ) ) binding.selectedButton.setBackgroundResource(R.drawable.layout_rounded_bg_yellow_10) updateButtonBackgrounds( binding.healerButton, - ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_yellow_border), + ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_yellow_border) ) } @@ -192,20 +192,20 @@ class ClassSelectionActivity : BaseActivity() { binding.selectedWrapperView.setBackgroundColor( ContextCompat.getColor( this, - R.color.blue_10, - ), + R.color.blue_10 + ) ) binding.selectedTitleTextView.setTextColor(ContextCompat.getColor(this, R.color.white)) binding.selectedDescriptionTextView.setTextColor( ContextCompat.getColor( this, - R.color.white, - ), + R.color.white + ) ) binding.selectedButton.setBackgroundResource(R.drawable.layout_rounded_bg_gray_alpha) updateButtonBackgrounds( binding.mageButton, - ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_blue_border), + ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_blue_border) ) } @@ -215,20 +215,20 @@ class ClassSelectionActivity : BaseActivity() { binding.selectedWrapperView.setBackgroundColor( ContextCompat.getColor( this, - R.color.brand_200, - ), + R.color.brand_200 + ) ) binding.selectedTitleTextView.setTextColor(ContextCompat.getColor(this, R.color.white)) binding.selectedDescriptionTextView.setTextColor( ContextCompat.getColor( this, - R.color.white, - ), + R.color.white + ) ) binding.selectedButton.setBackgroundResource(R.drawable.layout_rounded_bg_gray_alpha) updateButtonBackgrounds( binding.rogueButton, - ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_brand_border), + ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_brand_border) ) } @@ -238,26 +238,26 @@ class ClassSelectionActivity : BaseActivity() { binding.selectedWrapperView.setBackgroundColor( ContextCompat.getColor( this, - R.color.maroon_50, - ), + R.color.maroon_50 + ) ) binding.selectedTitleTextView.setTextColor(ContextCompat.getColor(this, R.color.white)) binding.selectedDescriptionTextView.setTextColor( ContextCompat.getColor( this, - R.color.white, - ), + R.color.white + ) ) binding.selectedButton.setBackgroundResource(R.drawable.layout_rounded_bg_gray_alpha) updateButtonBackgrounds( binding.warriorButton, - ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_red_border), + ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_red_border) ) } private fun updateButtonBackgrounds( selectedButton: TextView, - background: Drawable?, + background: Drawable? ) { val deselectedBackground = ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt index ce3f0cf6a..adac69a7e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt @@ -99,7 +99,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity { getString( stringId, (user?.stats?.lvl ?: 2).toInt() - 1, - user?.stats?.gp?.toInt(), + user?.stats?.gp?.toInt() ).fromHtml() } @@ -148,7 +148,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity { binding.subscriberBenefitUsedView.text = getString( R.string.subscriber_benefit_used_faint, - midnight.getShortRemainingString(), + midnight.getShortRemainingString() ) delay(1000L) } @@ -166,7 +166,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity { Analytics.sendEvent( "View death sub CTA", EventCategory.BEHAVIOUR, - HitType.EVENT, + HitType.EVENT ) val subscriptionBottomSheet = EventOutcomeSubscriptionBottomSheetFragment().apply { @@ -175,7 +175,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity { } subscriptionBottomSheet.show( supportFragmentManager, - EventOutcomeSubscriptionBottomSheetFragment.TAG, + EventOutcomeSubscriptionBottomSheetFragment.TAG ) } } @@ -193,9 +193,9 @@ class DeathActivity : BaseActivity(), SnackbarActivity { Box( contentAlignment = Alignment.Center, modifier = - Modifier - .fillMaxWidth() - .height(60.dp), + Modifier + .fillMaxWidth() + .height(60.dp) ) { CircularProgressIndicator() } @@ -203,19 +203,19 @@ class DeathActivity : BaseActivity(), SnackbarActivity { Box( contentAlignment = Alignment.Center, modifier = - Modifier - .fillMaxWidth() - .height(60.dp) - .clickable { - isUsingBenefit = true - useSubBenefit() - }, + Modifier + .fillMaxWidth() + .height(60.dp) + .clickable { + isUsingBenefit = true + useSubBenefit() + } ) { Text( stringResource(R.string.subscriber_button_faint), fontSize = 16.sp, fontWeight = FontWeight.Medium, - textAlign = TextAlign.Center, + textAlign = TextAlign.Center ) } } @@ -234,7 +234,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity { HabiticaSnackbar.showSnackbar( activity.snackbarContainer(), getString(R.string.revive_broken_equipment, brokenItem.text), - HabiticaSnackbar.SnackbarDisplayType.BLACK, + HabiticaSnackbar.SnackbarDisplayType.BLACK ) } } @@ -249,7 +249,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity { Analytics.sendEvent( "second chance perk", EventCategory.BEHAVIOUR, - HitType.EVENT, + HitType.EVENT ) sharedPreferences.edit { putLong("last_sub_revive", Date().time) @@ -264,7 +264,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity { getString(R.string.subscriber_benefit_success_faint), HabiticaSnackbar.SnackbarDisplayType.SUBSCRIBER_BENEFIT, isSubscriberBenefit = true, - duration = 2500, + duration = 2500 ) } } @@ -287,7 +287,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity { binding.confettiContainer, 14, BitmapDrawable(resources, HabiticaIconsHelper.imageOfGold()), - 5000, + 5000 ) .setInitialRotationRange(0, 200) .setScaleRange(0.5f, 0.8f) @@ -298,7 +298,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity { binding.root.width / 2, positionArray[1] + (binding.heartView.height / 2), 3, - 6000, + 6000 ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt index 6c7528828..31b28658f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt @@ -41,23 +41,23 @@ class FixCharacterValuesActivity : BaseActivity() { setIconBackground( binding.healthIconBackgroundView, - ContextCompat.getColor(this, R.color.red_500), + ContextCompat.getColor(this, R.color.red_500) ) setIconBackground( binding.experienceIconBackgroundView, - ContextCompat.getColor(this, R.color.yellow_500), + ContextCompat.getColor(this, R.color.yellow_500) ) setIconBackground( binding.manaIconBackgroundView, - ContextCompat.getColor(this, R.color.blue_500), + ContextCompat.getColor(this, R.color.blue_500) ) setIconBackground( binding.goldIconBackgroundView, - ContextCompat.getColor(this, R.color.yellow_500), + ContextCompat.getColor(this, R.color.yellow_500) ) setIconBackground( binding.streakIconBackgroundView, - ContextCompat.getColor(this, R.color.separator), + ContextCompat.getColor(this, R.color.separator) ) binding.healthIconView.setImageBitmap(HabiticaIconsHelper.imageOfHeartLightBg()) @@ -112,7 +112,7 @@ class FixCharacterValuesActivity : BaseActivity() { Stats.WARRIOR -> { setIconBackground( binding.levelIconBackgroundView, - ContextCompat.getColor(this, R.color.red_500), + ContextCompat.getColor(this, R.color.red_500) ) binding.levelIconView.setImageBitmap(HabiticaIconsHelper.imageOfWarriorLightBg()) } @@ -120,7 +120,7 @@ class FixCharacterValuesActivity : BaseActivity() { Stats.MAGE -> { setIconBackground( binding.levelIconBackgroundView, - ContextCompat.getColor(this, R.color.blue_500), + ContextCompat.getColor(this, R.color.blue_500) ) binding.levelIconView.setImageBitmap(HabiticaIconsHelper.imageOfMageLightBg()) } @@ -128,7 +128,7 @@ class FixCharacterValuesActivity : BaseActivity() { Stats.HEALER -> { setIconBackground( binding.levelIconBackgroundView, - ContextCompat.getColor(this, R.color.yellow_500), + ContextCompat.getColor(this, R.color.yellow_500) ) binding.levelIconView.setImageBitmap(HabiticaIconsHelper.imageOfHealerLightBg()) } @@ -136,7 +136,7 @@ class FixCharacterValuesActivity : BaseActivity() { Stats.ROGUE -> { setIconBackground( binding.levelIconBackgroundView, - ContextCompat.getColor(this, R.color.brand_500), + ContextCompat.getColor(this, R.color.brand_500) ) binding.levelIconView.setImageBitmap(HabiticaIconsHelper.imageOfRogueLightBg()) } @@ -145,7 +145,7 @@ class FixCharacterValuesActivity : BaseActivity() { private fun setIconBackground( view: View, - color: Int, + color: Int ) { val backgroundDrawable = ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg) backgroundDrawable?.setTintWith(color, PorterDuff.Mode.MULTIPLY) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt index 632611ca5..ca4cc02d0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt @@ -119,7 +119,7 @@ class FullProfileActivity : BaseActivity() { isMyProfile = false, onMemberRowClicked = {}, onClassSelectionClicked = {}, - configManager = configManager, + configManager = configManager ) } } @@ -131,13 +131,13 @@ class FullProfileActivity : BaseActivity() { binding.giftGemsButton.setOnClickListener { MainNavigationController.navigate( R.id.giftGemsActivity, - bundleOf(Pair("userID", userID), Pair("username", null)), + bundleOf(Pair("userID", userID), Pair("username", null)) ) } binding.giftSubscriptionButton.setOnClickListener { MainNavigationController.navigate( R.id.giftSubscriptionActivity, - bundleOf(Pair("userID", userID), Pair("username", null)), + bundleOf(Pair("userID", userID), Pair("username", null)) ) } lifecycleScope.launchCatching { @@ -207,7 +207,7 @@ class FullProfileActivity : BaseActivity() { R.string.unban_user } else { R.string.ban_user - }, + } ) menu.findItem(R.id.shadow_mute_user)?.title = getString( @@ -215,7 +215,7 @@ class FullProfileActivity : BaseActivity() { R.string.unshadowmute_user } else { R.string.shadow_mute_user - }, + } ) menu.findItem(R.id.mute_user)?.title = getString( @@ -223,7 +223,7 @@ class FullProfileActivity : BaseActivity() { R.string.unmute_user } else { R.string.mute_user - }, + } ) } return super.onCreateOptionsMenu(menu) @@ -253,7 +253,7 @@ class FullProfileActivity : BaseActivity() { HabiticaSnackbar.showSnackbar( this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup, String.format(getString(R.string.username_copied), userDisplayName), - SnackbarDisplayType.NORMAL, + SnackbarDisplayType.NORMAL ) } true @@ -268,7 +268,7 @@ class FullProfileActivity : BaseActivity() { HabiticaSnackbar.showSnackbar( this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup, String.format(getString(R.string.id_copied), userDisplayName), - SnackbarDisplayType.NORMAL, + SnackbarDisplayType.NORMAL ) } true @@ -287,7 +287,7 @@ class FullProfileActivity : BaseActivity() { showReportUserBottomSheet( userIdBeingReported = userID, usernameBeingReported = username ?: "", - userDisplayName = userDisplayName ?: "", + userDisplayName = userDisplayName ?: "" ) true } @@ -316,8 +316,8 @@ class FullProfileActivity : BaseActivity() { this@FullProfileActivity, it, "Check out my avatar on Habitica!", - "avatar_profile", - ), + "avatar_profile" + ) ) } } @@ -371,7 +371,7 @@ class FullProfileActivity : BaseActivity() { private fun showReportUserBottomSheet( userIdBeingReported: String, usernameBeingReported: String, - userDisplayName: String, + userDisplayName: String ) { val reportBottomSheetFragment = ReportBottomSheetFragment.newInstance( @@ -382,7 +382,7 @@ class FullProfileActivity : BaseActivity() { messageText = "", groupId = "", userIdBeingReported = userIdBeingReported, - sourceView = this::class.simpleName ?: "", + sourceView = this::class.simpleName ?: "" ) reportBottomSheetFragment.show(supportFragmentManager, ReportBottomSheetFragment.TAG) @@ -433,7 +433,7 @@ class FullProfileActivity : BaseActivity() { delay(500L) MainNavigationController.navigate( R.id.inboxMessageListFragment, - bundleOf(Pair("username", username), Pair("userID", userID)), + bundleOf(Pair("username", username), Pair("userID", userID)) ) } } @@ -507,8 +507,8 @@ class FullProfileActivity : BaseActivity() { binding.adminStatusTextview.setTextColor( ContextCompat.getColor( this, - R.color.text_green, - ), + R.color.text_green + ) ) } } @@ -526,17 +526,17 @@ class FullProfileActivity : BaseActivity() { fillAchievements( R.string.basic_achievements, achievements.filter { it.category == "basic" }, - items, + items ) fillAchievements( R.string.seasonal_achievements, achievements.filter { it.category == "seasonal" }, - items, + items ) fillAchievements( R.string.special_achievements, achievements.filter { it.category == "special" }, - items, + items ) val adapter = AchievementProfileAdapter() @@ -562,7 +562,7 @@ class FullProfileActivity : BaseActivity() { private fun fillAchievements( labelID: Int, achievements: List, - targetList: MutableList, + targetList: MutableList ) { // Order by ID first val achievementList = ArrayList(achievements) @@ -576,7 +576,7 @@ class FullProfileActivity : BaseActivity() { private fun getFloorValueString( `val`: Float, - roundDown: Boolean, + roundDown: Boolean ): String { return if (roundDown) { floor(`val`.toDouble()).toString() @@ -591,7 +591,7 @@ class FullProfileActivity : BaseActivity() { private fun getFloorValue( value: Float, - roundDown: Boolean, + roundDown: Boolean ): Float { return if (roundDown) { floor(value.toDouble()).toFloat() @@ -604,7 +604,7 @@ class FullProfileActivity : BaseActivity() { table: TableLayout, gearKey: String?, text: String?, - stats: String?, + stats: String? ) { val gearRow = layoutInflater.inflate(R.layout.profile_gear_tablerow, table, false) as? TableRow @@ -636,7 +636,7 @@ class FullProfileActivity : BaseActivity() { byLevelStat, byLevelStat, roundDown = true, - isSummary = false, + isSummary = false ) } @@ -657,7 +657,7 @@ class FullProfileActivity : BaseActivity() { private fun gotGear( equipmentList: List, - user: Member, + user: Member ) { val userStatComputer = UserStatComputer() val statsRows = userStatComputer.computeClassBonus(equipmentList, user) @@ -683,7 +683,7 @@ class FullProfileActivity : BaseActivity() { row.conVal, row.perVal, row.roundDown, - row.summary, + row.summary ) } } @@ -709,7 +709,7 @@ class FullProfileActivity : BaseActivity() { stats.constitution?.toFloat() ?: 0f, stats.per?.toFloat() ?: 0f, roundDown = true, - isSummary = false, + isSummary = false ) addAttributeRow( getString(R.string.buffs), @@ -719,7 +719,7 @@ class FullProfileActivity : BaseActivity() { buffs?.con ?: 0f, buffs?.per ?: 0f, roundDown = true, - isSummary = false, + isSummary = false ) // Summary row @@ -730,7 +730,7 @@ class FullProfileActivity : BaseActivity() { attributeConSum, attributePerSum, roundDown = false, - isSummary = true, + isSummary = true ) } @@ -741,13 +741,13 @@ class FullProfileActivity : BaseActivity() { conVal: Float, perVal: Float, roundDown: Boolean, - isSummary: Boolean, + isSummary: Boolean ) { val tableRow = layoutInflater.inflate( R.layout.profile_attributetablerow, binding.attributesTableLayout, - false, + false ) as? TableRow ?: return val keyTextView = tableRow.findViewById(R.id.tv_attribute_type) keyTextView?.text = label @@ -791,8 +791,8 @@ class FullProfileActivity : BaseActivity() { R.drawable.ic_keyboard_arrow_right_black_24dp } else { R.drawable.ic_keyboard_arrow_down_black_24dp - }, - ), + } + ) ) for (row in attributeRows) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt index 1b2fc5723..a4bb2c338 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt @@ -2,17 +2,13 @@ package com.habitrpg.android.habitica.ui.activities import android.graphics.Color import android.os.Bundle -import android.view.Menu import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.extensions.hideKeyboard import com.habitrpg.android.habitica.extensions.updateStatusBarColor import com.habitrpg.android.habitica.ui.fragments.purchases.GemsPurchaseFragment import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment -import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper -import com.habitrpg.common.habitica.extensions.getThemeColor import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt index 4caf1e2a5..2f7588ed1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt @@ -95,7 +95,7 @@ class GiftGemsActivity : PurchaseActivity() { lifecycleScope.launch( ExceptionHandler.coroutine { showMemberLoadingErrorDialog() - }, + } ) { val member = socialRepository.retrieveMember(giftedUsername ?: giftedUserID) if (member == null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt index b4ae80cd6..b528238c9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt @@ -96,7 +96,7 @@ class GiftSubscriptionActivity : PurchaseActivity() { lifecycleScope.launch( ExceptionHandler.coroutine { showMemberLoadingErrorDialog() - }, + } ) { val member = socialRepository.retrieveMember(giftedUsername ?: giftedUserID) if (member == null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt index 63b2a54b0..6caa840a0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt @@ -97,7 +97,7 @@ class GroupFormActivity : BaseActivity() { bundle.putString("groupType", groupType) bundle.putString( "description", - MarkdownParser.parseCompiled(binding.groupDescriptionEditText.text.toString()), + MarkdownParser.parseCompiled(binding.groupDescriptionEditText.text.toString()) ) bundle.putBoolean("leaderOnlyChallenges", binding.leaderCreateChallengeSwitch.isChecked) bundle.putString("leader", this.groupLeader) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt index 6e666afc7..a78953c29 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt @@ -33,7 +33,7 @@ class GuidelinesActivity : BaseActivity() { object : Callback { override fun onFailure( call: Call, - e: IOException, + e: IOException ) { ExceptionHandler.reportError(e) } @@ -41,7 +41,7 @@ class GuidelinesActivity : BaseActivity() { @Throws(IOException::class) override fun onResponse( call: Call, - response: Response, + response: Response ) { val `in` = response.body?.byteStream() val reader = BufferedReader(InputStreamReader(`in`)) @@ -52,7 +52,7 @@ class GuidelinesActivity : BaseActivity() { findViewById(R.id.text_view).setMarkdown(text) } } - }, + } ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt index 88f208225..fd54e988c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt @@ -53,7 +53,7 @@ class HabitButtonWidgetActivity : BaseActivity() { widgetId = extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID ) } @@ -101,7 +101,7 @@ class HabitButtonWidgetActivity : BaseActivity() { AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, - HabitButtonWidgetProvider::class.java, + HabitButtonWidgetProvider::class.java ) intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(widgetId)) sendBroadcast(intent) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt index a13397057..5b0d1cb2c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt @@ -77,7 +77,7 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan override fun onPageScrolled( position: Int, positionOffset: Float, - positionOffsetPixels: Int, + positionOffsetPixels: Int ) { // no-on } @@ -110,7 +110,7 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan override fun instantiateItem( container: ViewGroup, - position: Int, + position: Int ): Any { val item = super.instantiateItem(container, position) if (item is IntroFragment) { @@ -122,7 +122,7 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan private fun configureFragment( fragment: IntroFragment, - position: Int, + position: Int ) { when (position) { 0 -> { @@ -132,20 +132,20 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan ResourcesCompat.getDrawable( resources, R.drawable.intro_1_title, - null, - ), + null + ) ) fragment.setDescription( getString( R.string.intro_1_description, - getString(R.string.habitica_user_count), - ), + getString(R.string.habitica_user_count) + ) ) fragment.setBackgroundColor( ContextCompat.getColor( this@IntroActivity, - R.color.brand_300, - ), + R.color.brand_300 + ) ) } @@ -157,8 +157,8 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan fragment.setBackgroundColor( ContextCompat.getColor( this@IntroActivity, - R.color.blue_10, - ), + R.color.blue_10 + ) ) } @@ -170,8 +170,8 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan fragment.setBackgroundColor( ContextCompat.getColor( this@IntroActivity, - R.color.red_100, - ), + R.color.red_100 + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt index 378c77494..b4472f5ce 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt @@ -92,7 +92,7 @@ class LoginActivity : BaseActivity() { ExceptionHandler.coroutine { hideProgress() ExceptionHandler.reportError(it) - }, + } ) { val response = apiClient.connectUser(username, password) if (response != null) { @@ -116,8 +116,8 @@ class LoginActivity : BaseActivity() { showValidationError( getString( R.string.password_too_short, - configManager.minimumPasswordLength(), - ), + configManager.minimumPasswordLength() + ) ) return } @@ -125,7 +125,7 @@ class LoginActivity : BaseActivity() { ExceptionHandler.coroutine { hideProgress() ExceptionHandler.reportError(it) - }, + } ) { val response = apiClient.registerUser(username, email, password, confirmPassword) if (response != null) { @@ -167,7 +167,7 @@ class LoginActivity : BaseActivity() { binding.backgroundContainer.post { binding.backgroundContainer.scrollTo( 0, - binding.backgroundContainer.bottom, + binding.backgroundContainer.bottom ) } binding.backgroundContainer.isScrollable = false @@ -187,7 +187,7 @@ class LoginActivity : BaseActivity() { override fun loadTheme( sharedPreferences: SharedPreferences, - forced: Boolean, + forced: Boolean ) { super.loadTheme(sharedPreferences, forced) window.updateStatusBarColor(R.color.black_20_alpha, false) @@ -272,16 +272,16 @@ class LoginActivity : BaseActivity() { Tasks.await( capabilityClient.getCapability( "receive_message", - CapabilityClient.FILTER_REACHABLE, - ), + CapabilityClient.FILTER_REACHABLE + ) ) info.nodes.forEach { Tasks.await( messageClient.sendMessage( it.id, "/auth", - "${response.id}:${response.apiToken}".toByteArray(), - ), + "${response.id}:${response.apiToken}".toByteArray() + ) ) } } catch (e: Exception) { @@ -345,7 +345,7 @@ class LoginActivity : BaseActivity() { viewModel.googleEmail = it?.data?.getStringExtra(AccountManager.KEY_ACCOUNT_NAME) viewModel.handleGoogleLoginResult( this, - recoverFromPlayServicesErrorResult, + recoverFromPlayServicesErrorResult ) { isNew -> handleAuthResponse(isNew) } @@ -356,7 +356,7 @@ class LoginActivity : BaseActivity() { private val recoverFromPlayServicesErrorResult = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), + ActivityResultContracts.StartActivityForResult() ) { if (it.resultCode != Activity.RESULT_CANCELED) { viewModel.handleGoogleLoginResult(this, null) { isNew -> @@ -394,7 +394,7 @@ class LoginActivity : BaseActivity() { val scaleLogoAnimation = ValueAnimator.ofInt( binding.logoView.measuredHeight, - (binding.logoView.measuredHeight * 0.75).toInt(), + (binding.logoView.measuredHeight * 0.75).toInt() ) scaleLogoAnimation.addUpdateListener { valueAnimator -> val value = valueAnimator.animatedValue as? Int ?: 0 @@ -414,7 +414,7 @@ class LoginActivity : BaseActivity() { binding.loginScrollview.visibility = View.VISIBLE binding.loginScrollview.alpha = 1f } - }, + } ) } else { showLoginAlphaAnimation.startDelay = 600 @@ -428,7 +428,7 @@ class LoginActivity : BaseActivity() { binding.loginScrollview.visibility = View.VISIBLE binding.loginScrollview.alpha = 1f } - }, + } ) } val backAlphaAnimation = @@ -438,7 +438,7 @@ class LoginActivity : BaseActivity() { panAnimation, newGameAlphaAnimation, showLoginAlphaAnimation, - scaleLogoAnimation, + scaleLogoAnimation ) showAnimation.play(backAlphaAnimation).after(panAnimation) for (i in 0 until binding.formWrapper.childCount) { @@ -458,7 +458,7 @@ class LoginActivity : BaseActivity() { ObjectAnimator.ofInt( binding.backgroundContainer, "scrollY", - binding.backgroundContainer.bottom, + binding.backgroundContainer.bottom ).setDuration(1000) val newGameAlphaAnimation = ObjectAnimator.ofFloat(binding.newGameButton, View.ALPHA, 1.toFloat()).setDuration(700) @@ -468,7 +468,7 @@ class LoginActivity : BaseActivity() { val scaleLogoAnimation = ValueAnimator.ofInt( binding.logoView.measuredHeight, - (binding.logoView.measuredHeight * 1.333333).toInt(), + (binding.logoView.measuredHeight * 1.333333).toInt() ) scaleLogoAnimation.addUpdateListener { valueAnimator -> val value = valueAnimator.animatedValue as? Int @@ -487,7 +487,7 @@ class LoginActivity : BaseActivity() { binding.showLoginButton.visibility = View.VISIBLE binding.loginScrollview.visibility = View.INVISIBLE } - }, + } ) val backAlphaAnimation = ObjectAnimator.ofFloat(binding.backButton, View.ALPHA, 0.toFloat()).setDuration(800) @@ -496,7 +496,7 @@ class LoginActivity : BaseActivity() { panAnimation, scrollViewAlphaAnimation, backAlphaAnimation, - scaleLogoAnimation, + scaleLogoAnimation ) showAnimation.play(newGameAlphaAnimation).after(scrollViewAlphaAnimation) showAnimation.play(showLoginAlphaAnimation).after(scrollViewAlphaAnimation) @@ -515,7 +515,7 @@ class LoginActivity : BaseActivity() { val lp = LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT ) input.layoutParams = lp val alertDialog = HabiticaAlertDialog(this) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 06b83c1c2..1e429d3cb 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -12,7 +12,6 @@ import android.content.res.Configuration import android.net.Uri import android.os.Build import android.os.Bundle -import android.provider.Settings import android.provider.Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM import android.view.KeyEvent import android.view.MenuItem @@ -35,7 +34,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.core.content.edit import androidx.core.view.children import androidx.core.view.setPadding import androidx.drawerlayout.widget.DrawerLayout @@ -177,7 +175,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { private val notificationPermissionLauncher = registerForActivityResult( - ActivityResultContracts.RequestPermission(), + ActivityResultContracts.RequestPermission() ) { granted -> if (granted) { viewModel.pushNotificationManager.addPushDeviceUsingStoredToken() @@ -187,8 +185,8 @@ open class MainActivity : BaseActivity(), SnackbarActivity { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && !viewModel.sharedPreferences.getBoolean("prompted_exact_scheduling", false)) { val alarmManager = this.getSystemService(Context.ALARM_SERVICE) as? AlarmManager ?: return@registerForActivityResult if (!alarmManager.canScheduleExactAlarms()) { - val intent =Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM) - intent.setData(Uri.fromParts("package", applicationContext?.packageName, null)); + val intent = Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM) + intent.setData(Uri.fromParts("package", applicationContext?.packageName, null)) startActivity(intent) } } @@ -260,7 +258,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { this, drawerLayout, R.string.navigation_drawer_open, - R.string.navigation_drawer_close, + R.string.navigation_drawer_close ) {} // Set the drawer toggle as the DrawerListener drawerToggle?.let { drawerLayout.addDrawerListener(it) } @@ -270,7 +268,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { override fun onDrawerSlide( drawerView: View, - slideOffset: Float, + slideOffset: Float ) { if (!isUsingNightModeResources()) { if (slideOffset < 0.5f && isOpeningDrawer == null) { @@ -279,7 +277,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { } else if (slideOffset > 0.5f && isOpeningDrawer == null) { window.updateStatusBarColor( getThemeColor(R.attr.headerBackgroundColor), - true, + true ) isOpeningDrawer = false } @@ -304,7 +302,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { override fun onDrawerStateChanged(newState: Int) { } - }, + } ) } @@ -317,7 +315,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { HabiticaTheme { val user by viewModel.user.observeAsState(null) val teamPlan by viewModel.userViewModel.currentTeamPlan.collectAsStateLifecycleAware( - null, + null ) val teamPlanMembers by viewModel.userViewModel.currentTeamPlanMembers.observeAsState() val canShowTeamHeader: Boolean by viewModel.canShowTeamPlanHeader @@ -331,15 +329,15 @@ open class MainActivity : BaseActivity(), SnackbarActivity { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(4.dp), - modifier = Modifier.padding(22.dp), + modifier = Modifier.padding(22.dp) ) { ComposableAvatarView( avatar = user, - configManager = appConfigManager, + configManager = appConfigManager ) Column( horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(15.dp), + verticalArrangement = Arrangement.spacedBy(15.dp) ) { HabiticaButton( background = HabiticaTheme.colors.tintedUiSub, @@ -349,10 +347,10 @@ open class MainActivity : BaseActivity(), SnackbarActivity { dismiss() MainNavigationController.navigate( MainNavDirections.openProfileActivity( - user?.id ?: "", - ), + user?.id ?: "" + ) ) - }, + } ) { Text(stringResource(id = R.string.open_profile)) } @@ -364,7 +362,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { onClick = { dismiss() MainNavigationController.navigate(R.id.avatarOverviewFragment) - }, + } ) { Text(stringResource(id = R.string.customize_avatar)) } @@ -383,12 +381,12 @@ open class MainActivity : BaseActivity(), SnackbarActivity { this@MainActivity, it, "Check out my avatar on Habitica!", - "avatar_bottomsheet", - ), + "avatar_bottomsheet" + ) ) } } - }, + } ) { Text(stringResource(id = R.string.share_avatar)) } @@ -399,7 +397,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { onMemberRowClicked = { showAsBottomSheet { onClose -> val group by viewModel.userViewModel.currentTeamPlanGroup.collectAsState( - null, + null ) val members by viewModel.userViewModel.currentTeamPlanMembers.observeAsState() GroupPlanMemberList(members, group, appConfigManager) { @@ -416,7 +414,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { intent.putExtras(bundle) classSelectionResult.launch(intent) }, - configManager = appConfigManager, + configManager = appConfigManager ) } } @@ -434,7 +432,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { private fun updateToolbarTitle( destination: NavDestination, - arguments: Bundle?, + arguments: Bundle? ) { viewModel.getToolbarTitle(destination.id, destination.label, arguments?.getString("type")) { title = it @@ -455,7 +453,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { NotificationChannel( channelId, "Habitica Notifications", - NotificationManager.IMPORTANCE_DEFAULT, + NotificationManager.IMPORTANCE_DEFAULT ) val manager = getSystemService(NotificationManager::class.java) manager?.createNotificationChannel(channel) @@ -469,7 +467,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { 0, 0, 0, - binding.content.bottomNavigation.barHeight + 12.dpToPx(this), + binding.content.bottomNavigation.barHeight + 12.dpToPx(this) ) } else { snackbarContainer.setPadding(0, 0, 0, 0) @@ -517,7 +515,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { navigationController.addOnDestinationChangedListener { _, destination, arguments -> updateToolbarTitle( destination, - arguments, + arguments ) } @@ -542,9 +540,9 @@ open class MainActivity : BaseActivity(), SnackbarActivity { if ((intent.hasExtra("notificationIdentifier") || intent.hasExtra("openURL")) && lastNotificationOpen != intent.getLongExtra( - "notificationTimeStamp", - 0, - ) + "notificationTimeStamp", + 0 + ) ) { lastNotificationOpen = intent.getLongExtra("notificationTimeStamp", 0) val identifier = intent.getStringExtra("notificationIdentifier") ?: "" @@ -555,7 +553,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { "open notification", EventCategory.BEHAVIOUR, HitType.EVENT, - additionalData, + additionalData ) } retrieveUser(true) @@ -592,7 +590,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { override fun startActivity( intent: Intent?, - options: Bundle?, + options: Bundle? ) { resumeFromActivity = true super.startActivity(intent, options) @@ -646,7 +644,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { QuestCompletedDialog.showWithQuest( this@MainActivity, questContent, - userRepository, + userRepository ) } viewModel.updateUser("party.quest.completed", "") @@ -705,8 +703,8 @@ open class MainActivity : BaseActivity(), SnackbarActivity { data.manaDelta, damageValue, data.hasLeveledUp, - data.level, - ), + data.level + ) ) } } @@ -718,8 +716,8 @@ open class MainActivity : BaseActivity(), SnackbarActivity { data, this@MainActivity, snackbarContainer, - showItemsFound, - ), + showItemsFound + ) ) } } @@ -743,7 +741,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { override fun onKeyUp( keyCode: Int, - event: KeyEvent, + event: KeyEvent ): Boolean { if (keyCode == KeyEvent.KEYCODE_MENU) { drawerFragment?.openDrawer() @@ -760,7 +758,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { fun displayTutorialStep( step: TutorialStep, texts: List, - canBeDeferred: Boolean, + canBeDeferred: Boolean ) { val view = TutorialView(this, step, viewModel) view.setTutorialTexts(texts) @@ -798,7 +796,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { private fun createMaintenanceIntent( maintenanceResponse: MaintenanceResponse, - isDeprecationNotice: Boolean, + isDeprecationNotice: Boolean ): Intent { val intent = Intent(this, MaintenanceActivity::class.java) val data = Bundle() @@ -820,13 +818,13 @@ open class MainActivity : BaseActivity(), SnackbarActivity { errorCount: Int, title: String?, message: String, - isFromUserInput: Boolean, + isFromUserInput: Boolean ) { if (errorCount == 1 && !isFromUserInput) { showSnackbar( title = title, content = message, - displayType = HabiticaSnackbar.SnackbarDisplayType.FAILURE, + displayType = HabiticaSnackbar.SnackbarDisplayType.FAILURE ) } else if (title != null) { super.showConnectionProblem(errorCount, title, message, isFromUserInput) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt index edc4cf005..c5f9e9819 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt @@ -78,8 +78,8 @@ class MaintenanceActivity : BaseActivity() { startActivity( Intent( Intent.ACTION_VIEW, - "https://play.google.com/store/apps/details?id=$appPackageName".toUri(), - ), + "https://play.google.com/store/apps/details?id=$appPackageName".toUri() + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt index 4c9dea404..12539dfc9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt @@ -160,8 +160,8 @@ class NotificationsActivity : inflater?.inflate( R.layout.no_notifications, binding.notificationItems, - false, - ), + false + ) ) binding.progressView.isVisible = false } @@ -182,23 +182,23 @@ class NotificationsActivity : Notification.Type.NEW_STUFF.type -> createNewStuffNotification(it) Notification.Type.UNALLOCATED_STATS_POINTS.type -> createUnallocatedStatsNotification( - it, + it ) Notification.Type.NEW_MYSTERY_ITEMS.type -> createMysteryItemsNotification(it) Notification.Type.GROUP_TASK_NEEDS_WORK.type -> createGroupTaskNeedsWorkNotification( - it, + it ) Notification.Type.GROUP_TASK_APPROVED.type -> createGroupTaskApprovedNotification( - it, + it ) Notification.Type.GROUP_TASK_REQUIRES_APPROVAL.type -> createGroupTaskNeedsApprovalNotification( - it, + it ) Notification.Type.PARTY_INVITATION.type -> createPartyInvitationNotification(it) @@ -247,7 +247,7 @@ class NotificationsActivity : return createDismissableNotificationItem( notification, - fromHtml(getString(stringId, data?.group?.name)), + fromHtml(getString(stringId, data?.group?.name)) ) } @@ -256,7 +256,7 @@ class NotificationsActivity : return createDismissableNotificationItem( notification, fromHtml("" + data?.title + "
" + data?.text), - imageName = data?.icon, + imageName = data?.icon ) } @@ -282,7 +282,7 @@ class NotificationsActivity : createDismissableNotificationItem( baileyNotification, text, - R.drawable.notifications_bailey, + R.drawable.notifications_bailey ) } } @@ -295,7 +295,7 @@ class NotificationsActivity : createDismissableNotificationItem( notification, fromHtml(getString(R.string.unallocated_stats_points, data?.points.toString())), - R.drawable.notification_stat_sparkles, + R.drawable.notification_stat_sparkles ) } else { null @@ -306,7 +306,7 @@ class NotificationsActivity : return createDismissableNotificationItem( notification, fromHtml(getString(R.string.new_subscriber_item)), - R.drawable.notification_mystery_item, + R.drawable.notification_mystery_item ) } @@ -318,7 +318,7 @@ class NotificationsActivity : notification, fromHtml(message), null, - textColor = R.color.yellow_5, + textColor = R.color.yellow_5 ) } @@ -330,7 +330,7 @@ class NotificationsActivity : notification, fromHtml(message), null, - textColor = R.color.green_10, + textColor = R.color.green_10 ) } @@ -341,7 +341,7 @@ class NotificationsActivity : val item = createActionableNotificationItem( notification, - fromHtml(message), + fromHtml(message) ) // Hide for now item?.visibility = View.GONE @@ -366,7 +366,7 @@ class NotificationsActivity : messageText: CharSequence, imageResourceId: Int? = null, imageName: String? = null, - textColor: Int? = null, + textColor: Int? = null ): View? { val item = inflater?.inflate(R.layout.notification_item, binding.notificationItems, false) item?.tag = notification.id @@ -423,11 +423,11 @@ class NotificationsActivity : getString( R.string.invited_to_party_notification, data.invitation?.name, - inviter?.formattedUsername, - ), + inviter?.formattedUsername + ) ), openable = true, - inviterId, + inviterId ) } else { return@withContext null @@ -446,11 +446,11 @@ class NotificationsActivity : getString( R.string.invited_to_guild_notification, data.invitation?.name, - inviter?.formattedUsername, - ), + inviter?.formattedUsername + ) ), openable = true, - inviterId, + inviterId ) } else { return@withContext null @@ -478,7 +478,7 @@ class NotificationsActivity : private fun updateQuestInvitationView( view: View?, - questContent: QuestContent, + questContent: QuestContent ) { val messageTextView = view?.findViewById(R.id.message_text) as? TextView messageTextView?.text = fromHtml(getString(R.string.invited_to_quest, questContent.text)) @@ -513,13 +513,13 @@ class NotificationsActivity : notification: Notification, messageText: CharSequence, openable: Boolean = false, - inviterId: String? = null, + inviterId: String? = null ): View? { val item = inflater?.inflate( R.layout.notification_item_actionable, binding.notificationItems, - false, + false ) item?.tag = notification.id diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt index f8ea2be8a..18e063e9c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt @@ -39,7 +39,7 @@ class PrefsActivity : override fun onPreferenceStartScreen( preferenceFragment: PreferenceFragmentCompat, - preferenceScreen: PreferenceScreen, + preferenceScreen: PreferenceScreen ): Boolean { val fragment = createNextPage(preferenceScreen) if (fragment != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt index cc7add713..424b56b1d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt @@ -61,7 +61,7 @@ class ReportMessageActivity : BaseActivity() { @SuppressLint("SwitchIntDef") override fun onStateChanged( bottomSheet: View, - newState: Int, + newState: Int ) { when (newState) { BottomSheetBehavior.STATE_HIDDEN -> finish() @@ -72,11 +72,11 @@ class ReportMessageActivity : BaseActivity() { override fun onSlide( bottomSheet: View, - slideOffset: Float, + slideOffset: Float ) { // no op } - }, + } ) val args = navArgs().value @@ -103,12 +103,12 @@ class ReportMessageActivity : BaseActivity() { lifecycleScope.launch( ExceptionHandler.coroutine { isReporting = false - }, + } ) { socialRepository.flagMessage( messageID ?: "", binding.additionalInfoEdittext.text.toString(), - groupID, + groupID ) finish() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt index 43b1ff4d7..4bd1669ac 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt @@ -68,7 +68,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { binding.viewPager.adapter == null || binding.viewPager.currentItem == ( binding.viewPager.adapter?.count ?: 0 - ) - 1 + ) - 1 override fun getLayoutResId(): Int { return R.layout.activity_setup @@ -114,7 +114,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { window.insetsController?.setSystemBarsAppearance( 0, - WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, + WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS ) } else { @Suppress("DEPRECATION") @@ -184,7 +184,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { leftDrawable, null, null, - null, + null ) } @@ -204,7 +204,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { override fun onPageScrolled( position: Int, positionOffset: Float, - positionOffsetPixels: Int, + positionOffsetPixels: Int ) = Unit @@ -261,7 +261,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { private fun confirmNames( displayName: String, - username: String, + username: String ) { lifecycleScope.launch(ExceptionHandler.coroutine()) { userRepository.updateUser("profile.name", displayName) @@ -300,7 +300,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { override fun instantiateItem( container: ViewGroup, - position: Int, + position: Int ): Any { val item = super.instantiateItem(container, position) when (item) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt index 0ef8de5b2..510547c92 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt @@ -124,7 +124,7 @@ class TaskFormActivity : BaseActivity() { private val notificationPermissionLauncher = registerForActivityResult( - ActivityResultContracts.RequestPermission(), + ActivityResultContracts.RequestPermission() ) { granted -> if (granted) { pushNotificationManager.addPushDeviceUsingStoredToken() @@ -229,9 +229,9 @@ class TaskFormActivity : BaseActivity() { supportActionBar?.setBackgroundDrawable(ColorDrawable(upperTintColor)) binding.upperTextWrapper.setBackgroundColor(upperTintColor) - binding.exactAlarmDisabledContainer.background = ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_task_form) + binding.exactAlarmDisabledContainer.background = ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_task_form) binding.exactAlarmDisabledContainer.background.mutate().setTint(this.getThemeColor(R.attr.tintedUiMain)) - binding.exactAlarmDisabledText.setTextColor(getThemeColor(R.attr.textColorTintedPrimary)) + binding.exactAlarmDisabledText.setTextColor(getThemeColor(R.attr.tintedUiDetails)) isChallengeTask = bundle.getBoolean(IS_CHALLENGE_TASK, false) @@ -256,7 +256,7 @@ class TaskFormActivity : BaseActivity() { binding.textEditText.addTextChangedListener( OnChangeTextWatcher { _, _, _, _ -> checkCanSave() - }, + } ) binding.textEditText.onFocusChangeListener = View.OnFocusChangeListener { _, isFocused -> @@ -325,8 +325,8 @@ class TaskFormActivity : BaseActivity() { TaskType.TODO -> R.string.todo TaskType.REWARD -> R.string.reward else -> R.string.habit - }, - ), + } + ) ) initialTaskInstance = configureTask(Task()) } @@ -350,7 +350,7 @@ class TaskFormActivity : BaseActivity() { } }, configManager = configManager, - showEditButton = true, + showEditButton = true ) } } @@ -373,7 +373,7 @@ class TaskFormActivity : BaseActivity() { HabiticaTheme { TaskDifficultySelector( viewModel.taskDifficulty.value, - onSelect = { viewModel.taskDifficulty.value = it }, + onSelect = { viewModel.taskDifficulty.value = it } ) } } @@ -391,7 +391,7 @@ class TaskFormActivity : BaseActivity() { { viewModel.habitScoringNegative.value = !viewModel.habitScoringNegative.value - }, + } ) } } @@ -403,10 +403,10 @@ class TaskFormActivity : BaseActivity() { listOf( LabeledValue(getString(R.string.repeat_daily), HabitResetOption.DAILY), LabeledValue(getString(R.string.weekly), HabitResetOption.WEEKLY), - LabeledValue(getString(R.string.monthly), HabitResetOption.MONTHLY), + LabeledValue(getString(R.string.monthly), HabitResetOption.MONTHLY) ), { viewModel.habitResetOption.value = it }, - columnSize = 3, + columnSize = 3 ) } } @@ -420,9 +420,9 @@ class TaskFormActivity : BaseActivity() { LabeledValue(getString(R.string.strength), Attribute.STRENGTH), LabeledValue(getString(R.string.constitution), Attribute.CONSTITUTION), LabeledValue(getString(R.string.intelligence), Attribute.INTELLIGENCE), - LabeledValue(getString(R.string.perception), Attribute.PERCEPTION), + LabeledValue(getString(R.string.perception), Attribute.PERCEPTION) ), - { viewModel.selectedAttribute.value = it }, + { viewModel.selectedAttribute.value = it } ) } } @@ -437,7 +437,7 @@ class TaskFormActivity : BaseActivity() { override fun loadTheme( sharedPreferences: SharedPreferences, - forced: Boolean, + forced: Boolean ) { super.loadTheme(sharedPreferences, forced) val upperTintColor = @@ -722,9 +722,9 @@ class TaskFormActivity : BaseActivity() { ColorStateList( arrayOf( intArrayOf(-android.R.attr.state_checked), // unchecked - intArrayOf(android.R.attr.state_checked), // checked + intArrayOf(android.R.attr.state_checked) // checked ), - intArrayOf(getThemeColor(R.attr.colorTintedBackgroundOffset), tintColor), + intArrayOf(getThemeColor(R.attr.colorTintedBackgroundOffset), tintColor) ) tagView?.buttonTintList = colorStateList } @@ -818,7 +818,7 @@ class TaskFormActivity : BaseActivity() { val assignChanges = mapOf( "assign" to mutableListOf(), - "unassign" to mutableListOf(), + "unassign" to mutableListOf() ) if (groupID != null && thisTask.group?.groupID == null) { thisTask.group = TaskGroupPlan() @@ -857,7 +857,7 @@ class TaskFormActivity : BaseActivity() { setResult(Activity.RESULT_OK, resultIntent) finish() }, - 500, + 500 ) } @@ -887,7 +887,6 @@ class TaskFormActivity : BaseActivity() { } private fun checkIfShowNotifLayout() { - val alarmManager = this.getSystemService(Context.ALARM_SERVICE) as? AlarmManager var warnAboutInexact = false if (!pushNotificationManager.notificationPermissionEnabled() && Build.VERSION.SDK_INT >= 33) { @@ -912,8 +911,8 @@ class TaskFormActivity : BaseActivity() { binding.exactAlarmDisabledContainer.visibility = View.VISIBLE binding.exactAlarmDisabledContainer.setOnClickListener { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - val intent =Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM) - intent.setData(Uri.fromParts("package", applicationContext?.packageName, null)); + val intent = Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM) + intent.setData(Uri.fromParts("package", applicationContext?.packageName, null)) startActivity(intent) } } @@ -934,13 +933,13 @@ class TaskFormActivity : BaseActivity() { getString( R.string.delete_challenge_task_description, taskCount, - challenge?.name ?: "", - ), + challenge?.name ?: "" + ) ) alert.addButton( R.string.leave_delete_task, isPrimary = true, - isDestructive = true, + isDestructive = true ) { _, _ -> challenge?.let { lifecycleScope.launch(Dispatchers.Main) { @@ -953,7 +952,7 @@ class TaskFormActivity : BaseActivity() { alert.addButton( getString(R.string.leave_delete_x_tasks, taskCount), isPrimary = false, - isDestructive = true, + isDestructive = true ) { _, _ -> challenge?.let { lifecycleScope.launch(Dispatchers.Main) { @@ -982,12 +981,12 @@ class TaskFormActivity : BaseActivity() { dialog.setMessage( getString( R.string.broken_challenge_description, - taskCount, - ), + taskCount + ) ) dialog.addButton( getString(R.string.keep_x_tasks, taskCount), - true, + true ) { _, _ -> lifecycleScope.launch(Dispatchers.Main) { taskRepository.unlinkAllTasks(task.challengeID, "keep-all") @@ -997,7 +996,7 @@ class TaskFormActivity : BaseActivity() { dialog.addButton( getString(R.string.delete_x_tasks, taskCount), isPrimary = false, - isDestructive = true, + isDestructive = true ) { _, _ -> lifecycleScope.launch(Dispatchers.Main) { taskRepository.unlinkAllTasks(task.challengeID, "remove-all") @@ -1034,7 +1033,7 @@ class TaskFormActivity : BaseActivity() { assignedIDs.add(it) } }, - onClose, + onClose ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt index ee7ac7744..fb8c1e4d4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt @@ -74,23 +74,23 @@ import javax.inject.Inject @HiltViewModel class TaskSummaryViewModel - @Inject - constructor( - savedStateHandle: SavedStateHandle, - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val taskRepository: TaskRepository, - val socialRepository: SocialRepository, - val configManager: AppConfigManager, - ) : BaseViewModel(userRepository, userViewModel) { - val taskID: String = savedStateHandle[TaskFormActivity.TASK_ID_KEY] ?: "" +@Inject +constructor( + savedStateHandle: SavedStateHandle, + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val taskRepository: TaskRepository, + val socialRepository: SocialRepository, + val configManager: AppConfigManager +) : BaseViewModel(userRepository, userViewModel) { + val taskID: String = savedStateHandle[TaskFormActivity.TASK_ID_KEY] ?: "" - val task = taskRepository.getTask(taskID).asLiveData() + val task = taskRepository.getTask(taskID).asLiveData() - fun getMember(userID: String?): Flow { - return socialRepository.getMember(userID) - } + fun getMember(userID: String?): Flow { + return socialRepository.getMember(userID) } +} @AndroidEntryPoint class TaskSummaryActivity : BaseActivity() { @@ -121,7 +121,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { val topTextColor = if ((task?.value ?: 0.0) >= -20) { colorResource( - task?.extraDarkTaskColor ?: R.color.white, + task?.extraDarkTaskColor ?: R.color.white ) } else { Color.White @@ -137,7 +137,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { Column(Modifier.background(statusBarColor)) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(vertical = 2.dp), + modifier = Modifier.padding(vertical = 2.dp) ) { Button( onClick = { @@ -148,15 +148,15 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { MainNavigationController.navigateBack() }, colors = ButtonDefaults.textButtonColors(contentColor = darkestColor), - elevation = ButtonDefaults.buttonElevation(0.dp, 0.dp), + elevation = ButtonDefaults.buttonElevation(0.dp, 0.dp) ) { Image( painterResource(R.drawable.arrow_back), stringResource(R.string.action_back), colorFilter = - ColorFilter.tint( - topTextColor, - ), + ColorFilter.tint( + topTextColor + ) ) } Text( @@ -164,7 +164,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { fontSize = 18.sp, fontWeight = FontWeight.Medium, color = topTextColor, - modifier = Modifier.padding(start = 0.dp), + modifier = Modifier.padding(start = 0.dp) ) } Column( @@ -172,25 +172,25 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { .shadow(16.dp) .background( lightestColor, - RoundedCornerShape(topStart = 12.dp, topEnd = 12.dp), + RoundedCornerShape(topStart = 12.dp, topEnd = 12.dp) ) .padding(20.dp, 5.dp) .fillMaxWidth() - .fillMaxHeight(), + .fillMaxHeight() ) { Text( stringResource(R.string.title), fontSize = 16.sp, color = darkestColor, fontWeight = FontWeight.Medium, - modifier = titleModifier, + modifier = titleModifier ) Text( task?.text ?: "", fontSize = 16.sp, color = darkestColor, fontWeight = FontWeight.Normal, - modifier = textModifier, + modifier = textModifier ) if (task?.notes?.isNotBlank() == true) { Text( @@ -198,14 +198,14 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { fontSize = 16.sp, color = darkestColor, fontWeight = FontWeight.Medium, - modifier = titleModifier, + modifier = titleModifier ) Text( task?.notes ?: "", fontSize = 16.sp, color = darkestColor, fontWeight = FontWeight.Normal, - modifier = textModifier, + modifier = textModifier ) } if (task?.type != TaskType.REWARD) { @@ -214,14 +214,14 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { fontSize = 16.sp, color = darkestColor, fontWeight = FontWeight.Medium, - modifier = titleModifier, + modifier = titleModifier ) Text( task?.let { taskDescriptionBuilder.describe(it) }!!.makeBoldComposable(), fontSize = 16.sp, color = darkestColor, fontWeight = FontWeight.Normal, - modifier = textModifier, + modifier = textModifier ) } if (task?.type == TaskType.REWARD) { @@ -230,26 +230,26 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { fontSize = 16.sp, color = darkestColor, fontWeight = FontWeight.Medium, - modifier = titleModifier.padding(bottom = 4.dp), + modifier = titleModifier.padding(bottom = 4.dp) ) Row( horizontalArrangement = Arrangement.spacedBy(12.dp), modifier = - Modifier - .padding(vertical = 4.dp) - .background( - HabiticaTheme.colors.windowBackgroundFor(task), - MaterialTheme.shapes.medium, - ) - .padding(15.dp) - .fillMaxWidth(), + Modifier + .padding(vertical = 4.dp) + .background( + HabiticaTheme.colors.windowBackgroundFor(task), + MaterialTheme.shapes.medium + ) + .padding(15.dp) + .fillMaxWidth() ) { Image(HabiticaIconsHelper.imageOfGold().asImageBitmap(), null) Text( "${task?.value}", fontSize = 16.sp, fontWeight = FontWeight.Medium, - color = darkestColor, + color = darkestColor ) } } @@ -260,7 +260,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { fontSize = 16.sp, color = darkestColor, fontWeight = FontWeight.Medium, - modifier = titleModifier.padding(bottom = 4.dp), + modifier = titleModifier.padding(bottom = 4.dp) ) for (item in checklist) { Text( @@ -269,14 +269,14 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { fontWeight = FontWeight.Medium, color = darkestColor, modifier = - Modifier - .padding(vertical = 4.dp) - .background( - HabiticaTheme.colors.windowBackgroundFor(task), - MaterialTheme.shapes.medium, - ) - .padding(15.dp) - .fillMaxWidth(), + Modifier + .padding(vertical = 4.dp) + .background( + HabiticaTheme.colors.windowBackgroundFor(task), + MaterialTheme.shapes.medium + ) + .padding(15.dp) + .fillMaxWidth() ) } } @@ -287,7 +287,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { fontSize = 16.sp, color = darkestColor, fontWeight = FontWeight.Medium, - modifier = titleModifier.padding(bottom = 4.dp), + modifier = titleModifier.padding(bottom = 4.dp) ) for (item in task?.group?.assignedUsersDetail ?: emptyList()) { val member = viewModel.getMember(item.assignedUserID).collectAsState(null) @@ -298,7 +298,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { .padding(vertical = 4.dp) .background( HabiticaTheme.colors.windowBackgroundFor(task), - MaterialTheme.shapes.medium, + MaterialTheme.shapes.medium ) .padding(15.dp, 12.dp) .heightIn(min = 24.dp) @@ -306,15 +306,15 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { color = darkestColor, configManager = viewModel.configManager, extraContent = - if (item.completed) { - ( - { - CompletedAt(item.completedDate) - } + if (item.completed) { + ( + { + CompletedAt(item.completedDate) + } ) - } else { - null - }, + } else { + null + } ) } task?.group?.assignedUsersDetail?.find { it.assignedUserID == viewModel.userViewModel.userID } @@ -327,11 +327,11 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { stringResource( R.string.assigned_to_you_by, it.assigningUsername ?: "", - formatter.format(it.assignedDate ?: Date()), + formatter.format(it.assignedDate ?: Date()) ), fontSize = 14.sp, color = HabiticaTheme.colors.textSecondaryFor(task), - modifier = Modifier.padding(horizontal = 12.dp, vertical = 10.dp), + modifier = Modifier.padding(horizontal = 12.dp, vertical = 10.dp) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt index dc62eb210..8a367aad9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt @@ -8,10 +8,10 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.AchievementChallengeItemBinding import com.habitrpg.android.habitica.databinding.AchievementQuestItemBinding import com.habitrpg.android.habitica.databinding.AchievementSectionHeaderBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.Achievement import com.habitrpg.android.habitica.models.QuestAchievement import com.habitrpg.android.habitica.ui.views.dialogs.AchievementDetailDialog +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.views.PixelArtView @@ -21,7 +21,7 @@ class AchievementsAdapter : RecyclerView.Adapter() { override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder { return when (viewType) { 0 -> SectionViewHolder(parent.inflate(R.layout.achievement_section_header)) @@ -33,14 +33,14 @@ class AchievementsAdapter : RecyclerView.Adapter() { parent.inflate(R.layout.achievement_grid_item) } else { parent.inflate(R.layout.achievement_list_item) - }, + } ) } } override fun onBindViewHolder( holder: RecyclerView.ViewHolder, - position: Int, + position: Int ) { when (val entry = entries[position]) { is Achievement -> (holder as? AchievementViewHolder)?.bind(entry) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/BaseRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/BaseRecyclerViewAdapter.kt index 5e43fb147..85160635b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/BaseRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/BaseRecyclerViewAdapter.kt @@ -6,7 +6,7 @@ import com.habitrpg.android.habitica.models.BaseMainObject open class DiffCallback( protected val oldList: List, - protected val newList: List, + protected val newList: List ) : DiffUtil.Callback() { override fun getOldListSize(): Int { @@ -19,14 +19,14 @@ open class DiffCallback( override fun areItemsTheSame( oldItemPosition: Int, - newItemPosition: Int, + newItemPosition: Int ): Boolean { return oldList[oldItemPosition].primaryIdentifier == newList[newItemPosition].primaryIdentifier } override fun areContentsTheSame( oldItemPosition: Int, - newItemPosition: Int, + newItemPosition: Int ): Boolean { val oldItem = oldList[oldItemPosition] val newItem = newList[newItemPosition] @@ -38,7 +38,7 @@ abstract class BaseRecyclerViewAdapter() { open fun getDiffCallback( oldList: List, - newList: List, + newList: List ): DiffCallback? { return null } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt index 0d9021a44..90d0c115c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt @@ -3,24 +3,13 @@ package com.habitrpg.android.habitica.ui.adapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView import androidx.core.content.ContextCompat -import androidx.core.os.bundleOf import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.CustomizationGridItemBinding -import com.habitrpg.android.habitica.databinding.DialogPurchaseCustomizationBinding import com.habitrpg.android.habitica.models.inventory.CustomizationSet import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.shops.ShopItem -import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper -import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog -import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog import com.habitrpg.common.habitica.extensions.loadImage -import com.habitrpg.common.habitica.helpers.MainNavigationController -import com.habitrpg.common.habitica.views.AvatarView -import com.habitrpg.common.habitica.views.PixelArtView class CustomizationEquipmentRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerView.Adapter() { @@ -43,7 +32,7 @@ class CustomizationEquipmentRecyclerViewAdapter : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): androidx.recyclerview.widget.RecyclerView.ViewHolder { val viewID: Int = R.layout.customization_grid_item @@ -53,7 +42,7 @@ class CustomizationEquipmentRecyclerViewAdapter : override fun onBindViewHolder( holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, - position: Int, + position: Int ) { (holder as EquipmentViewHolder).bind(equipmentList[position]) } @@ -113,7 +102,7 @@ class CustomizationEquipmentRecyclerViewAdapter : binding.wrapper.background = ContextCompat.getDrawable( itemView.context, - R.drawable.layout_rounded_bg_window_tint_border, + R.drawable.layout_rounded_bg_window_tint_border ) } else { binding.wrapper.background = @@ -132,7 +121,7 @@ class CustomizationEquipmentRecyclerViewAdapter : onShowPurchaseDialog?.invoke( ShopItem.fromAnimalEquipment( equipment - ), + ) ) return } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt index ca13a1c33..bacea6f9f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt @@ -43,7 +43,7 @@ class CustomizationRecyclerViewAdapter : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): androidx.recyclerview.widget.RecyclerView.ViewHolder { return when (viewType) { 0 -> { @@ -76,7 +76,7 @@ class CustomizationRecyclerViewAdapter : override fun onBindViewHolder( holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, - position: Int, + position: Int ) { val obj = customizationList[position] if (getItemViewType(position) == 0) { @@ -120,12 +120,12 @@ class CustomizationRecyclerViewAdapter : val isUsable = customization.isUsable(isOwned) if (customization.availableFrom != null || customization.availableUntil != null) { if (( - ( - customization.availableFrom?.compareTo(today) - ?: 0 + ( + customization.availableFrom?.compareTo(today) + ?: 0 ) > 0 || ( - customization.availableUntil?.compareTo(today) - ?: 0 + customization.availableUntil?.compareTo(today) + ?: 0 ) < 0 ) && !isUsable ) { @@ -205,7 +205,7 @@ class CustomizationRecyclerViewAdapter : binding.wrapper.background = ContextCompat.getDrawable( itemView.context, - R.drawable.layout_rounded_bg_window_tint_border, + R.drawable.layout_rounded_bg_window_tint_border ) } else { binding.wrapper.background = @@ -232,8 +232,8 @@ class CustomizationRecyclerViewAdapter : ShopItem.fromCustomization( it, userSize, - hairColor, - ), + hairColor + ) ) } } @@ -257,7 +257,7 @@ class CustomizationRecyclerViewAdapter : ShopItem.fromCustomization( it, userSize, - hairColor, + hairColor ).imageName } purchasedCustomizationView.findViewById(R.id.avatar_view) @@ -329,8 +329,8 @@ class CustomizationRecyclerViewAdapter : it, additionalSetItems, userSize, - hairColor, - ), + hairColor + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt index 5f73843b4..7cbf30bb6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt @@ -7,7 +7,6 @@ import androidx.compose.ui.platform.ComposeView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.WorldStateEvent import com.habitrpg.android.habitica.models.promotions.HabiticaPromotion import com.habitrpg.android.habitica.ui.menu.HabiticaDrawerItem @@ -18,6 +17,7 @@ import com.habitrpg.android.habitica.ui.views.promo.PromoMenuViewHolder import com.habitrpg.android.habitica.ui.views.promo.SubscriptionBuyGemsPromoView import com.habitrpg.android.habitica.ui.views.promo.SubscriptionBuyGemsPromoViewHolder import com.habitrpg.common.habitica.extensions.dpToPx +import com.habitrpg.common.habitica.extensions.inflate import java.util.Date class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : @@ -77,7 +77,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : override fun onBindViewHolder( holder: RecyclerView.ViewHolder, - position: Int, + position: Int ) { val drawerItem = getItem(position) when { @@ -129,7 +129,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder { return when (viewType) { 2 -> { @@ -137,7 +137,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : itemView.layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - 148.dpToPx(parent.context), + 148.dpToPx(parent.context) ) SubscriptionBuyGemsPromoViewHolder(itemView) } @@ -147,7 +147,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : promoView.layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - 118.dpToPx(parent.context), + 118.dpToPx(parent.context) ) PromoMenuViewHolder(promoView) } @@ -168,7 +168,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : fun bind( drawerItem: HabiticaDrawerItem, - isSelected: Boolean, + isSelected: Boolean ) { titleTextView?.text = drawerItem.text @@ -176,8 +176,8 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : itemView.setBackgroundColor( ContextCompat.getColor( itemView.context, - R.color.content_background_offset, - ), + R.color.content_background_offset + ) ) itemView.background.alpha = 69 titleTextView?.setTextColor(tintColor) @@ -185,14 +185,14 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : itemView.setBackgroundColor( ContextCompat.getColor( itemView.context, - R.color.content_background, - ), + R.color.content_background + ) ) titleTextView?.setTextColor( ContextCompat.getColor( itemView.context, - R.color.text_primary, - ), + R.color.text_primary + ) ) } @@ -208,7 +208,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : pillView.background = drawerItem.pillBackground ?: ContextCompat.getDrawable( itemView.context, - R.drawable.pill_bg_purple_200, + R.drawable.pill_bg_purple_200 ) pillView.setTextColor(ContextCompat.getColor(itemView.context, R.color.white)) pillView.setPadding(pL, pT, pR, pB) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SimpleSpinnerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SimpleSpinnerAdapter.kt index d24c6b7a4..2347c3f94 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SimpleSpinnerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SimpleSpinnerAdapter.kt @@ -12,12 +12,12 @@ class SimpleSpinnerAdapter(context: Context, resource: Int) : ArrayAdapter 0) { label.visibility = View.VISIBLE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/HabiticaClassArrayAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/HabiticaClassArrayAdapter.kt index 1ba129309..22306a1e7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/HabiticaClassArrayAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/HabiticaClassArrayAdapter.kt @@ -8,35 +8,35 @@ import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import com.habitrpg.common.habitica.extensions.inflate class HabiticaClassArrayAdapter(context: Context, resource: Int, objects: List) : ArrayAdapter(context, resource, R.id.textView, objects) { override fun getDropDownView( position: Int, convertView: View?, - parent: ViewGroup?, + parent: ViewGroup? ): View = createView( position, - convertView ?: parent?.inflate(R.layout.class_spinner_dropdown_item, false), + convertView ?: parent?.inflate(R.layout.class_spinner_dropdown_item, false) ) override fun getView( position: Int, convertView: View?, - parent: ViewGroup, + parent: ViewGroup ): View = createView( position, - convertView ?: parent.inflate(R.layout.class_spinner_dropdown_item_selected, false), + convertView ?: parent.inflate(R.layout.class_spinner_dropdown_item_selected, false) ) private fun createView( position: Int, - row: View?, + row: View? ): View { val textView: TextView? = row?.findViewById(R.id.textView) val imageView: ImageView? = row?.findViewById(R.id.classIconView) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt index bcacfdbc5..0394ab471 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt @@ -62,7 +62,7 @@ class ItemRecyclerAdapter(val context: Context) : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): ViewHolder { return if (viewType == 0) { ItemViewHolder(ItemItemBinding.inflate(context.layoutInflater, parent, false)) @@ -73,7 +73,7 @@ class ItemRecyclerAdapter(val context: Context) : override fun onBindViewHolder( holder: ViewHolder, - position: Int, + position: Int ) { if (position < data.size) { val ownedItem = data[position] as OwnedItem @@ -94,7 +94,7 @@ class ItemRecyclerAdapter(val context: Context) : "food" -> context.getString(R.string.food_footer_description) "hatchingPotions" -> context.getString(R.string.hatchingPotions_footer_description) else -> "" - }, + } ) } typedHolder.itemView.setOnClickListener { @@ -154,7 +154,7 @@ class ItemRecyclerAdapter(val context: Context) : fun bind( ownedItem: OwnedItem, - item: Item?, + item: Item? ) { this.ownedItem = ownedItem this.item = item @@ -187,7 +187,7 @@ class ItemRecyclerAdapter(val context: Context) : private fun getImageName( item: Item? = null, - ownedItem: OwnedItem? = null, + ownedItem: OwnedItem? = null ): String { if (ownedItem != null && ownedItem.itemType == "special") { return "shop_" + ownedItem.key @@ -236,8 +236,8 @@ class ItemRecyclerAdapter(val context: Context) : resources.getString(R.string.sell_no_price), true, "gold", - item?.value?.toDouble() ?: 0.0, - ), + item?.value?.toDouble() ?: 0.0 + ) ) } if (item is Egg) { @@ -277,7 +277,7 @@ class ItemRecyclerAdapter(val context: Context) : ownedItem?.let { selectedOwnedItem -> onSellItem?.invoke( selectedItem, - selectedOwnedItem, + selectedOwnedItem ) } return@let diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.kt index af9aa2481..26f73d351 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.kt @@ -27,7 +27,7 @@ class MountDetailRecyclerAdapter : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): androidx.recyclerview.widget.RecyclerView.ViewHolder = when (viewType) { 1 -> SectionViewHolder(parent) @@ -36,7 +36,7 @@ class MountDetailRecyclerAdapter : override fun onBindViewHolder( holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, - position: Int, + position: Int ) { when (val obj = this.itemList[position]) { is StableSection -> (holder as? SectionViewHolder)?.bind(obj) @@ -44,7 +44,7 @@ class MountDetailRecyclerAdapter : (holder as? MountViewHolder)?.bind( obj, ownedMounts?.get(obj.key)?.owned == true, - currentMount, + currentMount ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt index df41b9b4f..abf6ceb6f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt @@ -4,7 +4,6 @@ import android.view.View import android.view.ViewGroup import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.CanHatchItemBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.inventory.Animal import com.habitrpg.android.habitica.models.inventory.Egg import com.habitrpg.android.habitica.models.inventory.Food @@ -18,6 +17,7 @@ import com.habitrpg.android.habitica.models.user.OwnedPet import com.habitrpg.android.habitica.ui.viewHolders.PetViewHolder import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder import com.habitrpg.android.habitica.ui.views.dialogs.PetSuggestHatchDialog +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.helpers.Animations import com.habitrpg.shared.habitica.models.responses.FeedResponse @@ -67,7 +67,7 @@ class PetDetailRecyclerAdapter : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): androidx.recyclerview.widget.RecyclerView.ViewHolder = when (viewType) { 1 -> SectionViewHolder(parent) @@ -77,7 +77,7 @@ class PetDetailRecyclerAdapter : override fun onBindViewHolder( holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, - position: Int, + position: Int ) { when (val obj = this.itemList[position]) { is StableSection -> { @@ -95,7 +95,7 @@ class PetDetailRecyclerAdapter : potionCount, ownedItems?.get(obj.animal + "-eggs") != null, ownedItems?.get(obj.color + "-hatchingPotions") != null, - ownedMounts?.containsKey(obj.key) == true, + ownedMounts?.containsKey(obj.key) == true ) } else { (holder as? PetViewHolder)?.bind( @@ -108,7 +108,7 @@ class PetDetailRecyclerAdapter : ownedItems?.get(obj.animal + "-eggs") != null, ownedItems?.get(obj.color + "-hatchingPotions") != null, ownedMounts?.containsKey(obj.key) == true, - currentPet, + currentPet ) } } @@ -122,8 +122,8 @@ class PetDetailRecyclerAdapter : } else { val pet = itemList[position] as Pet if (( - ownedPets?.get(pet.key)?.trained - ?: 0 + ownedPets?.get(pet.key)?.trained + ?: 0 ) <= 0 && eggCount(pet) > 0 && potionCount(pet) > 0 ) { 2 @@ -156,7 +156,7 @@ class PetDetailRecyclerAdapter : ( ownedItems["Saddle-food"]?.numberOwned ?: 0 - ) > 0 + ) > 0 } else { false } @@ -165,7 +165,7 @@ class PetDetailRecyclerAdapter : class CanHatchViewHolder( parent: ViewGroup, - private val ingredientsReceiver: ((Animal, ((Pair) -> Unit)) -> Unit)?, + private val ingredientsReceiver: ((Animal, ((Pair) -> Unit)) -> Unit)? ) : androidx.recyclerview.widget.RecyclerView.ViewHolder(parent.inflate(R.layout.can_hatch_item)), View.OnClickListener { private var binding = CanHatchItemBinding.bind(itemView) @@ -187,7 +187,7 @@ class PetDetailRecyclerAdapter : potionCount: Int, hasUnlockedEgg: Boolean, hasUnlockedPotion: Boolean, - hasMount: Boolean, + hasMount: Boolean ) { this.animal = item this.eggCount = eggCount @@ -216,7 +216,7 @@ class PetDetailRecyclerAdapter : potionCount, hasUnlockedEgg, hasUnlockedPotion, - hasMount, + hasMount ) dialog.show() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt index 373004474..cb0f81843 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt @@ -12,7 +12,6 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.ShopArmoireGearBinding import com.habitrpg.android.habitica.databinding.ShopHeaderBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.helpers.Analytics import com.habitrpg.android.habitica.helpers.EventCategory import com.habitrpg.android.habitica.helpers.HitType @@ -30,6 +29,7 @@ import com.habitrpg.android.habitica.ui.views.getTranslatedClassName import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientGemsDialog import com.habitrpg.common.habitica.extensions.dpToPx import com.habitrpg.common.habitica.extensions.fromHtml +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.helpers.MainNavigationController @@ -109,7 +109,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter ShopHeaderViewHolder(parent) @@ -137,7 +137,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter -> (holder as? ArmoireGearViewHolder)?.bind( obj.first as? String ?: "", - obj.second as? Int ?: 0, + obj.second as? Int ?: 0 ) } } @@ -270,10 +270,10 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter selectedGearCategory?.items?.get(position - 2) @@ -351,7 +351,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter() { ( ownedItems["Saddle-food"]?.numberOwned ?: 0 - ) > 0 + ) > 0 } else { false } @@ -107,7 +107,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder = when (viewType) { 1 -> SectionViewHolder(parent) @@ -121,7 +121,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { override fun onBindViewHolder( holder: RecyclerView.ViewHolder, - position: Int, + position: Int ) { when (val item = this.itemList[position]) { "header" -> (holder as? StableHeaderViewHolder)?.bind() @@ -148,7 +148,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { potionCount, ownedItems?.get(item.animal + "-eggs") != null, ownedItems?.get(item.color + "-hatchingPotions") != null, - ownedMounts?.containsKey(item.key) == true, + ownedMounts?.containsKey(item.key) == true ) } else { (holder as? PetViewHolder)?.bind( @@ -161,7 +161,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { ownedItems?.get(item.animal + "-eggs") != null, ownedItems?.get(item.color + "-hatchingPotions") != null, ownedMounts?.containsKey(item.key) == true, - currentPet, + currentPet ) } } else if (item is Mount) { @@ -188,8 +188,8 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { if (isIndividualAnimal) { if (item is Pet) { if (( - ownedPets?.get(item.key)?.trained - ?: 0 + ownedPets?.get(item.key)?.trained + ?: 0 ) <= 0 && eggCount(item) > 0 && potionCount(item) > 0 ) { 22 @@ -226,8 +226,8 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { binding.root.setBackgroundColor( ContextCompat.getColor( itemView.context, - R.color.window_background, - ), + R.color.window_background + ) ) } @@ -275,7 +275,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { context.getString( R.string.pet_ownership_fraction, item.numberOwned, - item.totalNumber, + item.totalNumber ) this.ownedTextView.background = ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_shopitem_price) @@ -295,7 +295,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { this.ownedTextView.background = ContextCompat.getDrawable( context, - R.drawable.layout_rounded_bg_animalitem_complete, + R.drawable.layout_rounded_bg_animalitem_complete ) this.ownedTextView.setTextColor(ContextCompat.getColor(context, R.color.white)) } @@ -312,16 +312,16 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { StableFragmentDirections.openPetDetail( animal.animal, animal.type ?: "", - color, - ), + color + ) ) } else { MainNavigationController.navigate( StableFragmentDirections.openMountDetail( animal.animal, animal.type ?: "", - color, - ), + color + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/CustomizationSetupAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/CustomizationSetupAdapter.kt index 8b0cc61d0..e053ac426 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/CustomizationSetupAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/CustomizationSetupAdapter.kt @@ -8,9 +8,9 @@ import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.SetupCustomizationRepository import com.habitrpg.android.habitica.databinding.SetupCustomizationItemBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.SetupCustomization import com.habitrpg.android.habitica.models.user.User +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.extensions.setTintWith internal class CustomizationSetupAdapter : @@ -29,14 +29,14 @@ internal class CustomizationSetupAdapter : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): CustomizationViewHolder { return CustomizationViewHolder(parent.inflate(R.layout.setup_customization_item)) } override fun onBindViewHolder( holder: CustomizationViewHolder, - position: Int, + position: Int ) { holder.bind(customizationList[position]) } @@ -62,13 +62,13 @@ internal class CustomizationSetupAdapter : SetupCustomizationRepository.SUBCATEGORY_BANGS -> Integer.parseInt(customization.key) == prefs.hair?.bangs SetupCustomizationRepository.SUBCATEGORY_PONYTAIL -> Integer.parseInt( - customization.key, + customization.key ) == prefs.hair?.base SetupCustomizationRepository.SUBCATEGORY_COLOR -> customization.key == prefs.hair?.color SetupCustomizationRepository.SUBCATEGORY_FLOWER -> Integer.parseInt( - customization.key, + customization.key ) == prefs.hair?.flower else -> false @@ -80,7 +80,7 @@ internal class CustomizationSetupAdapter : SetupCustomizationRepository.SUBCATEGORY_GLASSES -> customization.key == this.user?.items?.gear?.equipped?.eyeWear || "eyewear_base_0" == this.user?.items?.gear?.equipped?.eyeWear && customization.key.isEmpty() SetupCustomizationRepository.SUBCATEGORY_FLOWER -> Integer.parseInt( - customization.key, + customization.key ) == prefs.hair?.flower SetupCustomizationRepository.SUBCATEGORY_WHEELCHAIR -> "chair_" + customization.key == prefs.chair || customization.key == prefs.chair || customization.key == "none" && prefs.chair == null @@ -108,21 +108,21 @@ internal class CustomizationSetupAdapter : when { customization.drawableId != null -> binding.imageView.setImageResource( - customization.drawableId ?: 0, + customization.drawableId ?: 0 ) customization.colorId != null -> { val drawable = ContextCompat.getDrawable( itemView.context, - R.drawable.setup_customization_circle, + R.drawable.setup_customization_circle ) drawable?.setTintWith( ContextCompat.getColor( itemView.context, - customization.colorId ?: 0, + customization.colorId ?: 0 ), - PorterDuff.Mode.MULTIPLY, + PorterDuff.Mode.MULTIPLY ) binding.imageView.setImageDrawable(drawable) } @@ -142,16 +142,16 @@ internal class CustomizationSetupAdapter : binding.textView.setTextColor( ContextCompat.getColor( itemView.context, - R.color.white, - ), + R.color.white + ) ) } else { binding.imageView.setBackgroundResource(R.drawable.setup_customization_bg) binding.textView.setTextColor( ContextCompat.getColor( itemView.context, - R.color.white_50_alpha, - ), + R.color.white_50_alpha + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/TaskSetupAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/TaskSetupAdapter.kt index fe48d0bfd..6e3c00b19 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/TaskSetupAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/TaskSetupAdapter.kt @@ -27,14 +27,14 @@ class TaskSetupAdapter : RecyclerView.Adapter() override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): TaskViewHolder { return TaskViewHolder(parent.inflate(R.layout.task_setup_item)) } override fun onBindViewHolder( holder: TaskViewHolder, - position: Int, + position: Int ) { holder.bind(this.taskList[position], this.checkedList[position]) } @@ -61,13 +61,13 @@ class TaskSetupAdapter : RecyclerView.Adapter() VectorDrawableCompat.create(context.resources, R.drawable.ic_check_white_18dp, null) icon?.setTintWith( ContextCompat.getColor(context, R.color.brand_100), - PorterDuff.Mode.MULTIPLY, + PorterDuff.Mode.MULTIPLY ) } fun bind( taskGroup: List, - isChecked: Boolean?, + isChecked: Boolean? ) { this.taskGroup = taskGroup this.isChecked = isChecked @@ -79,14 +79,14 @@ class TaskSetupAdapter : RecyclerView.Adapter() this.textView.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null) textView.background.setTintWith( ContextCompat.getColor(context, R.color.white), - PorterDuff.Mode.MULTIPLY, + PorterDuff.Mode.MULTIPLY ) textView.setTextColor(ContextCompat.getColor(context, R.color.brand_100)) } else { this.textView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) textView.background.setTintWith( ContextCompat.getColor(context, R.color.brand_100), - PorterDuff.Mode.MULTIPLY, + PorterDuff.Mode.MULTIPLY ) textView.setTextColor(ContextCompat.getColor(context, R.color.white)) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementProfileAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementProfileAdapter.kt index b7c1fe689..a2110c003 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementProfileAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementProfileAdapter.kt @@ -5,11 +5,11 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.ProfileAchievementItemBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.Achievement import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder import com.habitrpg.android.habitica.ui.views.dialogs.AchievementDetailDialog +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.extensions.loadImage class AchievementProfileAdapter : RecyclerView.Adapter() { @@ -24,7 +24,7 @@ class AchievementProfileAdapter : RecyclerView.Adapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder { return if (viewType == 0) { SectionViewHolder(parent.inflate(R.layout.profile_achievement_category)) @@ -35,7 +35,7 @@ class AchievementProfileAdapter : RecyclerView.Adapter( override fun onBindViewHolder( holder: RecyclerView.ViewHolder, - position: Int, + position: Int ) { val obj = this.itemList[position] if (obj.javaClass == String::class.java) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt index 6e77a4a21..818e8db7d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt @@ -5,18 +5,18 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.ChallengeItemBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.social.Challenge import com.habitrpg.android.habitica.models.social.ChallengeMembership import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeFilterOptions import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.helpers.EmojiParser import io.realm.OrderedRealmCollection class ChallengesListViewAdapter( private val viewUserChallengesOnly: Boolean, - private val userId: String, + private val userId: String ) : BaseRecyclerViewAdapter() { private var unfilteredData: List? = null private var challengeMemberships: List? = null @@ -25,19 +25,19 @@ class ChallengesListViewAdapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): ChallengeViewHolder { return ChallengeViewHolder(parent.inflate(R.layout.challenge_item), viewUserChallengesOnly) } override fun onBindViewHolder( holder: ChallengeViewHolder, - position: Int, + position: Int ) { data[position].let { challenge -> holder.bind( challenge, - challengeMemberships?.first { challenge.id == it.challengeID } != null, + challengeMemberships?.first { challenge.id == it.challengeID } != null ) holder.itemView.setOnClickListener { if (challenge.isManaged && challenge.isValid) { @@ -85,7 +85,7 @@ class ChallengesListViewAdapter( class ChallengeViewHolder internal constructor( itemView: View, - private val viewUserChallengesOnly: Boolean, + private val viewUserChallengesOnly: Boolean ) : RecyclerView.ViewHolder(itemView) { private val binding = ChallengeItemBinding.bind(itemView) @@ -97,7 +97,7 @@ class ChallengesListViewAdapter( fun bind( challenge: Challenge, - isParticipating: Boolean, + isParticipating: Boolean ) { this.challenge = challenge diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.kt index e2b86bafa..47cc7fbca 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.kt @@ -6,29 +6,28 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.SystemChatMessageBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.BaseMainObject import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter import com.habitrpg.android.habitica.ui.adapter.DiffCallback import com.habitrpg.android.habitica.ui.viewHolders.ChatRecyclerMessageViewHolder +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.helpers.LanguageHelper import java.text.DateFormat -import java.text.SimpleDateFormat class ChatDiffCallback(oldList: List, newList: List) : DiffCallback(oldList, newList) { override fun areItemsTheSame( oldItemPosition: Int, - newItemPosition: Int, + newItemPosition: Int ): Boolean { return oldList[oldItemPosition].primaryIdentifier == newList[newItemPosition].primaryIdentifier } override fun areContentsTheSame( oldItemPosition: Int, - newItemPosition: Int, + newItemPosition: Int ): Boolean { val oldItem = oldList[oldItemPosition] as ChatMessage val newItem = newList[newItemPosition] as ChatMessage @@ -56,7 +55,7 @@ class ChatRecyclerViewAdapter(user: User?, private val isTavern: Boolean) : override fun getDiffCallback( oldList: List, - newList: List, + newList: List ): DiffCallback { return ChatDiffCallback(oldList, newList) } @@ -67,7 +66,7 @@ class ChatRecyclerViewAdapter(user: User?, private val isTavern: Boolean) : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder { return if (viewType == 0) { SystemChatMessageViewHolder(parent.inflate(R.layout.system_chat_message)) @@ -78,14 +77,14 @@ class ChatRecyclerViewAdapter(user: User?, private val isTavern: Boolean) : override fun onBindViewHolder( holder: RecyclerView.ViewHolder, - position: Int, + position: Int ) { if (data[position].isSystemMessage) { val sysChatHolder = holder as? SystemChatMessageViewHolder ?: return val message = data[position] sysChatHolder.bind( message, - expandedMessageId == data[position].id, + expandedMessageId == data[position].id ) sysChatHolder.onShouldExpand = { expandMessage(message, position) } } else { @@ -95,7 +94,7 @@ class ChatRecyclerViewAdapter(user: User?, private val isTavern: Boolean) : message, uuid, user, - expandedMessageId == message.id, + expandedMessageId == message.id ) chatHolder.onShouldExpand = { expandMessage(message, position) } chatHolder.onLikeMessage = onMessageLike @@ -114,7 +113,7 @@ class ChatRecyclerViewAdapter(user: User?, private val isTavern: Boolean) : private fun expandMessage( message: ChatMessage, - position: Int?, + position: Int? ) { expandedMessageId = if (expandedMessageId == message.id) { @@ -140,7 +139,7 @@ class SystemChatMessageViewHolder(itemView: View) : RecyclerView.ViewHolder(item fun bind( chatMessage: ChatMessage?, - isExpanded: Boolean, + isExpanded: Boolean ) { binding.textView.text = chatMessage?.text?.removePrefix("`")?.removeSuffix("`") binding.systemMessageTimestamp.text = diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/InboxAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/InboxAdapter.kt index 1e7d4ecc5..45b84334b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/InboxAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/InboxAdapter.kt @@ -4,13 +4,13 @@ import android.view.ViewGroup import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil import com.habitrpg.android.habitica.R -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.viewHolders.ChatRecyclerIntroViewHolder import com.habitrpg.android.habitica.ui.viewHolders.ChatRecyclerMessageViewHolder import com.habitrpg.android.habitica.ui.viewHolders.ChatRecyclerViewHolder +import com.habitrpg.common.habitica.extensions.inflate class InboxAdapter(private var user: User?) : PagingDataAdapter(DIFF_CALLBACK) { @@ -37,12 +37,12 @@ class InboxAdapter(private var user: User?) : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): ChatRecyclerViewHolder { return if (viewType == FIRST_MESSAGE) { ChatRecyclerIntroViewHolder( parent.inflate(R.layout.tavern_chat_intro_item), - replyToUser?.id ?: "", + replyToUser?.id ?: "" ) } else { ChatRecyclerMessageViewHolder(parent.inflate(R.layout.chat_item), user?.id ?: "", false) @@ -51,7 +51,7 @@ class InboxAdapter(private var user: User?) : override fun onBindViewHolder( holder: ChatRecyclerViewHolder, - position: Int, + position: Int ) { val firstMessage: Boolean = getItemViewType(position) == FIRST_MESSAGE if (firstMessage) { @@ -65,7 +65,7 @@ class InboxAdapter(private var user: User?) : message, user?.id ?: "", user, - expandedMessageId == message.id, + expandedMessageId == message.id ) messageHolder.onShouldExpand = { expandMessage(message.id, position) } messageHolder.onOpenProfile = onOpenProfile @@ -78,7 +78,7 @@ class InboxAdapter(private var user: User?) : private fun expandMessage( id: String, - position: Int, + position: Int ) { if (isPositionIntroMessage(position)) { return @@ -103,12 +103,12 @@ class InboxAdapter(private var user: User?) : // but ID is fixed. override fun areItemsTheSame( oldConcert: ChatMessage, - newConcert: ChatMessage, + newConcert: ChatMessage ) = oldConcert.id == newConcert.id override fun areContentsTheSame( oldConcert: ChatMessage, - newConcert: ChatMessage, + newConcert: ChatMessage ) = oldConcert.text == newConcert.text } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PartyMemberRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PartyMemberRecyclerViewAdapter.kt index b06e22551..0da64a2b4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PartyMemberRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PartyMemberRecyclerViewAdapter.kt @@ -2,10 +2,10 @@ package com.habitrpg.android.habitica.ui.adapter.social import android.view.ViewGroup import com.habitrpg.android.habitica.R -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter import com.habitrpg.android.habitica.ui.viewHolders.GroupMemberViewHolder +import com.habitrpg.common.habitica.extensions.inflate class PartyMemberRecyclerViewAdapter : BaseRecyclerViewAdapter() { var leaderID: String? = null @@ -14,14 +14,14 @@ class PartyMemberRecyclerViewAdapter : BaseRecyclerViewAdapter>(TaskType.HABIT, viewModel, layoutResource, newContext, userID) { val taskList: MutableList get() = content?.map { t -> t }?.toMutableList() ?: mutableListOf() @@ -45,7 +45,7 @@ class ChallengeTasksRecyclerViewAdapter( fun addTaskUnder( taskToAdd: Task, - taskAbove: Task?, + taskAbove: Task? ): Int { val position = content?.indexOfFirst { t -> t.id == taskAbove?.id } ?: 0 @@ -69,7 +69,7 @@ class ChallengeTasksRecyclerViewAdapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): BindableViewHolder { val viewHolder: BindableViewHolder = when (viewType) { @@ -121,7 +121,7 @@ class ChallengeTasksRecyclerViewAdapter( inner class AddItemViewHolder internal constructor( itemView: View, - private val callback: ((Task) -> Unit)?, + private val callback: ((Task) -> Unit)? ) : BindableViewHolder(itemView) { private val addBtn: Button = itemView.findViewById(R.id.btn_add_task) private var newTask: Task? = null @@ -134,7 +134,7 @@ class ChallengeTasksRecyclerViewAdapter( override fun bind( data: Task, position: Int, - displayMode: String, + displayMode: String ) { this.newTask = data addBtn.text = data.text @@ -147,7 +147,7 @@ class ChallengeTasksRecyclerViewAdapter( override fun bind( data: Task, position: Int, - displayMode: String, + displayMode: String ) { dividerName.text = data.text } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengesFilterRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengesFilterRecyclerViewAdapter.kt index e07b288d9..e3812f2b9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengesFilterRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengesFilterRecyclerViewAdapter.kt @@ -19,7 +19,7 @@ class ChallengesFilterRecyclerViewAdapter(entries: List) : override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): ChallengeViewHolder { val view = LayoutInflater.from(parent.context) @@ -29,7 +29,7 @@ class ChallengesFilterRecyclerViewAdapter(entries: List) : override fun onBindViewHolder( holder: ChallengeViewHolder, - position: Int, + position: Int ) { holder.bind(entries[position], checkedEntries) } @@ -43,7 +43,7 @@ class ChallengesFilterRecyclerViewAdapter(entries: List) : fun bind( group: Group, - checkedEntries: MutableList, + checkedEntries: MutableList ) { binding.root.text = group.name binding.root.isChecked = checkedEntries.contains(group) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.kt index f1fd2c63a..64b8dd231 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.kt @@ -15,7 +15,7 @@ abstract class BaseTasksRecyclerViewAdapter>( private val viewModel: TasksViewModel, private val layoutResource: Int, newContext: Context, - private val userID: String?, + private val userID: String? ) : BaseRecyclerViewAdapter() { protected var content: MutableList? = null protected var filteredContent: MutableList? = null @@ -27,7 +27,7 @@ abstract class BaseTasksRecyclerViewAdapter>( override fun onBindViewHolder( holder: VH, - position: Int, + position: Int ) { val item = filteredContent?.get(position) if (item != null) { @@ -46,7 +46,7 @@ abstract class BaseTasksRecyclerViewAdapter>( protected fun getContentView( parent: ViewGroup, - layoutResource: Int, + layoutResource: Int ): View = LayoutInflater.from(parent.context).inflate(layoutResource, parent, false) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/DailiesRecyclerViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/DailiesRecyclerViewHolder.kt index a3b3bb08b..dad8f20cd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/DailiesRecyclerViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/DailiesRecyclerViewHolder.kt @@ -8,7 +8,7 @@ import com.habitrpg.android.habitica.ui.viewmodels.TasksViewModel class DailiesRecyclerViewHolder(layoutResource: Int, viewModel: TasksViewModel) : RealmBaseTasksRecyclerViewAdapter(layoutResource, viewModel) { override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder { return if (viewType == 0) { DailyViewHolder( @@ -23,7 +23,7 @@ class DailiesRecyclerViewHolder(layoutResource: Int, viewModel: TasksViewModel) task -> brokenTaskEvents?.invoke(task) }, - viewModel, + viewModel ) } else { super.onCreateViewHolder(parent, viewType) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/HabitsRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/HabitsRecyclerViewAdapter.kt index bb75b522d..80ed7bde0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/HabitsRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/HabitsRecyclerViewAdapter.kt @@ -8,7 +8,7 @@ import com.habitrpg.android.habitica.ui.viewmodels.TasksViewModel class HabitsRecyclerViewAdapter(layoutResource: Int, viewModel: TasksViewModel) : RealmBaseTasksRecyclerViewAdapter(layoutResource, viewModel) { override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder { return if (viewType == 0) { HabitViewHolder( @@ -20,7 +20,7 @@ class HabitsRecyclerViewAdapter(layoutResource: Int, viewModel: TasksViewModel) { task -> brokenTaskEvents?.invoke(task) }, - viewModel, + viewModel ) } else { super.onCreateViewHolder(parent, viewType) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RealmBaseTasksRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RealmBaseTasksRecyclerViewAdapter.kt index 5d473a4e0..21123dc36 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RealmBaseTasksRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RealmBaseTasksRecyclerViewAdapter.kt @@ -23,7 +23,7 @@ import io.realm.OrderedRealmCollection abstract class RealmBaseTasksRecyclerViewAdapter( private val layoutResource: Int, - val viewModel: TasksViewModel, + val viewModel: TasksViewModel ) : BaseRecyclerViewAdapter(), TaskRecyclerViewAdapter { private var unfilteredData: List? = null override var showAdventureGuide = false @@ -63,7 +63,7 @@ abstract class RealmBaseTasksRecyclerViewAdapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder { val binding = AdventureGuideMenuBannerBinding.inflate(parent.context.layoutInflater, parent, false) @@ -72,7 +72,7 @@ abstract class RealmBaseTasksRecyclerViewAdapter( override fun onBindViewHolder( holder: RecyclerView.ViewHolder, - position: Int, + position: Int ) { val item = getItem(position) if (item != null && holder is BaseTaskViewHolder) { @@ -110,7 +110,7 @@ abstract class RealmBaseTasksRecyclerViewAdapter( private fun getContentView( parent: ViewGroup, - layoutResource: Int, + layoutResource: Int ): View = LayoutInflater.from(parent.context).inflate(layoutResource, parent, false) @@ -137,7 +137,7 @@ class AdventureGuideViewHolder(itemView: View) : RecyclerView.ViewHolder(itemVie BitmapDrawable(itemView.resources, HabiticaIconsHelper.imageOfGold()), null, null, - null, + null ) itemView.findViewById(R.id.gold_textview).compoundDrawablePadding = 4.dpToPx(itemView.context) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.kt index cbbe96399..9e9ba5e1d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.kt @@ -18,7 +18,7 @@ import com.habitrpg.shared.habitica.models.responses.TaskDirection class RewardsRecyclerViewAdapter( private var customRewards: List?, private val layoutResource: Int, - val viewModel: TasksViewModel, + val viewModel: TasksViewModel ) : BaseRecyclerViewAdapter(), TaskRecyclerViewAdapter { override var user: User? = null set(value) { @@ -67,7 +67,7 @@ class RewardsRecyclerViewAdapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder { return if (viewType == VIEWTYPE_CUSTOM_REWARD) { RewardViewHolder( @@ -84,7 +84,7 @@ class RewardsRecyclerViewAdapter( task -> brokenTaskEvents?.invoke(task) }, - viewModel, + viewModel ) } else { val viewHolder = ShopItemViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.row_shopitem, parent, false)) @@ -96,7 +96,7 @@ class RewardsRecyclerViewAdapter( override fun onBindViewHolder( holder: RecyclerView.ViewHolder, - position: Int, + position: Int ) { if (customRewards != null && position < customRewardCount) { val reward = customRewards?.get(position) ?: return diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TaskRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TaskRecyclerViewAdapter.kt index b59891aef..0df38fb6b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TaskRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TaskRecyclerViewAdapter.kt @@ -19,7 +19,7 @@ interface TaskRecyclerViewAdapter { fun notifyItemMoved( adapterPosition: Int, - adapterPosition1: Int, + adapterPosition1: Int ) fun notifyDataSetChanged() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TodosRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TodosRecyclerViewAdapter.kt index 1501a6b4a..689534653 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TodosRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TodosRecyclerViewAdapter.kt @@ -8,7 +8,7 @@ import com.habitrpg.android.habitica.ui.viewmodels.TasksViewModel class TodosRecyclerViewAdapter(layoutResource: Int, viewModel: TasksViewModel) : RealmBaseTasksRecyclerViewAdapter(layoutResource, viewModel) { override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int, + viewType: Int ): RecyclerView.ViewHolder { return if (viewType == 0) { TodoViewHolder( @@ -21,7 +21,7 @@ class TodosRecyclerViewAdapter(layoutResource: Int, viewModel: TasksViewModel) : { task -> brokenTaskEvents?.invoke(task) }, - viewModel, + viewModel ) } else { super.onCreateViewHolder(parent, viewType) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt index b527a7861..a8e3e625d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt @@ -40,7 +40,7 @@ class AboutFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentAboutBinding { return FragmentAboutBinding.inflate(layoutInflater, container, false) } @@ -48,7 +48,7 @@ class AboutFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -70,7 +70,7 @@ class AboutFragment : BaseMainFragment() { Toast.makeText( context, "Only ${8 - versionNumberTappedCount} taps left!", - Toast.LENGTH_SHORT, + Toast.LENGTH_SHORT ).show() } @@ -90,7 +90,7 @@ class AboutFragment : BaseMainFragment() { @Suppress("DEPRECATION") mainActivity?.packageManager?.getPackageInfo( mainActivity?.packageName ?: "", - 0, + 0 )?.versionName ?: "" } catch (e: PackageManager.NameNotFoundException) { "" @@ -102,7 +102,7 @@ class AboutFragment : BaseMainFragment() { @Suppress("DEPRECATION") mainActivity?.packageManager?.getPackageInfo( mainActivity?.packageName ?: "", - 0, + 0 )?.versionCode ?: 0 } catch (e: PackageManager.NameNotFoundException) { 0 @@ -111,7 +111,7 @@ class AboutFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -123,7 +123,7 @@ class AboutFragment : BaseMainFragment() { getString( R.string.update_available, appConfigManager.lastVersionNumber(), - appConfigManager.lastVersionCode(), + appConfigManager.lastVersionCode() ) } else { binding?.updateAvailableWrapper?.visibility = View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt index ffedac6b6..8e87c8d08 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt @@ -40,7 +40,7 @@ class AchievementsFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentRefreshRecyclerviewBinding { return FragmentRefreshRecyclerviewBinding.inflate(inflater, container, false) } @@ -57,7 +57,7 @@ class AchievementsFragment : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { hidesToolbar = true adapter = AchievementsAdapter() @@ -77,7 +77,7 @@ class AchievementsFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -110,7 +110,7 @@ class AchievementsFragment : }.combine( userRepository.getQuestAchievements() .map { it.mapNotNull { achievement -> achievement.questKey } } - .map { inventoryRepository.getQuestContent(it).firstOrNull() }, + .map { inventoryRepository.getQuestContent(it).firstOrNull() } ) { achievements, content -> Pair(achievements, content) }.collect { @@ -125,7 +125,7 @@ class AchievementsFragment : categoryIdentifier, achievements.count { check -> check.category == categoryIdentifier && check.earned - }, + } ) entries.add(category) lastCategory = categoryIdentifier @@ -139,7 +139,7 @@ class AchievementsFragment : val questContent = it.second?.firstOrNull { achievement.questKey == it.key } achievement.title = questContent?.text achievement - }, + } ) val user = userViewModel.user.value @@ -157,7 +157,7 @@ class AchievementsFragment : override fun onCreateOptionsMenu( menu: Menu, - inflater: MenuInflater, + inflater: MenuInflater ) { if (useGridLayout) { val menuItem = menu.add(R.string.switch_to_list_view) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseDialogFragment.kt index 7fb3a3449..21e938a87 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseDialogFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseDialogFragment.kt @@ -33,13 +33,13 @@ abstract class BaseDialogFragment : BottomSheetDialogFragment( abstract fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): VB override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { Analytics.sendNavigationEvent(this.javaClass.simpleName) @@ -63,7 +63,7 @@ abstract class BaseDialogFragment : BottomSheetDialogFragment( mainActivity.displayTutorialStep( step, tutorialTexts, - tutorialCanBeDeferred, + tutorialCanBeDeferred ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.kt index 5b7d5c2e7..80fdf5c7d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.kt @@ -34,13 +34,13 @@ abstract class BaseFragment : Fragment() { abstract fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): VB override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { binding = createBinding(inflater, container) return binding?.root @@ -61,7 +61,7 @@ abstract class BaseFragment : Fragment() { mainActivity.displayTutorialStep( step, tutorialTexts, - tutorialCanBeDeferred, + tutorialCanBeDeferred ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt index 64da31c00..9c2b3c6ca 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt @@ -46,7 +46,7 @@ abstract class BaseMainFragment : BaseFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { if (this.usesBottomNavigation) { bottomNavigation?.visibility = View.VISIBLE @@ -70,7 +70,7 @@ abstract class BaseMainFragment : BaseFragment() { context?.let { FirebaseAnalytics.getInstance(it).logEvent( "fragment_view", - bundleOf(Pair("fragment", this::class.java.canonicalName)), + bundleOf(Pair("fragment", this::class.java.canonicalName)) ) } @@ -91,7 +91,7 @@ abstract class BaseMainFragment : BaseFragment() { @Deprecated("Use onCreateOptionsMenu(Menu, MenuInflater) instead") override fun onCreateOptionsMenu( menu: Menu, - inflater: MenuInflater, + inflater: MenuInflater ) { super.onCreateOptionsMenu(menu, inflater) mainActivity?.toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, mainActivity) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index 3a7895cf3..519b122d5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -109,7 +109,7 @@ class NavigationDrawerFragment : DialogFragment() { if (context != null) { NavigationDrawerAdapter( context.getThemeColor(R.attr.colorPrimaryText), - context.getThemeColor(R.attr.colorPrimaryOffset), + context.getThemeColor(R.attr.colorPrimaryOffset) ) } else { NavigationDrawerAdapter(0, 0) @@ -127,14 +127,14 @@ class NavigationDrawerFragment : DialogFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? = inflater.inflate(R.layout.drawer_main, container, false) as? ViewGroup private var updatingJobs = mutableMapOf() override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) binding = DrawerMainBinding.bind(view) @@ -160,7 +160,7 @@ class NavigationDrawerFragment : DialogFragment() { lifecycleScope.launchCatching { contentRepository.getWorldState() .combine( - inventoryRepository.getAvailableLimitedItems(), + inventoryRepository.getAvailableLimitedItems() ) { state, items -> Pair(state, items) } .collect { (worldState, items) -> val gearEvent = worldState.events.firstOrNull { it.gear } @@ -171,7 +171,7 @@ class NavigationDrawerFragment : DialogFragment() { val diff = (gearEvent?.end?.time ?: 0) - Date().time if (diff < (1.toDuration(DurationUnit.HOURS).inWholeMilliseconds)) { 1.toDuration( - DurationUnit.SECONDS, + DurationUnit.SECONDS ) } else { 1.toDuration(DurationUnit.MINUTES) @@ -230,7 +230,7 @@ class NavigationDrawerFragment : DialogFragment() { R.id.inboxFragment, null, true, - preventReselection = false, + preventReselection = false ) } binding?.settingsButtonWrapper?.setOnClickListener { @@ -238,7 +238,7 @@ class NavigationDrawerFragment : DialogFragment() { R.id.prefsActivity, null, true, - preventReselection = false, + preventReselection = false ) } binding?.notificationsButtonWrapper?.setOnClickListener { startNotificationsActivity() } @@ -248,7 +248,7 @@ class NavigationDrawerFragment : DialogFragment() { key: String, endingCondition: () -> Boolean, delayFunc: () -> Duration, - function: () -> Unit, + function: () -> Unit ) { function() if (updatingJobs[key]?.isActive == true) { @@ -265,7 +265,7 @@ class NavigationDrawerFragment : DialogFragment() { private fun updateSeasonalMenuEntries( gearEvent: WorldStateEvent?, - items: List, + items: List ) { val market = getItemWithIdentifier(SIDEBAR_SHOPS_MARKET) ?: return val item = items.firstOrNull() @@ -315,8 +315,8 @@ class NavigationDrawerFragment : DialogFragment() { item.isVisible = false } else { if (( - user.stats?.lvl - ?: 0 + user.stats?.lvl + ?: 0 ) < HabiticaSnackbar.MIN_LEVEL_FOR_SKILLS && (!hasSpecialItems) ) { item.pillText = getString(R.string.unlock_lvl_11) @@ -403,29 +403,29 @@ class NavigationDrawerFragment : DialogFragment() { HabiticaDrawerItem( R.id.tasksFragment, SIDEBAR_TASKS, - context.getString(R.string.sidebar_tasks), - ), + context.getString(R.string.sidebar_tasks) + ) ) items.add( HabiticaDrawerItem( R.id.skillsFragment, SIDEBAR_SKILLS, - context.getString(R.string.sidebar_skills), - ), + context.getString(R.string.sidebar_skills) + ) ) items.add( HabiticaDrawerItem( R.id.statsFragment, SIDEBAR_STATS, - context.getString(R.string.sidebar_stats), - ), + context.getString(R.string.sidebar_stats) + ) ) items.add( HabiticaDrawerItem( R.id.achievementsFragment, SIDEBAR_ACHIEVEMENTS, - context.getString(R.string.sidebar_achievements), - ), + context.getString(R.string.sidebar_achievements) + ) ) items.add( @@ -433,27 +433,27 @@ class NavigationDrawerFragment : DialogFragment() { 0, SIDEBAR_INVENTORY, context.getString(R.string.sidebar_shops), - isHeader = true, - ), + isHeader = true + ) ) items.add( HabiticaDrawerItem( R.id.marketFragment, SIDEBAR_SHOPS_MARKET, - context.getString(R.string.market), - ), + context.getString(R.string.market) + ) ) items.add( HabiticaDrawerItem( R.id.questShopFragment, SIDEBAR_SHOPS_QUEST, - context.getString(R.string.questShop), - ), + context.getString(R.string.questShop) + ) ) val customizationShopItem = HabiticaDrawerItem( R.id.customizationsShopFragment, SIDEBAR_SHOPS_CUSTOMIZATIONS, - context.getString(R.string.customizations), + context.getString(R.string.customizations) ) customizationShopItem.isVisible = configManager.enableCustomizationShop() items.add( @@ -463,15 +463,15 @@ class NavigationDrawerFragment : DialogFragment() { HabiticaDrawerItem( R.id.seasonalShopFragment, SIDEBAR_SHOPS_SEASONAL, - context.getString(R.string.seasonalShop), + context.getString(R.string.seasonalShop) ) items.add(seasonalShopEntry) items.add( HabiticaDrawerItem( R.id.timeTravelersShopFragment, SIDEBAR_SHOPS_TIMETRAVEL, - context.getString(R.string.timeTravelers), - ), + context.getString(R.string.timeTravelers) + ) ) items.add( @@ -479,73 +479,73 @@ class NavigationDrawerFragment : DialogFragment() { 0, SIDEBAR_INVENTORY, context.getString(R.string.sidebar_section_inventory), - isHeader = true, - ), + isHeader = true + ) ) items.add( HabiticaDrawerItem( R.id.avatarOverviewFragment, SIDEBAR_AVATAR, - context.getString(R.string.sidebar_avatar), - ), + context.getString(R.string.sidebar_avatar) + ) ) items.add( HabiticaDrawerItem( R.id.equipmentOverviewFragment, SIDEBAR_EQUIPMENT, - context.getString(R.string.sidebar_equipment), - ), + context.getString(R.string.sidebar_equipment) + ) ) items.add( HabiticaDrawerItem( R.id.itemsFragment, SIDEBAR_ITEMS, - context.getString(R.string.sidebar_items), - ), + context.getString(R.string.sidebar_items) + ) ) items.add( HabiticaDrawerItem( R.id.stableFragment, SIDEBAR_STABLE, - context.getString(R.string.sidebar_stable), - ), + context.getString(R.string.sidebar_stable) + ) ) items.add( HabiticaDrawerItem( R.id.gemPurchaseActivity, SIDEBAR_GEMS, - context.getString(R.string.sidebar_gems), - ), + context.getString(R.string.sidebar_gems) + ) ) items.add( HabiticaDrawerItem( R.id.subscriptionPurchaseActivity, SIDEBAR_SUBSCRIPTION, - context.getString(R.string.sidebar_subscription), - ), + context.getString(R.string.sidebar_subscription) + ) ) items.add( HabiticaDrawerItem( 0, SIDEBAR_SOCIAL, context.getString(R.string.sidebar_section_social), - isHeader = true, - ), + isHeader = true + ) ) items.add( HabiticaDrawerItem( R.id.partyFragment, SIDEBAR_PARTY, - context.getString(R.string.sidebar_party), - ), + context.getString(R.string.sidebar_party) + ) ) if (!configManager.hideChallenges()) { items.add( HabiticaDrawerItem( R.id.challengesOverviewFragment, SIDEBAR_CHALLENGES, - context.getString(R.string.sidebar_challenges), - ), + context.getString(R.string.sidebar_challenges) + ) ) } @@ -554,29 +554,29 @@ class NavigationDrawerFragment : DialogFragment() { 0, SIDEBAR_ABOUT_HEADER, context.getString(R.string.sidebar_about), - isHeader = true, - ), + isHeader = true + ) ) items.add( HabiticaDrawerItem( R.id.newsFragment, SIDEBAR_NEWS, - context.getString(R.string.sidebar_news), - ), + context.getString(R.string.sidebar_news) + ) ) items.add( HabiticaDrawerItem( R.id.supportMainFragment, SIDEBAR_HELP, - context.getString(R.string.sidebar_help), - ), + context.getString(R.string.sidebar_help) + ) ) items.add( HabiticaDrawerItem( R.id.aboutFragment, SIDEBAR_ABOUT, - context.getString(R.string.sidebar_about), - ), + context.getString(R.string.sidebar_about) + ) ) } @@ -603,7 +603,7 @@ class NavigationDrawerFragment : DialogFragment() { transitionId: Int?, bundle: Bundle? = null, openSelection: Boolean = true, - preventReselection: Boolean = true, + preventReselection: Boolean = true ) { if (!isTabletUI) { closeDrawer() @@ -643,7 +643,7 @@ class NavigationDrawerFragment : DialogFragment() { if (it.resultCode == Activity.RESULT_OK) { (activity as? MainActivity)?.notificationsViewModel?.click( it.data?.getStringExtra("notificationId") ?: "", - MainNavigationController, + MainNavigationController ) } } @@ -657,7 +657,7 @@ class NavigationDrawerFragment : DialogFragment() { fun setUp( fragmentId: Int, drawerLayout: DrawerLayout, - viewModel: NotificationsViewModel, + viewModel: NotificationsViewModel ) { fragmentContainerView = activity?.findViewById(fragmentId) this.drawerLayout = drawerLayout @@ -817,7 +817,7 @@ class NavigationDrawerFragment : DialogFragment() { promotedItem.subtitle = context?.getString( R.string.sale_ends_in, - activePromo.endDate.getShortRemainingString(), + activePromo.endDate.getShortRemainingString() ) adapter.updateItem(promotedItem) } else { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt index 1c4e32755..165a4433b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt @@ -27,7 +27,7 @@ class NewsFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentNewsBinding { return FragmentNewsBinding.inflate(inflater, container, false) } @@ -35,7 +35,7 @@ class NewsFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -45,7 +45,7 @@ class NewsFragment : BaseMainFragment() { object : WebViewClient() { override fun shouldOverrideUrlLoading( view: WebView?, - request: WebResourceRequest?, + request: WebResourceRequest? ): Boolean { if (request?.url?.path == "/static/new-stuff") { view?.loadUrl(request.url.toString()) @@ -59,7 +59,7 @@ class NewsFragment : BaseMainFragment() { @SuppressLint("SetJavaScriptEnabled") override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) val webSettings = binding?.newsWebview?.settings diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt index 375accb74..c18284b09 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt @@ -15,7 +15,7 @@ class PromoInfoFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentPromoInfoBinding { return FragmentPromoInfoBinding.inflate(inflater, container, false) } @@ -26,7 +26,7 @@ class PromoInfoFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -34,7 +34,7 @@ class PromoInfoFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) val promo = configManager.activePromo() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoWebFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoWebFragment.kt index 2b70ea669..f275a013c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoWebFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoWebFragment.kt @@ -20,7 +20,7 @@ class PromoWebFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentNewsBinding { return FragmentNewsBinding.inflate(inflater, container, false) } @@ -28,7 +28,7 @@ class PromoWebFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -37,7 +37,7 @@ class PromoWebFragment : BaseMainFragment() { @SuppressLint("SetJavaScriptEnabled") override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) val webSettings = binding?.newsWebview?.settings diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/ReportBottomSheetFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/ReportBottomSheetFragment.kt index 27f1c7456..d6cf5fe37 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/ReportBottomSheetFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/ReportBottomSheetFragment.kt @@ -51,7 +51,7 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View { binding = FragmentReportMessageBinding.inflate(inflater, container, false) return binding.root @@ -69,7 +69,7 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -101,8 +101,8 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() { binding.additionalExplanationTextview.setMarkdown( getString( R.string.report_user_description, - profileName, - ), + profileName + ) ) binding.reportExplanationTextview.setMarkdown(getString(R.string.report_user_explanation)) val formattedString = @@ -112,13 +112,13 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() { TypefaceSpan("sans-serif-medium"), 0, displayName?.length ?: 0, - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ) spannable.setSpan( TypefaceSpan("sans-serif"), displayName?.length ?: 0, formattedString.length, - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ) binding.messageTextView.text = spannable binding.reportReasonTitle.text = getString(R.string.report_reason_title_player) @@ -146,7 +146,7 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() { ContextCompat.getColor(requireContext(), R.color.text_dimmed) } else { ContextCompat.getColor(requireContext(), R.color.maroon100_red100) - }, + } ) } } @@ -160,12 +160,12 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() { lifecycleScope.launch( ExceptionHandler.coroutine { isReporting = false - }, + } ) { socialRepository.flagMessage( messageID ?: "", binding.additionalInfoEdittext.text.toString(), - groupID, + groupID ) dismiss() } @@ -186,7 +186,7 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() { val updateData = mapOf( "comment" to reportReasonInfo, - "source" to (source ?: ""), + "source" to (source ?: "") ) socialRepository.reportMember(userIdBeingReported, updateData) socialRepository.blockMember(userIdBeingReported) @@ -209,7 +209,7 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() { val updateData = mapOf( "comment" to reportReasonInfo, - "source" to (source ?: ""), + "source" to (source ?: "") ) challengeRepository.reportChallenge(challengeId, updateData) Toast.makeText(context, "$displayName Reported", Toast.LENGTH_SHORT).show() @@ -242,7 +242,7 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() { messageId: String = "", messageText: String = "", groupId: String = "", - sourceView: String, + sourceView: String ): ReportBottomSheetFragment { val args = Bundle() args.putString(REPORT_TYPE, reportType) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt index 290442d56..fe3005c46 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt @@ -32,7 +32,7 @@ class StatsFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentStatsBinding { return FragmentStatsBinding.inflate(inflater, container, false) } @@ -69,7 +69,7 @@ class StatsFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { tutorialStepIdentifier = "stats" tutorialTexts = listOf(getString(R.string.tutorial_stats)) @@ -84,7 +84,7 @@ class StatsFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -94,18 +94,18 @@ class StatsFragment : BaseMainFragment() { val color = it.getThemeColor(R.attr.colorPrimaryOffset) binding?.distributeEvenlyHelpButton?.setImageBitmap( HabiticaIconsHelper.imageOfInfoIcon( - color, - ), + color + ) ) binding?.distributeClassHelpButton?.setImageBitmap( HabiticaIconsHelper.imageOfInfoIcon( - color, - ), + color + ) ) binding?.distributeTaskHelpButton?.setImageBitmap( HabiticaIconsHelper.imageOfInfoIcon( - color, - ), + color + ) ) } @@ -168,7 +168,7 @@ class StatsFragment : BaseMainFragment() { lifecycleScope.launchCatching { userRepository.updateUser( "preferences.allocationMode", - allocationMode, + allocationMode ) } binding?.distributeEvenlyButton?.isChecked = allocationMode == Stats.AUTO_ALLOCATE_FLAT @@ -220,8 +220,8 @@ class StatsFragment : BaseMainFragment() { binding?.numberOfPointsTextView?.setTextColor( ContextCompat.getColor( context, - R.color.white, - ), + R.color.white + ) ) binding?.numberOfPointsTextView?.background = ContextCompat.getDrawable(context, R.drawable.button_gray_100) @@ -232,14 +232,14 @@ class StatsFragment : BaseMainFragment() { binding?.numberOfPointsTextView?.setTextColor( ContextCompat.getColor( context, - R.color.text_quad, - ), + R.color.text_quad + ) ) binding?.numberOfPointsTextView?.setBackgroundColor( ContextCompat.getColor( context, - R.color.transparent, - ), + R.color.transparent + ) ) binding?.leftSparklesView?.visibility = View.GONE binding?.rightSparklesView?.visibility = View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt index 925b9efea..f2510fce1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt @@ -78,7 +78,7 @@ open class AvatarOverviewFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentComposeScrollingBinding { return FragmentComposeScrollingBinding.inflate(inflater, container, false) } @@ -86,7 +86,7 @@ open class AvatarOverviewFragment : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { hidesToolbar = true val view = super.onCreateView(inflater, container, savedInstanceState) @@ -103,13 +103,13 @@ open class AvatarOverviewFragment : modifier = Modifier .padding(top = 6.dp, bottom = 24.dp) - .size(140.dp, 147.dp), + .size(140.dp, 147.dp) ) Box( Modifier .background(colorResource(R.color.content_background), RoundedCornerShape(topStart = 22.dp, topEnd = 22.dp)) .fillMaxWidth() - .height(22.dp), + .height(22.dp) ) } AvatarOverviewView( @@ -126,7 +126,7 @@ open class AvatarOverviewFragment : }, { type, equipped, isCostume -> displayEquipmentFragment(type, equipped, isCostume) - }, + } ) } } @@ -139,13 +139,13 @@ open class AvatarOverviewFragment : battleGearWeapon.value = it.first?.let { key -> inventoryRepository.getEquipment( - key, + key ).firstOrNull() } costumeWeapon.value = it.second?.let { key -> inventoryRepository.getEquipment( - key, + key ).firstOrNull() } } @@ -155,19 +155,19 @@ open class AvatarOverviewFragment : private fun displayCustomizationFragment( type: String, - category: String?, + category: String? ) { MainNavigationController.navigate( AvatarOverviewFragmentDirections.openComposeAvatarDetail( type, - category ?: "", - ), + category ?: "" + ) ) } private fun displayAvatarEquipmentFragment( type: String, - category: String?, + category: String? ) { MainNavigationController.navigate(AvatarOverviewFragmentDirections.openComposeAvatarEquipment(type, category ?: "")) } @@ -175,14 +175,14 @@ open class AvatarOverviewFragment : private fun displayEquipmentFragment( type: String, equipped: String?, - isCostume: Boolean = false, + isCostume: Boolean = false ) { MainNavigationController.navigate(AvatarOverviewFragmentDirections.openEquipmentDetail(type, isCostume, equipped ?: "")) } override fun onCreateOptionsMenu( menu: Menu, - inflater: MenuInflater, + inflater: MenuInflater ) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.menu_share_avatar, menu) @@ -204,8 +204,8 @@ open class AvatarOverviewFragment : requireActivity() as BaseActivity, it, "Check out my avatar on Habitica!", - "avatar_customization", - ), + "avatar_customization" + ) ) } } @@ -217,7 +217,7 @@ open class AvatarOverviewFragment : parent: AdapterView<*>, view: View?, position: Int, - id: Long, + id: Long ) { val newSize: String = if (position == 0) "slim" else "broad" @@ -239,40 +239,40 @@ fun AvatarOverviewView( costumeTwoHanded: Boolean = false, onCustomizationTap: (String, String?) -> Unit, onAvatarEquipmentTap: (String, String?) -> Unit, - onEquipmentTap: (String, String?, Boolean) -> Unit, + onEquipmentTap: (String, String?, Boolean) -> Unit ) { val user by userViewModel.user.observeAsState() Column( Modifier .padding(horizontal = 8.dp) - .padding(bottom = 16.dp), + .padding(bottom = 16.dp) ) { if (showCustomization) { Row( Modifier.padding(horizontal = 12.dp, vertical = 15.dp), - verticalAlignment = Alignment.CenterVertically, + verticalAlignment = Alignment.CenterVertically ) { Text( stringResource(R.string.avatar_size), style = HabiticaTheme.typography.titleMedium, - color = HabiticaTheme.colors.textSecondary, + color = HabiticaTheme.colors.textSecondary ) Spacer(modifier = Modifier.weight(1f)) SegmentedControl( items = - listOf( - stringResource(R.string.avatar_size_slim), - stringResource( - R.string.avatar_size_broad, - ), - ), + listOf( + stringResource(R.string.avatar_size_slim), + stringResource( + R.string.avatar_size_broad + ) + ), defaultSelectedItemIndex = if (user?.preferences?.size == "slim") 0 else 1, onItemSelection = { userViewModel.updateUser( "preferences.size", - if (it == 0) "slim" else "broad", + if (it == 0) "slim" else "broad" ) - }, + } ) } AvatarCustomizationOverviewView(user?.preferences, user?.items?.gear?.equipped, onCustomizationTap, onAvatarEquipmentTap) @@ -282,12 +282,12 @@ fun AvatarOverviewView( Modifier .padding(horizontal = 12.dp) .padding(top = 15.dp), - verticalAlignment = Alignment.CenterVertically, + verticalAlignment = Alignment.CenterVertically ) { Text( stringResource(R.string.equipped).uppercase(), style = HabiticaTheme.typography.titleSmall, - color = HabiticaTheme.colors.textSecondary, + color = HabiticaTheme.colors.textSecondary ) Spacer(modifier = Modifier.weight(1f)) Text( @@ -307,19 +307,19 @@ fun AvatarOverviewView( Modifier .padding(horizontal = 12.dp) .padding(top = 15.dp), - verticalAlignment = Alignment.CenterVertically, + verticalAlignment = Alignment.CenterVertically ) { Text( stringResource(R.string.costume).uppercase(), style = HabiticaTheme.typography.titleSmall, - color = HabiticaTheme.colors.textSecondary, + color = HabiticaTheme.colors.textSecondary ) Spacer(modifier = Modifier.weight(1f)) Text( stringResource(R.string.wear_costume), style = HabiticaTheme.typography.bodyMedium, color = HabiticaTheme.colors.textPrimary, - modifier = Modifier.padding(end = 6.dp), + modifier = Modifier.padding(end = 6.dp) ) Switch(checked = user?.preferences?.costume == true, onCheckedChange = { userViewModel.updateUser("preferences.costume", it) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt index 2eb19fd6b..3864c4271 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt @@ -19,7 +19,6 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -79,7 +78,6 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaBottomSheetDialog import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.extensions.setTintWith import com.habitrpg.common.habitica.helpers.ExceptionHandler -import com.habitrpg.common.habitica.helpers.MainNavigationController import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.theme.HabiticaTheme import com.habitrpg.common.habitica.views.ComposableAvatarView @@ -134,7 +132,7 @@ class ComposeAvatarCustomizationFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentComposeBinding { return FragmentComposeBinding.inflate(inflater, container, false) } @@ -161,7 +159,7 @@ class ComposeAvatarCustomizationFragment : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { showsBackButton = true hidesToolbar = true @@ -190,7 +188,7 @@ class ComposeAvatarCustomizationFragment : userRepository.useCustomization( customization.type ?: "", customization.category, - customization.identifier ?: "", + customization.identifier ?: "" ) } } @@ -203,7 +201,7 @@ class ComposeAvatarCustomizationFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) arguments?.let { @@ -236,7 +234,7 @@ class ComposeAvatarCustomizationFragment : override fun onCreateOptionsMenu( menu: Menu, - inflater: MenuInflater, + inflater: MenuInflater ) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.menu_list_customizations, menu) @@ -337,7 +335,7 @@ class ComposeAvatarCustomizationFragment : private fun shouldSkip( filter: CustomizationFilter, - customization: Customization, + customization: Customization ): Boolean { return if (filter.onlyPurchased) { true @@ -438,7 +436,7 @@ class ComposeAvatarCustomizationFragment : private fun configureMonthFilterButton( button: CheckBox, value: Int, - filter: CustomizationFilter, + filter: CustomizationFilter ) { val identifier = value.toString().padStart(2, '0') button.isChecked = filter.months.contains(identifier) @@ -469,7 +467,7 @@ private fun AvatarCustomizationView( type: String?, typeName: String, activeCustomization: String?, - onSelect: (Customization) -> Unit, + onSelect: (Customization) -> Unit ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.background(colorResource(R.color.window_background))) { @@ -477,15 +475,15 @@ private fun AvatarCustomizationView( avatar = avatar, configManager = configManager, modifier = - Modifier - .padding(top = 6.dp, bottom = 24.dp) - .size(140.dp, 147.dp), + Modifier + .padding(top = 6.dp, bottom = 24.dp) + .size(140.dp, 147.dp) ) Box( Modifier .background(colorResource(R.color.content_background), RoundedCornerShape(topStart = 22.dp, topEnd = 22.dp)) .fillMaxWidth() - .height(22.dp), + .height(22.dp) ) } val nestedScrollInterop = rememberNestedScrollInteropConnection() @@ -498,14 +496,14 @@ private fun AvatarCustomizationView( horizontalArrangement = Arrangement.Center, contentPadding = PaddingValues(horizontal = horizontalPadding), modifier = - Modifier - .onGloballyPositioned { - gridWidth = with(density) { - it.size.width.toDp() - } + Modifier + .onGloballyPositioned { + gridWidth = with(density) { + it.size.width.toDp() } - .nestedScroll(nestedScrollInterop) - .background(colorResource(R.color.content_background)), + } + .nestedScroll(nestedScrollInterop) + .background(colorResource(R.color.content_background)) ) { item(span = { GridItemSpan(3) }) { Text( @@ -514,7 +512,7 @@ private fun AvatarCustomizationView( fontWeight = FontWeight.SemiBold, color = colorResource(id = R.color.text_ternary), textAlign = TextAlign.Center, - modifier = Modifier.padding(10.dp), + modifier = Modifier.padding(10.dp) ) } if (items.size > 1) { @@ -531,14 +529,14 @@ private fun AvatarCustomizationView( .clickable { onSelect(item) } - .background(colorResource(id = R.color.window_background)), + .background(colorResource(id = R.color.window_background)) ) { if (item.identifier.isNullOrBlank() || item.identifier == "0" || item.identifier == "none") { Image(painterResource(R.drawable.empty_slot), contentDescription = null, contentScale = ContentScale.None, modifier = Modifier.size(68.dp)) } else { PixelArtView( imageName = item.getIconName(userSize, hairColor), - Modifier.size(68.dp), + Modifier.size(68.dp) ) } } @@ -549,7 +547,7 @@ private fun AvatarCustomizationView( fontWeight = FontWeight.SemiBold, color = colorResource(id = R.color.text_ternary), textAlign = TextAlign.Center, - modifier = Modifier.padding(10.dp).padding(top = 16.dp), + modifier = Modifier.padding(10.dp).padding(top = 16.dp) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarEquipmentFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarEquipmentFragment.kt index 4c15da9fb..d8dc3ccf4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarEquipmentFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarEquipmentFragment.kt @@ -107,7 +107,7 @@ class ComposeAvatarEquipmentFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentComposeBinding { return FragmentComposeBinding.inflate(inflater, container, false) } @@ -115,7 +115,7 @@ class ComposeAvatarEquipmentFragment : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { showsBackButton = true hidesToolbar = true @@ -131,11 +131,12 @@ class ComposeAvatarEquipmentFragment : if ((equipment.key?.isNotBlank() != true || equipment.key?.endsWith("_0") == true) && equipment.key != activeEquipment) { inventoryRepository.equip( if (userViewModel.user.value?.preferences?.costume == true) "costume" else "equipped", - activeEquipment ?: "") + activeEquipment ?: "" + ) } else if (equipment.key?.contains("base_0") == false) { inventoryRepository.equip( if (userViewModel.user.value?.preferences?.costume == true) "costume" else "equipped", - equipment.key ?: "", + equipment.key ?: "" ) } } @@ -148,7 +149,7 @@ class ComposeAvatarEquipmentFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { showsBackButton = true super.onViewCreated(view, savedInstanceState) @@ -176,9 +177,11 @@ class ComposeAvatarEquipmentFragment : val blank = Equipment() blank.key = "${type}_base_0" viewModel.items.add(blank) - viewModel.items.addAll(equipment.filter { - ownedEquipment.contains(it.key) - }) + viewModel.items.addAll( + equipment.filter { + ownedEquipment.contains(it.key) + } + ) } } } @@ -206,7 +209,6 @@ class ComposeAvatarEquipmentFragment : } } - @Composable private fun AvatarEquipmentView( avatar: Avatar?, @@ -215,7 +217,7 @@ private fun AvatarEquipmentView( type: String?, typeName: String, activeCustomization: String?, - onSelect: (Equipment) -> Unit, + onSelect: (Equipment) -> Unit ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.background(colorResource(R.color.window_background))) { @@ -225,13 +227,13 @@ private fun AvatarEquipmentView( modifier = Modifier .padding(top = 6.dp, bottom = 24.dp) - .size(140.dp, 147.dp), + .size(140.dp, 147.dp) ) Box( Modifier .background(colorResource(R.color.content_background), RoundedCornerShape(topStart = 22.dp, topEnd = 22.dp)) .fillMaxWidth() - .height(22.dp), + .height(22.dp) ) } val nestedScrollInterop = rememberNestedScrollInteropConnection() @@ -251,7 +253,7 @@ private fun AvatarEquipmentView( } } .nestedScroll(nestedScrollInterop) - .background(colorResource(R.color.content_background)), + .background(colorResource(R.color.content_background)) ) { item(span = { GridItemSpan(3) }) { Text( @@ -260,7 +262,7 @@ private fun AvatarEquipmentView( fontWeight = FontWeight.SemiBold, color = colorResource(id = R.color.text_ternary), textAlign = TextAlign.Center, - modifier = Modifier.padding(10.dp), + modifier = Modifier.padding(10.dp) ) } if (items.size > 1) { @@ -277,14 +279,14 @@ private fun AvatarEquipmentView( .clickable { onSelect(item) } - .background(colorResource(id = R.color.window_background)), + .background(colorResource(id = R.color.window_background)) ) { if (item.key.isNullOrBlank() || item.key == "0" || item.key?.endsWith("_0") == true || item.key == "none") { Image(painterResource(R.drawable.empty_slot), contentDescription = null, contentScale = ContentScale.None, modifier = Modifier.size(68.dp)) } else { PixelArtView( imageName = "shop_" + item.key, - Modifier.size(68.dp), + Modifier.size(68.dp) ) } } @@ -295,7 +297,7 @@ private fun AvatarEquipmentView( fontWeight = FontWeight.SemiBold, color = colorResource(id = R.color.text_ternary), textAlign = TextAlign.Center, - modifier = Modifier.padding(10.dp).padding(top = 16.dp), + modifier = Modifier.padding(10.dp).padding(top = 16.dp) ) } } @@ -316,45 +318,63 @@ internal fun EmptyFooter(type: String?, hasItems: Boolean) { .padding(top = 56.dp) .clickable { MainNavigationController.navigate(R.id.customizationsShopFragment) - }, + } ) { Image( painterResource(if (type == "background") R.drawable.customization_background else R.drawable.customization_mix), null, - modifier = Modifier.padding(bottom = 16.dp), + modifier = Modifier.padding(bottom = 16.dp) ) if (!hasItems) { Text( - stringResource(R.string.customizations_no_owned), fontSize = 16.sp, fontWeight = FontWeight.Bold, color = colorResource(R.color.text_secondary), + stringResource(R.string.customizations_no_owned), + fontSize = 16.sp, + fontWeight = FontWeight.Bold, + color = colorResource(R.color.text_secondary), modifier = Modifier.padding(bottom = 2.dp) ) - Text(buildAnnotatedString { - val original = stringResource(id = R.string.customization_shop_check_out) - val customizationShopName = stringResource(id = R.string.customization_shop) - val first = original.substring(0, original.indexOf(customizationShopName)) - val second = original.substring(original.indexOf(customizationShopName) + customizationShopName.length, original.length) - append(first) - withStyle(SpanStyle(color = HabiticaTheme.colors.tintedUiMain)) { - append(customizationShopName) - } - append(second) - }, fontSize = 14.sp, fontWeight = FontWeight.Normal, color = colorResource(R.color.text_ternary), textAlign = TextAlign.Center) + Text( + buildAnnotatedString { + val original = stringResource(id = R.string.customization_shop_check_out) + val customizationShopName = stringResource(id = R.string.customization_shop) + val first = original.substring(0, original.indexOf(customizationShopName)) + val second = original.substring(original.indexOf(customizationShopName) + customizationShopName.length, original.length) + append(first) + withStyle(SpanStyle(color = HabiticaTheme.colors.tintedUiMain)) { + append(customizationShopName) + } + append(second) + }, + fontSize = 14.sp, + fontWeight = FontWeight.Normal, + color = colorResource(R.color.text_ternary), + textAlign = TextAlign.Center + ) } else { Text( - stringResource(R.string.looking_for_more), fontSize = 16.sp, fontWeight = FontWeight.Bold, color = colorResource(R.color.text_secondary), + stringResource(R.string.looking_for_more), + fontSize = 16.sp, + fontWeight = FontWeight.Bold, + color = colorResource(R.color.text_secondary), modifier = Modifier.padding(bottom = 2.dp) ) - Text(buildAnnotatedString { - val original = stringResource(id = R.string.customization_shop_more) - val customizationShopName = stringResource(id = R.string.customization_shop) - val first = original.substring(0, original.indexOf(customizationShopName)) - val second = original.substring(original.indexOf(customizationShopName) + customizationShopName.length, original.length) - append(first) - withStyle(SpanStyle(color = HabiticaTheme.colors.tintedUiMain)) { - append(customizationShopName) - } - append(second) - }, fontSize = 14.sp, fontWeight = FontWeight.Normal, color = colorResource(R.color.text_ternary), textAlign = TextAlign.Center) + Text( + buildAnnotatedString { + val original = stringResource(id = R.string.customization_shop_more) + val customizationShopName = stringResource(id = R.string.customization_shop) + val first = original.substring(0, original.indexOf(customizationShopName)) + val second = original.substring(original.indexOf(customizationShopName) + customizationShopName.length, original.length) + append(first) + withStyle(SpanStyle(color = HabiticaTheme.colors.tintedUiMain)) { + append(customizationShopName) + } + append(second) + }, + fontSize = 14.sp, + fontWeight = FontWeight.Normal, + color = colorResource(R.color.text_ternary), + textAlign = TextAlign.Center + ) } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt index e55bee650..4c8c4d7d2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt @@ -64,7 +64,8 @@ import javax.inject.Inject @AndroidEntryPoint class EquipmentDetailFragment : BaseMainFragment(), - SwipeRefreshLayout.OnRefreshListener, MenuProvider { + SwipeRefreshLayout.OnRefreshListener, + MenuProvider { @Inject lateinit var inventoryRepository: InventoryRepository @@ -81,7 +82,7 @@ class EquipmentDetailFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentEquipmentDetailBinding { return FragmentEquipmentDetailBinding.inflate(inflater, container, false) } @@ -97,7 +98,7 @@ class EquipmentDetailFragment : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { showsBackButton = true hidesToolbar = true @@ -123,7 +124,7 @@ class EquipmentDetailFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -139,7 +140,7 @@ class EquipmentDetailFragment : EmptyItem( getString(R.string.empty_title), getString(R.string.empty_equipment_description), - null, + null ) { MainNavigationController.navigate(R.id.marketFragment) } @@ -152,15 +153,15 @@ class EquipmentDetailFragment : avatar = avatar, configManager = configManager, modifier = - Modifier - .padding(top = 6.dp, bottom = 24.dp) - .size(140.dp, 147.dp), + Modifier + .padding(top = 6.dp, bottom = 24.dp) + .size(140.dp, 147.dp) ) Box( Modifier .background(colorResource(R.color.content_background), RoundedCornerShape(topStart = 22.dp, topEnd = 22.dp)) .fillMaxWidth() - .height(22.dp), + .height(22.dp) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt index c0c586c07..abdc67a29 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt @@ -84,7 +84,7 @@ class ItemDialogFragment : BaseDialogFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentItemsDialogBinding { return FragmentItemsDialogBinding.inflate(inflater, container, false) } @@ -97,7 +97,7 @@ class ItemDialogFragment : BaseDialogFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { when { this.isHatching -> { @@ -119,7 +119,7 @@ class ItemDialogFragment : BaseDialogFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -130,8 +130,8 @@ class ItemDialogFragment : BaseDialogFragment() { HitType.EVENT, mapOf( "area" to "empty", - "type" to (itemType ?: ""), - ), + "type" to (itemType ?: "") + ) ) if (itemType == "quests") { MainNavigationController.navigate(R.id.questShopFragment) @@ -159,7 +159,7 @@ class ItemDialogFragment : BaseDialogFragment() { else -> null }, false, - if (itemType == "special") null else buttonMethod, + if (itemType == "special") null else buttonMethod ) layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context) @@ -257,8 +257,8 @@ class ItemDialogFragment : BaseDialogFragment() { HitType.EVENT, mapOf( "area" to "bottom", - "type" to (itemType ?: ""), - ), + "type" to (itemType ?: "") + ) ) if (itemType == "quests") { MainNavigationController.navigate(R.id.questShopFragment) @@ -278,8 +278,8 @@ class ItemDialogFragment : BaseDialogFragment() { FeedPetUseCase.RequestValues( pet, food, - activity, - ), + activity + ) ) onFeedResult?.invoke(result) } @@ -303,7 +303,7 @@ class ItemDialogFragment : BaseDialogFragment() { private fun hatchPet( potion: HatchingPotion, - egg: Egg, + egg: Egg ) { dismiss() val activity = activity ?: return @@ -312,8 +312,8 @@ class ItemDialogFragment : BaseDialogFragment() { HatchPetUseCase.RequestValues( potion, egg, - activity, - ), + activity + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt index e888b84fe..e66e32cf3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt @@ -77,6 +77,7 @@ class ItemRecyclerFragment : @Inject lateinit var sharedPreferences: SharedPreferences + @Inject lateinit var reviewManager: ReviewManager @@ -92,7 +93,7 @@ class ItemRecyclerFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentItemsBinding { return FragmentItemsBinding.inflate(inflater, container, false) } @@ -104,7 +105,7 @@ class ItemRecyclerFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -121,8 +122,8 @@ class ItemRecyclerFragment : HitType.EVENT, mapOf( "area" to "empty", - "type" to (itemType ?: ""), - ), + "type" to (itemType ?: "") + ) ) if (itemType == "quests") { MainNavigationController.navigate(R.id.questShopFragment) @@ -150,7 +151,7 @@ class ItemRecyclerFragment : else -> null }, false, - if (itemType == "special") null else buttonMethod, + if (itemType == "special") null else buttonMethod ) layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context) @@ -205,7 +206,7 @@ class ItemRecyclerFragment : item.key?.let { mysteryItem -> inventoryRepository.equip( "equipped", - mysteryItem, + mysteryItem ) } } @@ -229,8 +230,8 @@ class ItemRecyclerFragment : HitType.EVENT, mapOf( "area" to "bottom", - "type" to (itemType ?: ""), - ), + "type" to (itemType ?: "") + ) ) if (itemType == "quests") { MainNavigationController.navigate(R.id.questShopFragment) @@ -270,7 +271,7 @@ class ItemRecyclerFragment : private fun hatchPet( potion: HatchingPotion, - egg: Egg, + egg: Egg ) { (activity as? BaseActivity)?.let { lifecycleScope.launchCatching { @@ -278,8 +279,8 @@ class ItemRecyclerFragment : HatchPetUseCase.RequestValues( potion, egg, - it, - ), + it + ) ) if (isAdded) { @@ -315,7 +316,7 @@ class ItemRecyclerFragment : user?.id, "party", "", - false, + false ) val user = userRepository.retrieveUser(false, true) if (user?.hasParty == true) { @@ -323,7 +324,7 @@ class ItemRecyclerFragment : socialRepository.retrievePartyMembers(party?.id ?: "", true) MainNavigationController.navigate( R.id.partyFragment, - bundleOf(Pair("partyID", user.party?.id)), + bundleOf(Pair("partyID", user.party?.id)) ) } } @@ -394,7 +395,7 @@ class ItemRecyclerFragment : private fun useSpecialItem( specialItem: SpecialItem?, - memberID: String? = null, + memberID: String? = null ) { if (specialItem == null || memberID == null) { return @@ -413,7 +414,7 @@ class ItemRecyclerFragment : HabiticaSnackbar.showSnackbar( it.snackbarContainer, context?.getString(R.string.used_skill_without_mana, specialItem?.text), - HabiticaSnackbar.SnackbarDisplayType.BLUE, + HabiticaSnackbar.SnackbarDisplayType.BLUE ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.kt index a6d9b5da4..38e721b45 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.kt @@ -18,7 +18,7 @@ class ItemsFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentViewpagerBinding { return FragmentViewpagerBinding.inflate(inflater, container, false) } @@ -26,7 +26,7 @@ class ItemsFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.usesTabLayout = true this.hidesToolbar = true @@ -35,7 +35,7 @@ class ItemsFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/CustomizationsShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/CustomizationsShopFragment.kt index 8f4e0169b..50d060bdf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/CustomizationsShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/CustomizationsShopFragment.kt @@ -12,7 +12,7 @@ class CustomizationsShopFragment : ShopFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { shopIdentifier = Shop.CUSTOMIZATIONS return super.onCreateView(inflater, container, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/MarketFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/MarketFragment.kt index 74aac4205..0ea664dea 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/MarketFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/MarketFragment.kt @@ -12,7 +12,7 @@ class MarketFragment : ShopFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { shopIdentifier = Shop.MARKET return super.onCreateView(inflater, container, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/QuestShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/QuestShopFragment.kt index dbce848c9..01b7bb8b8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/QuestShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/QuestShopFragment.kt @@ -14,7 +14,7 @@ class QuestShopFragment : ShopFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { shopIdentifier = Shop.QUEST_SHOP return super.onCreateView(inflater, container, savedInstanceState) @@ -22,7 +22,7 @@ class QuestShopFragment : ShopFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/SeasonalShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/SeasonalShopFragment.kt index c0fae5296..455efd057 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/SeasonalShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/SeasonalShopFragment.kt @@ -12,7 +12,7 @@ class SeasonalShopFragment : ShopFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { shopIdentifier = Shop.SEASONAL_SHOP return super.onCreateView(inflater, container, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt index 272de5ce4..df9ac76b9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt @@ -80,7 +80,7 @@ open class ShopFragment : BaseMainFragment() override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentRefreshRecyclerviewBinding { return FragmentRefreshRecyclerviewBinding.inflate(inflater, container, false) } @@ -88,7 +88,7 @@ open class ShopFragment : BaseMainFragment() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -103,7 +103,7 @@ open class ShopFragment : BaseMainFragment() override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) initializeCurrencyViews() @@ -139,7 +139,7 @@ open class ShopFragment : BaseMainFragment() PurchaseDialog( requireContext(), item, - mainActivity, + mainActivity ) dialog.shopIdentifier = shopIdentifier dialog.isPinned = isPinned @@ -298,7 +298,7 @@ open class ShopFragment : BaseMainFragment() HabiticaProgressDialog.show( requireActivity(), getString(R.string.changing_class_progress), - 300, + 300 ) lifecycleScope.launch(Dispatchers.Main) { userRepository.changeClass(classIdentifier) @@ -317,7 +317,7 @@ open class ShopFragment : BaseMainFragment() HabiticaProgressDialog.show( requireActivity(), getString(R.string.changing_class_progress), - 300, + 300 ) lifecycleScope.launch(Dispatchers.Main) { userRepository.changeClass(classIdentifier) @@ -378,7 +378,7 @@ open class ShopFragment : BaseMainFragment() newShop.categories.sortWith( compareBy { it.items.firstOrNull()?.currency != "gold" } .thenByDescending { if (it.identifier == "quests") 10000 else findReleaseYear(it.items.firstOrNull()?.key ?: "") } - .thenBy { it.items.firstOrNull()?.locked }, + .thenBy { it.items.firstOrNull()?.locked } ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt index 88d456292..2dd055bc6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt @@ -19,7 +19,7 @@ class TimeTravelersShopFragment : ShopFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { shopIdentifier = Shop.TIME_TRAVELERS_SHOP return super.onCreateView(inflater, container, savedInstanceState) @@ -27,7 +27,7 @@ class TimeTravelersShopFragment : ShopFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) initializeCurrencyViews() @@ -45,7 +45,7 @@ class TimeTravelersShopFragment : ShopFragment() { activity?.supportFragmentManager?.let { subscriptionBottomSheet.show( it, - SubscriptionBottomSheetFragment.TAG, + SubscriptionBottomSheetFragment.TAG ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt index 3ddf91a37..d4e0d89ae 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt @@ -45,7 +45,7 @@ class MountDetailRecyclerFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentRefreshRecyclerviewBinding { return FragmentRefreshRecyclerviewBinding.inflate(inflater, container, false) } @@ -53,7 +53,7 @@ class MountDetailRecyclerFragment : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.usesTabLayout = false return super.onCreateView(inflater, container, savedInstanceState) @@ -66,7 +66,7 @@ class MountDetailRecyclerFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { showsBackButton = true super.onViewCreated(view, savedInstanceState) @@ -86,7 +86,7 @@ class MountDetailRecyclerFragment : object : androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { return if (adapter?.getItemViewType(position) == 0 || adapter?.getItemViewType( - position, + position ) == 1 ) { layoutManager?.spanCount ?: 1 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt index 9bd3acd9b..55bd5872a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt @@ -53,6 +53,7 @@ class PetDetailRecyclerFragment : @Inject lateinit var sharedPreferences: SharedPreferences + @Inject lateinit var reviewManager: ReviewManager @@ -62,12 +63,11 @@ class PetDetailRecyclerFragment : private var animalColor: String? = null internal var layoutManager: androidx.recyclerview.widget.GridLayoutManager? = null - override var binding: FragmentRefreshRecyclerviewBinding? = null override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentRefreshRecyclerviewBinding { return FragmentRefreshRecyclerviewBinding.inflate(inflater, container, false) } @@ -75,7 +75,7 @@ class PetDetailRecyclerFragment : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.usesTabLayout = false if (savedInstanceState != null) { @@ -91,7 +91,7 @@ class PetDetailRecyclerFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { showsBackButton = true super.onViewCreated(view, savedInstanceState) @@ -111,7 +111,7 @@ class PetDetailRecyclerFragment : object : androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { return if (adapter.getItemViewType(position) == 0 || adapter.getItemViewType( - position, + position ) == 1 ) { layoutManager?.spanCount ?: 1 @@ -146,7 +146,7 @@ class PetDetailRecyclerFragment : adapter.onFeed = { pet, food -> showFeedingDialog( pet, - food, + food ) } @@ -195,7 +195,7 @@ class PetDetailRecyclerFragment : inventoryRepository.getMounts( animalType, animalGroup, - animalColor, + animalColor ).firstOrNull() ?: emptyList() adapter.setExistingMounts(mounts) val pets = @@ -217,7 +217,7 @@ class PetDetailRecyclerFragment : currentSection = StableSection( pet.type, - "pets", + "pets" ) items.add(currentSection) } @@ -238,7 +238,7 @@ class PetDetailRecyclerFragment : private suspend fun showFeedingDialog( pet: Pet, - food: Food?, + food: Food? ): FeedResponse? { if (food != null) { val context = mainActivity ?: context ?: return null @@ -246,8 +246,8 @@ class PetDetailRecyclerFragment : FeedPetUseCase.RequestValues( pet, food, - context, - ), + context + ) ) if (isAdded) { var petFeedings = sharedPreferences.getInt("times_fed", 0) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.kt index b0abe5888..2529265f2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.kt @@ -22,7 +22,7 @@ class StableFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentViewpagerBinding { return FragmentViewpagerBinding.inflate(inflater, container, false) } @@ -30,7 +30,7 @@ class StableFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.usesTabLayout = true this.hidesToolbar = true @@ -39,7 +39,7 @@ class StableFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) binding?.viewPager?.currentItem = 0 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt index b82005580..d59ab7a5e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt @@ -54,7 +54,7 @@ class StableRecyclerFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentRefreshRecyclerviewBinding { return FragmentRefreshRecyclerviewBinding.inflate(inflater, container, false) } @@ -66,13 +66,13 @@ class StableRecyclerFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) binding?.recyclerView?.emptyItem = EmptyItem( - getString(R.string.empty_items, itemTypeText ?: viewModel.itemType), + getString(R.string.empty_items, itemTypeText ?: viewModel.itemType) ) binding?.refreshLayout?.setOnRefreshListener(this) @@ -81,7 +81,7 @@ class StableRecyclerFragment : object : GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { return if (adapter?.getItemViewType(position) == 0 || adapter?.getItemViewType( - position, + position ) == 1 ) { layoutManager.spanCount @@ -107,7 +107,7 @@ class StableRecyclerFragment : val potion = inventoryRepository.getItems( HatchingPotion::class.java, - arrayOf(animal.color), + arrayOf(animal.color) ).firstOrNull()?.firstOrNull() as? HatchingPotion callback(Pair(egg, potion)) } @@ -122,7 +122,7 @@ class StableRecyclerFragment : lifecycleScope.launchCatching { inventoryRepository.equip( if (viewModel.itemType == "pets") "pet" else "mount", - it, + it ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt index 593f0519a..e522e54ed 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt @@ -89,11 +89,11 @@ class AccountPreferenceFragment : val user = user ?: return configurePreference( findPreference("username"), - user.authentication?.localAuthentication?.username, + user.authentication?.localAuthentication?.username ) configurePreference( findPreference("email"), - user.authentication?.localAuthentication?.email ?: getString(R.string.not_set), + user.authentication?.localAuthentication?.email ?: getString(R.string.not_set) ) findPreference("confirm_username")?.isVisible = user.flags?.verifiedUsername != true @@ -147,7 +147,7 @@ class AccountPreferenceFragment : private fun configurePreference( preference: Preference?, - value: String?, + value: String? ) { (preference as? EditTextPreference)?.let { it.text = value @@ -189,14 +189,14 @@ class AccountPreferenceFragment : updateUser( "profile.name", user?.profile?.name, - getString(R.string.display_name), + getString(R.string.display_name) ) "photo_url" -> updateUser( "profile.imageUrl", user?.profile?.imageUrl, - getString(R.string.photo_url), + getString(R.string.photo_url) ) "about" -> updateUser("profile.blurb", user?.profile?.blurb, getString(R.string.about)) @@ -228,7 +228,7 @@ class AccountPreferenceFragment : private fun disconnect( network: String, - networkName: String, + networkName: String ) { context?.let { context -> val dialog = HabiticaAlertDialog(context) @@ -252,7 +252,7 @@ class AccountPreferenceFragment : activity?.let { it1 -> viewModel.handleGoogleLoginResult( it1, - recoverFromPlayServicesErrorResult, + recoverFromPlayServicesErrorResult ) { _ -> displayAuthenticationSuccess(getString(R.string.google)) } @@ -263,20 +263,20 @@ class AccountPreferenceFragment : private fun displayAuthenticationSuccess(network: String) { (activity as? SnackbarActivity)?.showSnackbar( content = context?.getString(R.string.added_social_auth, network), - displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) } private fun displayDisconnectSuccess(network: String) { (activity as? SnackbarActivity)?.showSnackbar( content = context?.getString(R.string.removed_social_auth, network), - displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) } private val recoverFromPlayServicesErrorResult = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), + ActivityResultContracts.StartActivityForResult() ) { if (it.resultCode != Activity.RESULT_CANCELED) { activity?.let { it1 -> @@ -290,7 +290,7 @@ class AccountPreferenceFragment : private fun updateUser( path: String, value: String?, - title: String, + title: String ) { showSingleEntryDialog(value, title) { if (value != it) { @@ -325,11 +325,11 @@ class AccountPreferenceFragment : userRepository.updatePassword( oldPasswordEditText?.text ?: "", passwordEditText.text ?: "", - passwordRepeatEditText.text ?: "", + passwordRepeatEditText.text ?: "" ) (activity as? SnackbarActivity)?.showSnackbar( content = context.getString(R.string.password_changed), - displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) } d.dismiss() @@ -375,11 +375,11 @@ class AccountPreferenceFragment : user?.username ?: "", email ?: "", passwordEditText.text ?: "", - passwordRepeatEditText.text ?: "", + passwordRepeatEditText.text ?: "" ) (activity as? SnackbarActivity)?.showSnackbar( content = context.getString(R.string.password_added), - displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) } dialog.dismiss() @@ -413,7 +413,7 @@ class AccountPreferenceFragment : lifecycleScope.launchCatching { userRepository.updateEmail( emailEditText.text.toString(), - passwordEditText?.text.toString(), + passwordEditText?.text.toString() ) lifecycleScope.launch(ExceptionHandler.coroutine()) { userRepository.retrieveUser(true, true) @@ -448,7 +448,7 @@ class AccountPreferenceFragment : value: String?, title: String, validator: ((String?) -> Boolean)? = null, - onChange: (String?) -> Unit, + onChange: (String?) -> Unit ) { val inflater = context?.layoutInflater val view = inflater?.inflate(R.layout.dialog_edittext, null) @@ -539,7 +539,7 @@ class AccountPreferenceFragment : dialog.addButton(R.string.confirm, true) { _, _ -> lifecycleScope.launchCatching { userRepository.updateLoginName( - user?.authentication?.localAuthentication?.username ?: "", + user?.authentication?.localAuthentication?.username ?: "" ) } } @@ -558,7 +558,7 @@ class AccountPreferenceFragment : private fun copyValue( name: String, - value: CharSequence?, + value: CharSequence? ) { val clipboard: ClipboardManager? = context?.let { getSystemService(it, ClipboardManager::class.java) } @@ -566,14 +566,14 @@ class AccountPreferenceFragment : if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { (activity as? SnackbarActivity)?.showSnackbar( content = context?.getString(R.string.copied_to_clipboard, name), - displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) } } override fun onSharedPreferenceChanged( p0: SharedPreferences?, - p1: String?, + p1: String? ) { } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.kt index 72def1e9e..0d6c9d564 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.kt @@ -23,7 +23,7 @@ abstract class BasePreferencesFragment : PreferenceFragmentCompat() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View { userViewModel.user.observe(viewLifecycleOwner) { setUser(it) } return super.onCreateView(inflater, container, savedInstanceState) @@ -36,7 +36,7 @@ abstract class BasePreferencesFragment : PreferenceFragmentCompat() { override fun onCreatePreferences( savedInstanceState: Bundle?, - rootKey: String?, + rootKey: String? ) { setPreferencesFromResource(R.xml.preferences_fragment, rootKey) setupPreferences() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt index 74b69393a..5b53e366c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt @@ -32,55 +32,55 @@ class EmailNotificationsPreferencesFragment : isSettingUser = !isInitialSet updatePreference( "preference_email_you_won_challenge", - user?.preferences?.emailNotifications?.wonChallenge, + user?.preferences?.emailNotifications?.wonChallenge ) updatePreference( "preference_email_received_a_private_message", - user?.preferences?.emailNotifications?.newPM, + user?.preferences?.emailNotifications?.newPM ) updatePreference( "preference_email_gifted_gems", - user?.preferences?.emailNotifications?.giftedGems, + user?.preferences?.emailNotifications?.giftedGems ) updatePreference( "preference_email_gifted_subscription", - user?.preferences?.emailNotifications?.giftedSubscription, + user?.preferences?.emailNotifications?.giftedSubscription ) updatePreference( "preference_email_invited_to_party", - user?.preferences?.emailNotifications?.invitedParty, + user?.preferences?.emailNotifications?.invitedParty ) updatePreference( "preference_email_invited_to_guild", - user?.preferences?.emailNotifications?.invitedGuild, + user?.preferences?.emailNotifications?.invitedGuild ) updatePreference( "preference_email_your_quest_has_begun", - user?.preferences?.emailNotifications?.questStarted, + user?.preferences?.emailNotifications?.questStarted ) updatePreference( "preference_email_invited_to_quest", - user?.preferences?.emailNotifications?.invitedQuest, + user?.preferences?.emailNotifications?.invitedQuest ) updatePreference( "preference_email_important_announcements", - user?.preferences?.emailNotifications?.majorUpdates, + user?.preferences?.emailNotifications?.majorUpdates ) updatePreference( "preference_email_kicked_group", - user?.preferences?.emailNotifications?.kickedGroup, + user?.preferences?.emailNotifications?.kickedGroup ) updatePreference( "preference_email_onboarding", - user?.preferences?.emailNotifications?.onboarding, + user?.preferences?.emailNotifications?.onboarding ) updatePreference( "preference_email_subscription_reminders", - user?.preferences?.emailNotifications?.subscriptionReminders, + user?.preferences?.emailNotifications?.subscriptionReminders ) updatePreference( "preference_email_content_release", - user?.preferences?.emailNotifications?.contentRelease, + user?.preferences?.emailNotifications?.contentRelease ) isSettingUser = false isInitialSet = false @@ -88,7 +88,7 @@ class EmailNotificationsPreferencesFragment : private fun updatePreference( key: String, - isChecked: Boolean?, + isChecked: Boolean? ) { val preference = (findPreference(key) as? CheckBoxPreference) preference?.isChecked = isChecked == true @@ -96,7 +96,7 @@ class EmailNotificationsPreferencesFragment : override fun onSharedPreferenceChanged( sharedPreferences: SharedPreferences, - key: String?, + key: String? ) { if (isSettingUser) { return @@ -122,7 +122,7 @@ class EmailNotificationsPreferencesFragment : lifecycleScope.launchCatching { userRepository.updateUser( "preferences.emailNotifications.$pathKey", - sharedPreferences.getBoolean(key, false), + sharedPreferences.getBoolean(key, false) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt index 9f185c792..48e6368d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt @@ -51,7 +51,7 @@ class HabiticaAccountDialog(private var thisContext: Context) : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View { viewBinding = DialogHabiticaAccountBinding.inflate(layoutInflater) return binding.root @@ -59,7 +59,7 @@ class HabiticaAccountDialog(private var thisContext: Context) : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -89,7 +89,7 @@ class HabiticaAccountDialog(private var thisContext: Context) : val lp = LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT ) input.layoutParams = lp val alertDialog = HabiticaAlertDialog(requireContext()) @@ -142,13 +142,13 @@ class HabiticaAccountDialog(private var thisContext: Context) : p0: CharSequence?, p1: Int, p2: Int, - p3: Int, + p3: Int ) { binding.confirmActionTextview.setTextColor( ContextCompat.getColor( thisContext, - R.color.gray_300, - ), + R.color.gray_300 + ) ) binding.confirmActionTextview.alpha = .4f } @@ -157,13 +157,13 @@ class HabiticaAccountDialog(private var thisContext: Context) : p0: CharSequence?, p1: Int, p2: Int, - p3: Int, + p3: Int ) { if (binding.confirmationInputEdittext.text.toString().isNotEmpty()) { if (( - user?.authentication?.hasPassword != true && binding.confirmationInputEdittext.text.toString() == - context?.getString( - R.string.reset_caps, + user?.authentication?.hasPassword != true && binding.confirmationInputEdittext.text.toString() == + context?.getString( + R.string.reset_caps ) ) || user?.authentication?.hasPassword == true @@ -171,8 +171,8 @@ class HabiticaAccountDialog(private var thisContext: Context) : binding.confirmActionTextview.setTextColor( ContextCompat.getColor( thisContext, - R.color.red_100, - ), + R.color.red_100 + ) ) binding.confirmActionTextview.alpha = 1.0f } @@ -180,8 +180,8 @@ class HabiticaAccountDialog(private var thisContext: Context) : binding.confirmActionTextview.setTextColor( ContextCompat.getColor( thisContext, - R.color.gray_300, - ), + R.color.gray_300 + ) ) binding.confirmActionTextview.alpha = .4f } @@ -189,7 +189,7 @@ class HabiticaAccountDialog(private var thisContext: Context) : override fun afterTextChanged(p0: Editable?) { } - }, + } ) binding.confirmActionTextview.setOnClickListener { @@ -226,13 +226,13 @@ class HabiticaAccountDialog(private var thisContext: Context) : p0: CharSequence?, p1: Int, p2: Int, - p3: Int, + p3: Int ) { binding.confirmActionTextview.setTextColor( ContextCompat.getColor( thisContext, - R.color.gray_300, - ), + R.color.gray_300 + ) ) binding.confirmActionTextview.alpha = .4f } @@ -241,13 +241,13 @@ class HabiticaAccountDialog(private var thisContext: Context) : p0: CharSequence?, p1: Int, p2: Int, - p3: Int, + p3: Int ) { if (binding.confirmationInputEdittext.text.toString().isNotEmpty()) { if (( - user?.authentication?.hasPassword != true && binding.confirmationInputEdittext.text.toString() == - context?.getString( - R.string.delete_caps, + user?.authentication?.hasPassword != true && binding.confirmationInputEdittext.text.toString() == + context?.getString( + R.string.delete_caps ) ) || user?.authentication?.hasPassword == true @@ -255,8 +255,8 @@ class HabiticaAccountDialog(private var thisContext: Context) : binding.confirmActionTextview.setTextColor( ContextCompat.getColor( thisContext, - R.color.red_100, - ), + R.color.red_100 + ) ) binding.confirmActionTextview.alpha = 1.0f } @@ -264,8 +264,8 @@ class HabiticaAccountDialog(private var thisContext: Context) : binding.confirmActionTextview.setTextColor( ContextCompat.getColor( thisContext, - R.color.gray_300, - ), + R.color.gray_300 + ) ) binding.confirmActionTextview.alpha = .4f } @@ -273,7 +273,7 @@ class HabiticaAccountDialog(private var thisContext: Context) : override fun afterTextChanged(p0: Editable?) { } - }, + } ) binding.confirmActionTextview.setOnClickListener { val confirmationString = binding.confirmationInputEdittext.text.toString() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt index 60789c40a..064cf9ab1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt @@ -83,7 +83,7 @@ class PreferencesFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) listView.itemAnimator = null @@ -176,13 +176,13 @@ class PreferencesFragment : dialog.addButton( R.string.change_class, isPrimary = true, - isDestructive = true, + isDestructive = true ) { _, _ -> lifecycleScope.launch { userRepository.changeClass() } classSelectionResult.launch( - intent, + intent ) } dialog.addButton(R.string.close, false) @@ -195,7 +195,7 @@ class PreferencesFragment : "show insufficient gems modal", EventCategory.BEHAVIOUR, HitType.EVENT, - mapOf("reason" to "class change"), + mapOf("reason" to "class change") ) dialog.show() } @@ -211,12 +211,11 @@ class PreferencesFragment : "reload_content" -> { (activity as? SnackbarActivity)?.showSnackbar( - content = context?.getString(R.string.reloading_content), + content = context?.getString(R.string.reloading_content) ) reloadContent(true) } - "clear_database" -> { context?.let { context -> HabiticaBaseApplication.deleteDatabase(context) @@ -224,7 +223,7 @@ class PreferencesFragment : userRepository.retrieveUser(true, true) (activity as? SnackbarActivity)?.showSnackbar( content = context.getString(R.string.cleared_cache), - displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) reloadContent(true) } @@ -240,7 +239,7 @@ class PreferencesFragment : if (withConfirmation) { (activity as? SnackbarActivity)?.showSnackbar( content = context?.getString(R.string.reloaded_content), - displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) } } @@ -261,7 +260,7 @@ class PreferencesFragment : private val notificationPermissionLauncher = registerForActivityResult( - ActivityResultContracts.RequestPermission(), + ActivityResultContracts.RequestPermission() ) { granted -> if (granted) { val usePushPreference = findPreference("usePushNotifications") as? CheckBoxPreference @@ -279,7 +278,7 @@ class PreferencesFragment : .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .putExtra( Settings.EXTRA_APP_PACKAGE, - context?.applicationContext?.packageName, + context?.applicationContext?.packageName ) startActivity(notifSettingIntent) } @@ -293,7 +292,7 @@ class PreferencesFragment : override fun onSharedPreferenceChanged( sharedPreferences: SharedPreferences, - key: String?, + key: String? ) { when (key) { "use_reminder" -> { @@ -321,7 +320,7 @@ class PreferencesFragment : lifecycleScope.launchCatching { userRepository.updateUser( "preferences.pushNotifications.unsubscribeFromAll", - !usePushNotifications, + !usePushNotifications ) } if (usePushNotifications) { @@ -344,7 +343,7 @@ class PreferencesFragment : lifecycleScope.launchCatching { userRepository.updateUser( "preferences.emailNotifications.unsubscribeFromAll", - !useEmailNotifications, + !useEmailNotifications ) } } @@ -368,7 +367,7 @@ class PreferencesFragment : @Suppress("DEPRECATION") activity?.resources?.updateConfiguration( configuration, - activity?.resources?.displayMetrics, + activity?.resources?.displayMetrics ) if (user?.preferences?.language == languageHelper.languageCode) { @@ -456,7 +455,7 @@ class PreferencesFragment : R.string.resume_damage } else { R.string.pause_damage - }, + } ) pauseDamagePreference?.summary = getString( @@ -464,7 +463,7 @@ class PreferencesFragment : R.string.resume_damage_summary } else { R.string.pause_damage_summary - }, + } ) val themePreference = findPreference("theme_name") as? ListPreference @@ -580,7 +579,7 @@ class PreferencesFragment : lifecycleScope.launchCatching { userRepository.updateUser( "preferences.tasks.mirrorGroupTasks", - currentIds, + currentIds ) } true diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt index e3c2a5760..cea30c931 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt @@ -32,55 +32,55 @@ class PushNotificationsPreferencesFragment : isSettingUser = !isInitialSet updatePreference( "preference_push_you_won_challenge", - user?.preferences?.pushNotifications?.wonChallenge, + user?.preferences?.pushNotifications?.wonChallenge ) updatePreference( "preference_push_received_a_private_message", - user?.preferences?.pushNotifications?.newPM, + user?.preferences?.pushNotifications?.newPM ) updatePreference( "preference_push_gifted_gems", - user?.preferences?.pushNotifications?.giftedGems, + user?.preferences?.pushNotifications?.giftedGems ) updatePreference( "preference_push_gifted_subscription", - user?.preferences?.pushNotifications?.giftedSubscription, + user?.preferences?.pushNotifications?.giftedSubscription ) updatePreference( "preference_push_invited_to_party", - user?.preferences?.pushNotifications?.invitedParty, + user?.preferences?.pushNotifications?.invitedParty ) updatePreference( "preference_push_invited_to_guild", - user?.preferences?.pushNotifications?.invitedGuild, + user?.preferences?.pushNotifications?.invitedGuild ) updatePreference( "preference_push_your_quest_has_begun", - user?.preferences?.pushNotifications?.questStarted, + user?.preferences?.pushNotifications?.questStarted ) updatePreference( "preference_push_invited_to_quest", - user?.preferences?.pushNotifications?.invitedQuest, + user?.preferences?.pushNotifications?.invitedQuest ) updatePreference( "preference_push_important_announcements", - user?.preferences?.pushNotifications?.majorUpdates, + user?.preferences?.pushNotifications?.majorUpdates ) updatePreference( "preference_push_party_activity", - user?.preferences?.pushNotifications?.partyActivity, + user?.preferences?.pushNotifications?.partyActivity ) updatePreference( "preference_push_party_mention", - user?.preferences?.pushNotifications?.mentionParty, + user?.preferences?.pushNotifications?.mentionParty ) updatePreference( "preference_push_joined_guild_mention", - user?.preferences?.pushNotifications?.mentionJoinedGuild, + user?.preferences?.pushNotifications?.mentionJoinedGuild ) updatePreference( "preference_push_content_release", - user?.preferences?.pushNotifications?.contentRelease, + user?.preferences?.pushNotifications?.contentRelease ) isSettingUser = false isInitialSet = false @@ -88,7 +88,7 @@ class PushNotificationsPreferencesFragment : private fun updatePreference( key: String, - isChecked: Boolean?, + isChecked: Boolean? ) { val preference = (findPreference(key) as? CheckBoxPreference) preference?.isChecked = isChecked == true @@ -96,7 +96,7 @@ class PushNotificationsPreferencesFragment : override fun onSharedPreferenceChanged( sharedPreferences: SharedPreferences, - key: String?, + key: String? ) { if (isSettingUser) { return @@ -123,7 +123,7 @@ class PushNotificationsPreferencesFragment : lifecycleScope.launchCatching { userRepository.updateUser( "preferences.pushNotifications.$pathKey", - sharedPreferences.getBoolean(key, false), + sharedPreferences.getBoolean(key, false) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/TimePreferenceDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/TimePreferenceDialogFragment.kt index 0f3e00bb5..29106d4f0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/TimePreferenceDialogFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/TimePreferenceDialogFragment.kt @@ -75,7 +75,7 @@ class TimePreferenceDialogFragment : PreferenceDialogFragmentCompat() { fun newInstance( preferenceFragment: PreferenceFragmentCompat, - key: String, + key: String ): TimePreferenceDialogFragment { val fragment = TimePreferenceDialogFragment() val arguments = Bundle(1) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/EventOutcomeSubscriptionBottomSheetFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/EventOutcomeSubscriptionBottomSheetFragment.kt index 814be72cd..00f893d56 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/EventOutcomeSubscriptionBottomSheetFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/EventOutcomeSubscriptionBottomSheetFragment.kt @@ -10,7 +10,7 @@ class EventOutcomeSubscriptionBottomSheetFragment : SubscriptionBottomSheetFragm override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) when (eventType) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt index 0feeca78a..492d9978a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt @@ -50,7 +50,7 @@ class GemsPurchaseFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentGemPurchaseBinding { return FragmentGemPurchaseBinding.inflate(inflater, container, false) } @@ -68,7 +68,7 @@ class GemsPurchaseFragment : BaseFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -116,7 +116,7 @@ class GemsPurchaseFragment : BaseFragment() { Modifier .padding(horizontal = 20.dp) .clip(HabiticaTheme.shapes.medium) - .padding(bottom = 20.dp), + .padding(bottom = 20.dp) ) } } @@ -176,7 +176,7 @@ class GemsPurchaseFragment : BaseFragment() { } if (matchingView != null) { matchingView.setPurchaseButtonText( - sku.oneTimePurchaseOfferDetails?.formattedPrice ?: "", + sku.oneTimePurchaseOfferDetails?.formattedPrice ?: "" ) matchingView.sku = sku } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt index 6cd2b9676..02298d139 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt @@ -38,7 +38,7 @@ class GiftBalanceGemsFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentGiftGemBalanceBinding { return FragmentGiftGemBalanceBinding.inflate(inflater, container, false) } @@ -62,7 +62,7 @@ class GiftBalanceGemsFragment : BaseFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) binding?.giftButton?.setOnClickListener { sendGift() } @@ -86,8 +86,8 @@ class GiftBalanceGemsFragment : BaseFragment() { getString( R.string.gift_confirmation_text_gems_new, giftedMember?.username, - amount.toString(), - ), + amount.toString() + ) ) dialog?.addCloseButton { _, _ -> activity?.finish() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt index 9cf299e29..6c7d25266 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt @@ -28,7 +28,7 @@ class GiftPurchaseGemsFragment : BaseFragment() override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentGiftGemPurchaseBinding { return FragmentGiftGemPurchaseBinding.inflate(inflater, container, false) } @@ -64,7 +64,7 @@ class GiftPurchaseGemsFragment : BaseFragment() private fun updateButtonLabel( sku: ProductDetails, - price: String, + price: String ) { val matchingView: GemPurchaseOptionsView? = when (sku.productId) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionBottomSheetFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionBottomSheetFragment.kt index 839f51914..f3c52df69 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionBottomSheetFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionBottomSheetFragment.kt @@ -59,7 +59,7 @@ open class SubscriptionBottomSheetFragment : BottomSheetDialogFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View { _binding = FragmentBottomsheetSubscriptionBinding.inflate(layoutInflater) return binding.root @@ -67,7 +67,7 @@ open class SubscriptionBottomSheetFragment : BottomSheetDialogFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -90,7 +90,8 @@ open class SubscriptionBottomSheetFragment : BottomSheetDialogFragment() { binding.content.seeMoreButton.visibility = View.VISIBLE binding.content.seeMoreButton.setOnClickListener { - MainNavigationController.navigate(R.id.gemPurchaseActivity, + MainNavigationController.navigate( + R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", true)) ) } @@ -130,7 +131,7 @@ open class SubscriptionBottomSheetFragment : BottomSheetDialogFragment() { updateButtonLabel( sku, sku.subscriptionOfferDetails?.firstOrNull()?.pricingPhases?.pricingPhaseList?.firstOrNull()?.formattedPrice - ?: "", + ?: "" ) } if (selectedSubscriptionSku == null) { @@ -149,7 +150,7 @@ open class SubscriptionBottomSheetFragment : BottomSheetDialogFragment() { private fun updateButtonLabel( sku: ProductDetails, - price: String, + price: String ) { val matchingView = buttonForSku(sku) if (matchingView != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt index 4b0de43e7..65c091220 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt @@ -33,7 +33,6 @@ import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.promo.BirthdayBanner import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView -import com.habitrpg.common.habitica.extensions.isUsingNightModeResources import com.habitrpg.common.habitica.extensions.layoutInflater import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching @@ -52,7 +51,7 @@ class SubscriptionFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentSubscriptionBinding { return FragmentSubscriptionBinding.inflate(inflater, container, false) } @@ -77,7 +76,7 @@ class SubscriptionFragment : BaseFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -88,14 +87,14 @@ class SubscriptionFragment : BaseFragment() { binding?.content?.giftSegmentSubscribed?.giftSubscriptionButton?.setOnClickListener { context?.let { context -> showGiftSubscriptionDialog( - context, + context ) } } binding?.content?.giftSegmentUnsubscribed?.giftSubscriptionButton?.setOnClickListener { context?.let { context -> showGiftSubscriptionDialog( - context, + context ) } } @@ -139,7 +138,7 @@ class SubscriptionFragment : BaseFragment() { Modifier .padding(horizontal = 20.dp) .clip(HabiticaTheme.shapes.medium) - .padding(bottom = 10.dp), + .padding(bottom = 10.dp) ) } } @@ -188,7 +187,7 @@ class SubscriptionFragment : BaseFragment() { updateButtonLabel( sku, sku.subscriptionOfferDetails?.firstOrNull()?.pricingPhases?.pricingPhaseList?.firstOrNull()?.formattedPrice - ?: "", + ?: "" ) } if (selectedSubscriptionSku == null) { @@ -205,7 +204,7 @@ class SubscriptionFragment : BaseFragment() { private fun updateButtonLabel( sku: ProductDetails, - price: String, + price: String ) { val matchingView = buttonForSku(sku) if (matchingView != null) { @@ -309,7 +308,6 @@ class SubscriptionFragment : BaseFragment() { } binding?.content?.subscription12month?.showHourglassPromo(user?.purchased?.plan?.isEligableForHourglassPromo == true) - } binding?.content?.loadingIndicator?.visibility = View.GONE } @@ -336,7 +334,7 @@ class SubscriptionFragment : BaseFragment() { { binding?.content?.scrollView?.smoothScrollTo(0, binding?.content?.subscriptionOptions?.top ?: 0) }, - 500, + 500 ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt index 765e710de..9796349a8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt @@ -40,7 +40,7 @@ class AvatarSetupFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentSetupAvatarBinding { return FragmentSetupAvatarBinding.inflate(inflater, container, false) } @@ -59,7 +59,7 @@ class AvatarSetupFragment : BaseFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -99,7 +99,7 @@ class AvatarSetupFragment : BaseFragment() { override fun onTabReselected(tab: TabLayout.Tab) { // no-on } - }, + } ) binding?.customizationDrawer?.binding?.bodyButton?.setOnClickListener { selectedBodyCategory() } @@ -123,7 +123,7 @@ class AvatarSetupFragment : BaseFragment() { this.selectedBodyCategory() if (context != null) { binding?.speechBubble?.animateText( - context?.getString(R.string.avatar_setup_description) ?: "", + context?.getString(R.string.avatar_setup_description) ?: "" ) } } @@ -136,8 +136,8 @@ class AvatarSetupFragment : BaseFragment() { customizationRepository.getCustomizations( activeCategory, activeSubCategory, - user, - ), + user + ) ) } @@ -166,7 +166,7 @@ class AvatarSetupFragment : BaseFragment() { this.subcategories = listOf( SetupCustomizationRepository.SUBCATEGORY_SIZE, - SetupCustomizationRepository.SUBCATEGORY_SHIRT, + SetupCustomizationRepository.SUBCATEGORY_SHIRT ) binding?.customizationDrawer?.binding?.subcategoryTabs?.newTab() ?.setText(R.string.avatar_size) @@ -196,7 +196,7 @@ class AvatarSetupFragment : BaseFragment() { listOf( SetupCustomizationRepository.SUBCATEGORY_BANGS, SetupCustomizationRepository.SUBCATEGORY_COLOR, - SetupCustomizationRepository.SUBCATEGORY_PONYTAIL, + SetupCustomizationRepository.SUBCATEGORY_PONYTAIL ) binding?.customizationDrawer?.binding?.subcategoryTabs?.newTab() ?.setText(R.string.avatar_hair_bangs) @@ -218,7 +218,7 @@ class AvatarSetupFragment : BaseFragment() { listOf( SetupCustomizationRepository.SUBCATEGORY_GLASSES, SetupCustomizationRepository.SUBCATEGORY_FLOWER, - SetupCustomizationRepository.SUBCATEGORY_WHEELCHAIR, + SetupCustomizationRepository.SUBCATEGORY_WHEELCHAIR ) binding?.customizationDrawer?.binding?.subcategoryTabs?.newTab() ?.setText(R.string.avatar_glasses) @@ -240,72 +240,72 @@ class AvatarSetupFragment : BaseFragment() { customizationRepository.getCustomizations( SetupCustomizationRepository.CATEGORY_BODY, SetupCustomizationRepository.SUBCATEGORY_SIZE, - user, + user ), - false, + false ) updateData["preferences.shirt"] = chooseRandomKey( customizationRepository.getCustomizations( SetupCustomizationRepository.CATEGORY_BODY, SetupCustomizationRepository.SUBCATEGORY_SHIRT, - user, + user ), - false, + false ) updateData["preferences.skin"] = chooseRandomKey( customizationRepository.getCustomizations( SetupCustomizationRepository.CATEGORY_SKIN, SetupCustomizationRepository.SUBCATEGORY_COLOR, - user, + user ), - false, + false ) updateData["preferences.hair.color"] = chooseRandomKey( customizationRepository.getCustomizations( SetupCustomizationRepository.CATEGORY_HAIR, SetupCustomizationRepository.SUBCATEGORY_COLOR, - user, + user ), - false, + false ) updateData["preferences.hair.base"] = chooseRandomKey( customizationRepository.getCustomizations( SetupCustomizationRepository.CATEGORY_HAIR, SetupCustomizationRepository.SUBCATEGORY_PONYTAIL, - user, + user ), - false, + false ) updateData["preferences.hair.bangs"] = chooseRandomKey( customizationRepository.getCustomizations( SetupCustomizationRepository.CATEGORY_HAIR, SetupCustomizationRepository.SUBCATEGORY_BANGS, - user, + user ), - false, + false ) updateData["preferences.hair.flower"] = chooseRandomKey( customizationRepository.getCustomizations( SetupCustomizationRepository.CATEGORY_EXTRAS, SetupCustomizationRepository.SUBCATEGORY_FLOWER, - user, + user ), - true, + true ) updateData["preferences.chair"] = chooseRandomKey( customizationRepository.getCustomizations( SetupCustomizationRepository.CATEGORY_EXTRAS, SetupCustomizationRepository.SUBCATEGORY_WHEELCHAIR, - user, + user ), - true, + true ) lifecycleScope.launchCatching { userRepository.updateUser(updateData) @@ -315,7 +315,7 @@ class AvatarSetupFragment : BaseFragment() { @Suppress("ReturnCount") private fun chooseRandomKey( customizations: List, - weighFirstOption: Boolean, + weighFirstOption: Boolean ): String { if (customizations.isEmpty()) { return "" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.kt index c114119e5..910663b4c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.kt @@ -15,7 +15,7 @@ class IntroFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentIntroBinding { return FragmentIntroBinding.inflate(inflater, container, false) } @@ -29,7 +29,7 @@ class IntroFragment : BaseFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.kt index 9e145f9a7..432c732bb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.kt @@ -30,7 +30,7 @@ class TaskSetupFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentSetupTasksBinding { return FragmentSetupTasksBinding.inflate(inflater, container, false) } @@ -42,7 +42,7 @@ class TaskSetupFragment : BaseFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -60,8 +60,8 @@ class TaskSetupFragment : BaseFragment() { binding?.heartIcon?.setImageDrawable( BitmapDrawable( resources, - HabiticaIconsHelper.imageOfHeartLightBg(), - ), + HabiticaIconsHelper.imageOfHeartLightBg() + ) ) } @@ -69,7 +69,7 @@ class TaskSetupFragment : BaseFragment() { super.onResume() if (context != null) { binding?.speechBubble?.animateText( - context?.getString(R.string.task_setup_description) ?: "", + context?.getString(R.string.task_setup_description) ?: "" ) } } @@ -97,7 +97,7 @@ class TaskSetupFragment : BaseFragment() { listOf(getString(R.string.setup_group_teams), TYPE_TEAMS), listOf(getString(R.string.setup_group_chores), TYPE_CHORES), listOf(getString(R.string.setup_group_creativity), TYPE_CREATIVITY), - listOf(getString(R.string.setuP_group_other), TYPE_OTHER), + listOf(getString(R.string.setuP_group_other), TYPE_OTHER) ) this.tasks = @@ -110,7 +110,7 @@ class TaskSetupFragment : BaseFragment() { TaskType.HABIT, getString(R.string.setup_task_exercise_1), true, - false, + false ), listOf(TYPE_EXERCISE, TaskType.DAILY, getString(R.string.setup_task_exercise_2)), listOf(TYPE_EXERCISE, TaskType.TODO, getString(R.string.setup_task_exercise_3)), @@ -119,7 +119,7 @@ class TaskSetupFragment : BaseFragment() { TaskType.HABIT, getString(R.string.setup_task_healthWellness_1), true, - true, + true ), listOf(TYPE_HEALTH, TaskType.DAILY, getString(R.string.setup_task_healthWellness_2)), listOf(TYPE_HEALTH, TaskType.TODO, getString(R.string.setup_task_healthWellness_3)), @@ -128,7 +128,7 @@ class TaskSetupFragment : BaseFragment() { TaskType.HABIT, getString(R.string.setup_task_school_1), true, - true, + true ), listOf(TYPE_SCHOOL, TaskType.DAILY, getString(R.string.setup_task_school_2)), listOf(TYPE_SCHOOL, TaskType.TODO, getString(R.string.setup_task_school_3)), @@ -140,7 +140,7 @@ class TaskSetupFragment : BaseFragment() { TaskType.HABIT, getString(R.string.setup_task_chores_1), true, - false, + false ), listOf(TYPE_CHORES, TaskType.DAILY, getString(R.string.setup_task_chores_2)), listOf(TYPE_CHORES, TaskType.TODO, getString(R.string.setup_task_chores_3)), @@ -149,10 +149,10 @@ class TaskSetupFragment : BaseFragment() { TaskType.HABIT, getString(R.string.setup_task_creativity_1), true, - false, + false ), listOf(TYPE_CREATIVITY, TaskType.DAILY, getString(R.string.setup_task_creativity_2)), - listOf(TYPE_CREATIVITY, TaskType.TODO, getString(R.string.setup_task_creativity_3)), + listOf(TYPE_CREATIVITY, TaskType.TODO, getString(R.string.setup_task_creativity_3)) ) } @@ -173,7 +173,7 @@ class TaskSetupFragment : BaseFragment() { task[1] as? TaskType, task[2] as? String, task[3] as? Boolean, - task[4] as? Boolean, + task[4] as? Boolean ) } else { this.makeTaskObject(task[1] as? TaskType, task[2] as? String, null, null) @@ -187,8 +187,8 @@ class TaskSetupFragment : BaseFragment() { getString(R.string.setup_task_habit_1), true, false, - getString(R.string.setup_task_habit_1_notes), - ), + getString(R.string.setup_task_habit_1_notes) + ) ) tasks.add( makeTaskObject( @@ -196,8 +196,8 @@ class TaskSetupFragment : BaseFragment() { getString(R.string.setup_task_habit_2), false, true, - getString(R.string.setup_task_habit_2_notes), - ), + getString(R.string.setup_task_habit_2_notes) + ) ) tasks.add( makeTaskObject( @@ -205,8 +205,8 @@ class TaskSetupFragment : BaseFragment() { getString(R.string.setup_task_reward), null, null, - getString(R.string.setup_task_reward_notes), - ), + getString(R.string.setup_task_reward_notes) + ) ) tasks.add( makeTaskObject( @@ -214,8 +214,8 @@ class TaskSetupFragment : BaseFragment() { getString(R.string.setup_task_join_habitica), null, null, - getString(R.string.setup_task_join_habitica_notes), - ), + getString(R.string.setup_task_join_habitica_notes) + ) ) return tasks } @@ -225,7 +225,7 @@ class TaskSetupFragment : BaseFragment() { text: String?, up: Boolean?, down: Boolean?, - notes: String? = null, + notes: String? = null ): Task { val task = Task() task.id = UUID.randomUUID().toString() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/WelcomeFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/WelcomeFragment.kt index 2f8ffabf8..7976f31d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/WelcomeFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/WelcomeFragment.kt @@ -37,7 +37,7 @@ class WelcomeFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentWelcomeBinding { return FragmentWelcomeBinding.inflate(inflater, container, false) } @@ -51,8 +51,8 @@ class WelcomeFragment : BaseFragment() { resources, HabiticaIconsHelper.imageOfCheckmark( ContextCompat.getColor(it, R.color.green_50), - 1f, - ), + 1f + ) ) } ?: VectorDrawable() } @@ -66,7 +66,7 @@ class WelcomeFragment : BaseFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -77,12 +77,12 @@ class WelcomeFragment : BaseFragment() { binding?.displayNameEditText?.addTextChangedListener( OnChangeTextWatcher { p0, _, _, _ -> displayNameVerificationEvents.value = p0.toString() - }, + } ) binding?.usernameEditText?.addTextChangedListener( OnChangeTextWatcher { p0, _, _, _ -> usernameVerificationEvents.value = p0.toString() - }, + } ) lifecycleScope.launchCatching { @@ -94,7 +94,7 @@ class WelcomeFragment : BaseFragment() { null, null, checkmarkIcon, - null, + null ) binding?.issuesTextView?.visibility = View.GONE } else { @@ -102,7 +102,7 @@ class WelcomeFragment : BaseFragment() { null, null, alertIcon, - null, + null ) binding?.issuesTextView?.visibility = View.VISIBLE binding?.issuesTextView?.text = @@ -121,7 +121,7 @@ class WelcomeFragment : BaseFragment() { null, null, checkmarkIcon, - null, + null ) binding?.issuesTextView?.visibility = View.GONE } else { @@ -129,7 +129,7 @@ class WelcomeFragment : BaseFragment() { null, null, alertIcon, - null, + null ) binding?.issuesTextView?.visibility = View.VISIBLE binding?.issuesTextView?.text = it?.issues?.joinToString("\n") diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.kt index 3bdec6fce..a799ebb6d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.kt @@ -30,7 +30,7 @@ class SkillTasksRecyclerViewFragment : BaseFragment override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentRecyclerviewBinding { return FragmentRecyclerviewBinding.inflate(inflater, container, false) } @@ -42,7 +42,7 @@ class SkillTasksRecyclerViewFragment : BaseFragment override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -58,7 +58,7 @@ class SkillTasksRecyclerViewFragment : BaseFragment taskRepository.getTasks( taskType ?: TaskType.HABIT, userViewModel.userID, - additionalGroupIDs, + additionalGroupIDs ) .map { it.filter { it.challengeID == null && it.group?.groupID?.isNotBlank() != true } } if (taskType == TaskType.TODO) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt index 36854f0a1..4a42b621b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt @@ -44,7 +44,7 @@ class SkillsFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentRecyclerviewBinding { return FragmentRecyclerviewBinding.inflate(inflater, container, false) } @@ -52,7 +52,7 @@ class SkillsFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { adapter = SkillsRecyclerViewAdapter() adapter?.onUseSkill = { onSkillSelected(it) } @@ -64,7 +64,7 @@ class SkillsFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) userViewModel.user.observe(viewLifecycleOwner) { user -> @@ -118,7 +118,7 @@ class SkillsFragment : BaseMainFragment() { private fun displaySkillResult( usedSkill: Skill?, - response: SkillResponse, + response: SkillResponse ) { if (!isAdded) return adapter?.mana = response.user?.stats?.mp ?: 0.0 @@ -127,7 +127,7 @@ class SkillsFragment : BaseMainFragment() { showSnackbar( activity.snackbarContainer, context?.getString(R.string.used_skill_without_mana, usedSkill.text), - HabiticaSnackbar.SnackbarDisplayType.BLUE, + HabiticaSnackbar.SnackbarDisplayType.BLUE ) } else { context?.let { @@ -138,7 +138,7 @@ class SkillsFragment : BaseMainFragment() { BitmapDrawable(resources, HabiticaIconsHelper.imageOfMagic()), ContextCompat.getColor(it, R.color.blue_10), "-" + usedSkill?.mana, - HabiticaSnackbar.SnackbarDisplayType.BLUE, + HabiticaSnackbar.SnackbarDisplayType.BLUE ) } } @@ -153,7 +153,7 @@ class SkillsFragment : BaseMainFragment() { BitmapDrawable(resources, HabiticaIconsHelper.imageOfDamage()), ContextCompat.getColor(activity, R.color.green_10), "+%.01f".format(response.damage), - HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) } } @@ -178,7 +178,7 @@ class SkillsFragment : BaseMainFragment() { private fun useSkill( skill: Skill?, - taskId: String? = null, + taskId: String? = null ) { if (skill == null) { return diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt index a179abf38..b32737a53 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt @@ -43,13 +43,13 @@ open class ChatFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentChatBinding { return FragmentChatBinding.inflate(inflater, container, false) } open val viewModel: GroupViewModel by viewModels( - ownerProducer = { requireParentFragment() }, + ownerProducer = { requireParentFragment() } ) @Inject @@ -66,7 +66,7 @@ open class ChatFragment : BaseFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -95,7 +95,7 @@ open class ChatFragment : BaseFragment() { socialRepository, autocompleteContext, viewModel.groupID, - configManager.enableUsernameAutocomplete(), + configManager.enableUsernameAutocomplete() ) binding?.recyclerView?.adapter = chatAdapter @@ -107,12 +107,12 @@ open class ChatFragment : BaseFragment() { override fun onScrolled( recyclerView: androidx.recyclerview.widget.RecyclerView, dx: Int, - dy: Int, + dy: Int ) { super.onScrolled(recyclerView, dx, dy) isScrolledToBottom = layoutManager.findFirstVisibleItemPosition() == 0 } - }, + } ) viewModel.chatmessages.observe(viewLifecycleOwner) { setChatMessages(it) } @@ -180,7 +180,7 @@ open class ChatFragment : BaseFragment() { showSnackbar( activity.snackbarContainer, getString(R.string.chat_message_copied), - SnackbarDisplayType.NORMAL, + SnackbarDisplayType.NORMAL ) } } @@ -194,7 +194,7 @@ open class ChatFragment : BaseFragment() { messageText = chatMessage.text ?: "", groupId = chatMessage.groupId ?: "", userIdBeingReported = chatMessage.userID ?: "", - sourceView = this::class.simpleName ?: "", + sourceView = this::class.simpleName ?: "" ) reportBottomSheetFragment.show(childFragmentManager, ReportBottomSheetFragment.TAG) @@ -225,7 +225,7 @@ open class ChatFragment : BaseFragment() { private fun sendChatMessage(chatText: String) { viewModel.postGroupChat( chatText, - { binding?.recyclerView?.scrollToPosition(0) }, + { binding?.recyclerView?.scrollToPosition(0) } ) { binding?.chatBarView?.message = chatText } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt index 0f1f307d9..2fec4d4bd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt @@ -34,7 +34,6 @@ import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.common.habitica.helpers.ExceptionHandler -import com.habitrpg.common.habitica.helpers.RecyclerViewState import com.habitrpg.common.habitica.helpers.launchCatching import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay @@ -49,7 +48,7 @@ class InboxMessageListFragment : BaseMainFragment) { - //socialRepository.markSomePrivateMessagesAsRead(viewModel.user.value, messages) + // socialRepository.markSomePrivateMessagesAsRead(viewModel.user.value, messages) } private fun refreshConversation() { @@ -201,7 +200,7 @@ class InboxMessageListFragment : BaseMainFragment binding.errorTextView.visibility = View.GONE binding.progressCircular.visibility = View.VISIBLE @@ -218,13 +218,13 @@ class InboxOverviewFragment : private fun openInboxMessages( userID: String, - username: String, + username: String ) { MainNavigationController.navigate( InboxOverviewFragmentDirections.openInboxDetail( userID, - username, - ), + username + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PartyChatFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PartyChatFragment.kt index ea3d3a49c..374a3a1ab 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PartyChatFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PartyChatFragment.kt @@ -5,6 +5,6 @@ import com.habitrpg.android.habitica.ui.viewmodels.PartyViewModel class PartyChatFragment : ChatFragment() { override val viewModel: PartyViewModel by viewModels( - ownerProducer = { requireParentFragment() }, + ownerProducer = { requireParentFragment() } ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt index eb33bd9e1..d63348f90 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt @@ -52,7 +52,7 @@ class QuestDetailFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentQuestDetailBinding { return FragmentQuestDetailBinding.inflate(inflater, container, false) } @@ -67,7 +67,7 @@ class QuestDetailFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -75,7 +75,7 @@ class QuestDetailFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { showsBackButton = true super.onViewCreated(view, savedInstanceState) @@ -150,7 +150,7 @@ class QuestDetailFragment : BaseMainFragment() { // We need to do this, because the quest description can contain markdown AND HTML. binding?.descriptionView?.setText( MarkdownParser.parseMarkdown(questContent.notes).toHtml().fromHtml(), - TextView.BufferType.SPANNABLE, + TextView.BufferType.SPANNABLE ) binding?.questScrollImageView?.loadImage("inventory_quest_scroll_" + questContent.key) @@ -180,8 +180,8 @@ class QuestDetailFragment : BaseMainFragment() { statusTextView?.setTextColor( ContextCompat.getColor( it, - R.color.text_ternary, - ), + R.color.text_ternary + ) ) } @@ -190,8 +190,8 @@ class QuestDetailFragment : BaseMainFragment() { statusTextView?.setTextColor( ContextCompat.getColor( it, - R.color.text_green, - ), + R.color.text_green + ) ) } @@ -200,8 +200,8 @@ class QuestDetailFragment : BaseMainFragment() { statusTextView?.setTextColor( ContextCompat.getColor( it, - R.color.text_red, - ), + R.color.text_red + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt index 6aa461bf7..fb42b02fa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt @@ -18,7 +18,6 @@ import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.DialogChallengeDetailTaskGroupBinding import com.habitrpg.android.habitica.databinding.FragmentChallengeDetailBinding import com.habitrpg.android.habitica.extensions.addCloseButton -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.social.Challenge import com.habitrpg.android.habitica.models.tasks.Task @@ -33,6 +32,7 @@ import com.habitrpg.android.habitica.ui.viewHolders.tasks.TodoViewHolder import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.helpers.EmojiParser import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.MainNavigationController @@ -60,7 +60,7 @@ class ChallengeDetailFragment : BaseMainFragment override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentChallengeDetailBinding { return FragmentChallengeDetailBinding.inflate(inflater, container, false) } @@ -72,7 +72,7 @@ class ChallengeDetailFragment : BaseMainFragment override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -81,7 +81,7 @@ class ChallengeDetailFragment : BaseMainFragment @Suppress("ReturnCount") override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { showsBackButton = true super.onViewCreated(view, savedInstanceState) @@ -171,7 +171,7 @@ class ChallengeDetailFragment : BaseMainFragment override fun onCreateOptionsMenu( menu: Menu, - inflater: MenuInflater, + inflater: MenuInflater ) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.menu_challenge_details, menu) @@ -200,15 +200,15 @@ class ChallengeDetailFragment : BaseMainFragment action = Intent.ACTION_SEND putExtra( Intent.EXTRA_TEXT, - "${context?.getString(R.string.base_url)}/challenges/$challengeID", + "${context?.getString(R.string.base_url)}/challenges/$challengeID" ) type = "text/plain" } startActivity( Intent.createChooser( shareGuildIntent, - context?.getString(R.string.share_challenge_with), - ), + context?.getString(R.string.share_challenge_with) + ) ) } @@ -235,7 +235,7 @@ class ChallengeDetailFragment : BaseMainFragment val l = context.packageManager.queryIntentActivities( launchBrowser, - PackageManager.MATCH_DEFAULT_ONLY, + PackageManager.MATCH_DEFAULT_ONLY ) val notHabitica = l.firstOrNull { !it.activityInfo.processName.contains("habitica") } if (notHabitica != null) { @@ -253,13 +253,13 @@ class ChallengeDetailFragment : BaseMainFragment reportType = ReportBottomSheetFragment.REPORT_TYPE_CHALLENGE, challengeBeingReported = challengeID ?: "", displayName = challenge?.name ?: "", - sourceView = this::class.simpleName ?: "", + sourceView = this::class.simpleName ?: "" ) activity?.supportFragmentManager?.let { reportBottomSheetFragment.show( it, - ReportBottomSheetFragment.TAG, + ReportBottomSheetFragment.TAG ) } } @@ -310,7 +310,7 @@ class ChallengeDetailFragment : BaseMainFragment DialogChallengeDetailTaskGroupBinding.inflate( layoutInflater, binding?.taskGroupLayout, - true, + true ) groupBinding.taskGroupName.text = getLabelByTypeAndCount(Challenge.TASK_ORDER_HABITS, habits.size) @@ -330,7 +330,7 @@ class ChallengeDetailFragment : BaseMainFragment DialogChallengeDetailTaskGroupBinding.inflate( layoutInflater, binding?.taskGroupLayout, - true, + true ) groupBinding.taskGroupName.text = getLabelByTypeAndCount(Challenge.TASK_ORDER_DAILYS, dailies.size) @@ -351,7 +351,7 @@ class ChallengeDetailFragment : BaseMainFragment DialogChallengeDetailTaskGroupBinding.inflate( layoutInflater, binding?.taskGroupLayout, - true, + true ) groupBinding.taskGroupName.text = getLabelByTypeAndCount(Challenge.TASK_ORDER_TODOS, todos.size) @@ -372,7 +372,7 @@ class ChallengeDetailFragment : BaseMainFragment DialogChallengeDetailTaskGroupBinding.inflate( layoutInflater, binding?.taskGroupLayout, - true, + true ) groupBinding.taskGroupName.text = getLabelByTypeAndCount(Challenge.TASK_ORDER_REWARDS, rewards.size) @@ -390,7 +390,7 @@ class ChallengeDetailFragment : BaseMainFragment private fun getLabelByTypeAndCount( type: String, - count: Int, + count: Int ): String { return when (type) { Challenge.TASK_ORDER_DAILYS -> context?.getString(if (count == 1) R.string.daily else R.string.dailies) @@ -414,7 +414,7 @@ class ChallengeDetailFragment : BaseMainFragment alert.addButton( R.string.leave_delete_tasks, isPrimary = false, - isDestructive = true, + isDestructive = true ) { _, _ -> val challenge = challenge ?: return@addButton lifecycleScope.launchCatching { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterDialogHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterDialogHolder.kt index 5520870d1..d92b101a1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterDialogHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterDialogHolder.kt @@ -11,7 +11,7 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaBottomSheetDialog internal class ChallengeFilterDialogHolder private constructor( view: View, - private val context: Activity, + private val context: Activity ) { private val binding = DialogChallengeFilterBinding.bind(view) @@ -34,7 +34,7 @@ internal class ChallengeFilterDialogHolder private constructor( fun bind( filterGroups: List, currentFilter: ChallengeFilterOptions?, - selectedGroupsCallback: ((ChallengeFilterOptions) -> Unit)?, + selectedGroupsCallback: ((ChallengeFilterOptions) -> Unit)? ) { this.filterGroups = filterGroups this.currentFilter = currentFilter @@ -71,7 +71,7 @@ internal class ChallengeFilterDialogHolder private constructor( activity: Activity, filterGroups: List, currentFilter: ChallengeFilterOptions?, - selectedGroupsCallback: ((ChallengeFilterOptions) -> Unit), + selectedGroupsCallback: ((ChallengeFilterOptions) -> Unit) ) { val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_challenge_filter, null) @@ -85,8 +85,8 @@ internal class ChallengeFilterDialogHolder private constructor( ChallengeFilterOptions( holder.adapter?.checkedEntries ?: emptyList(), holder.binding.challengeFilterOwned.isChecked, - holder.binding.challengeFilterNotOwned.isChecked, - ), + holder.binding.challengeFilterNotOwned.isChecked + ) ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.kt index 18e3874ea..a38e93340 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.kt @@ -5,5 +5,5 @@ import com.habitrpg.android.habitica.models.social.Group data class ChallengeFilterOptions( var showByGroups: List, var showOwned: Boolean = false, - var notOwned: Boolean = false, + var notOwned: Boolean = false ) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt index 3537bdb7a..57cebb9e1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt @@ -46,7 +46,7 @@ class ChallengeListFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentRefreshRecyclerviewBinding { return FragmentRefreshRecyclerviewBinding.inflate(inflater, container, false) } @@ -73,7 +73,7 @@ class ChallengeListFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -85,7 +85,7 @@ class ChallengeListFragment : binding?.recyclerView?.emptyItem = EmptyItem( getString(R.string.empty_challenge_list), - getString(R.string.empty_discover_description), + getString(R.string.empty_discover_description) ) } binding?.recyclerView?.layoutManager = @@ -115,7 +115,7 @@ class ChallengeListFragment : object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged( recyclerView: RecyclerView, - newState: Int, + newState: Int ) { super.onScrollStateChanged(recyclerView, newState) @@ -123,7 +123,7 @@ class ChallengeListFragment : retrieveChallengesPage() } } - }, + } ) retrieveChallengesPage(true) @@ -132,8 +132,8 @@ class ChallengeListFragment : private fun openDetailFragment(challengeID: String) { MainNavigationController.navigate( ChallengesOverviewFragmentDirections.openChallengeDetail( - challengeID, - ), + challengeID + ) ) } @@ -186,7 +186,7 @@ class ChallengeListFragment : ChallengeFilterDialogHolder.showDialog( it, filterGroups ?: emptyList(), - filterOptions, + filterOptions ) { changeFilter(it) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt index 1bc694ca0..65425772d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt @@ -31,7 +31,7 @@ class ChallengesOverviewFragment : BaseMainFragment() override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentViewpagerBinding { return FragmentViewpagerBinding.inflate(inflater, container, false) } @@ -43,7 +43,7 @@ class ChallengesOverviewFragment : BaseMainFragment() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.usesTabLayout = true this.hidesToolbar = true @@ -52,7 +52,7 @@ class ChallengesOverviewFragment : BaseMainFragment() override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -74,7 +74,7 @@ class ChallengesOverviewFragment : BaseMainFragment() override fun onCreateOptionsMenu( menu: Menu, - inflater: MenuInflater, + inflater: MenuInflater ) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.menu_list_challenges, menu) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt index f4ecee943..590e36f1f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt @@ -51,18 +51,18 @@ class GuildDetailFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentGuildDetailBinding { return FragmentGuildDetailBinding.inflate(inflater, container, false) } val viewModel: GroupViewModel by viewModels( - ownerProducer = { parentFragment as Fragment }, + ownerProducer = { parentFragment as Fragment } ) override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -170,7 +170,7 @@ class GuildDetailFragment : BaseFragment() { alert.addButton( R.string.leave_challenges_delete_tasks, isPrimary = false, - isDestructive = true, + isDestructive = true ) { _, _ -> viewModel.leaveGroup(false, false, groupChallenges, false) { showLeaveSnackbar() } } @@ -183,7 +183,7 @@ class GuildDetailFragment : BaseFragment() { alert.addButton( R.string.leave, isPrimary = true, - isDestructive = true, + isDestructive = true ) { _, _ -> viewModel.leaveGroup(false, false, groupChallenges, false) { showLeaveSnackbar() @@ -204,8 +204,8 @@ class GuildDetailFragment : BaseFragment() { binding?.titleView?.text = guild?.name binding?.guildMembersIcon?.setImageBitmap( HabiticaIconsHelper.imageOfGuildCrestMedium( - (guild?.memberCount ?: 0).toFloat(), - ), + (guild?.memberCount ?: 0).toFloat() + ) ) binding?.guildMembersText?.text = guild?.memberCount.toString() binding?.guildBankText?.text = guild?.gemCount.toString() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildFragment.kt index 78bc35157..274453401 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildFragment.kt @@ -36,7 +36,7 @@ class GuildFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentViewpagerBinding { return FragmentViewpagerBinding.inflate(inflater, container, false) } @@ -44,7 +44,7 @@ class GuildFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.usesTabLayout = true this.hidesToolbar = true @@ -53,7 +53,7 @@ class GuildFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { showsBackButton = true super.onViewCreated(view, savedInstanceState) @@ -103,7 +103,7 @@ class GuildFragment : BaseMainFragment() { override fun onCreateOptionsMenu( menu: Menu, - inflater: MenuInflater, + inflater: MenuInflater ) { if (this.mainActivity != null) { if (viewModel.isMember) { @@ -182,7 +182,7 @@ class GuildFragment : BaseMainFragment() { override fun onPageScrolled( position: Int, positionOffset: Float, - positionOffsetPixels: Int, + positionOffsetPixels: Int ) { if (position == 1) { chatFragment?.setNavigatedToFragment() @@ -194,7 +194,7 @@ class GuildFragment : BaseMainFragment() { chatFragment?.setNavigatedToFragment() } } - }, + } ) tabLayout?.let { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt index eee2860c7..e7726d828 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt @@ -22,7 +22,6 @@ import com.habitrpg.android.habitica.ui.activities.GroupFormActivity import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.common.habitica.extensions.DataBindingUtils -import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.MainNavigationController import com.habitrpg.common.habitica.helpers.launchCatching import dagger.hilt.android.AndroidEntryPoint @@ -46,7 +45,7 @@ class NoPartyFragmentFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentNoPartyBinding { return FragmentNoPartyBinding.inflate(inflater, container, false) } @@ -54,7 +53,7 @@ class NoPartyFragmentFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -62,7 +61,7 @@ class NoPartyFragmentFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -76,7 +75,7 @@ class NoPartyFragmentFragment : BaseMainFragment() { parentFragmentManager.popBackStack() MainNavigationController.navigate( R.id.partyFragment, - bundleOf(Pair("partyID", userViewModel.partyID)), + bundleOf(Pair("partyID", userViewModel.partyID)) ) } } @@ -137,7 +136,7 @@ class NoPartyFragmentFragment : BaseMainFragment() { val bitmapDrawable = BitmapDrawable( context.resources, - Bitmap.createScaledBitmap(bitmap, width, height, false), + Bitmap.createScaledBitmap(bitmap, width, height, false) ) bitmapDrawable.tileModeX = Shader.TileMode.REPEAT if (binding?.noPartyBackground != null) { @@ -160,7 +159,7 @@ class NoPartyFragmentFragment : BaseMainFragment() { bundle.getString("leader"), "party", bundle.getString("privacy"), - bundle.getBoolean("leaderCreateChallenge"), + bundle.getBoolean("leaderCreateChallenge") ) userRepository.retrieveUser(false, true) if (isAdded) { @@ -168,7 +167,7 @@ class NoPartyFragmentFragment : BaseMainFragment() { } MainNavigationController.navigate( R.id.partyFragment, - bundleOf(Pair("partyID", group?.id)), + bundleOf(Pair("partyID", group?.id)) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt index 6e694bcd9..e6922f67c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt @@ -60,14 +60,14 @@ import javax.inject.Inject @AndroidEntryPoint class PartyDetailFragment : BaseFragment() { val viewModel: PartyViewModel by viewModels( - ownerProducer = { parentFragment as Fragment }, + ownerProducer = { parentFragment as Fragment } ) override var binding: FragmentPartyDetailBinding? = null override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentPartyDetailBinding { return FragmentPartyDetailBinding.inflate(inflater, container, false) } @@ -94,7 +94,7 @@ class PartyDetailFragment : BaseFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) binding?.refreshLayout?.setOnRefreshListener { this.refreshParty() } @@ -117,7 +117,7 @@ class PartyDetailFragment : BaseFragment() { parentFragmentManager.popBackStack() MainNavigationController.navigate( R.id.partyFragment, - bundleOf(Pair("partyID", user?.party?.id)), + bundleOf(Pair("partyID", user?.party?.id)) ) } } @@ -136,7 +136,7 @@ class PartyDetailFragment : BaseFragment() { val state = viewModel.pendingInviteStates.getOrDefault( invitedMember.id, - LoadingButtonState.CONTENT, + LoadingButtonState.CONTENT ) PartySeekingListItem( user = invitedMember, @@ -147,7 +147,7 @@ class PartyDetailFragment : BaseFragment() { configManager = appConfigManager, onInvite = { viewModel.rescindInvite(invitedMember) - }, + } ) } } @@ -235,7 +235,7 @@ class PartyDetailFragment : BaseFragment() { requireContext().resources.getQuantityString( R.plurals.items_pending, collectedItems ?: 0, - collectedItems ?: 0, + collectedItems ?: 0 ) } @@ -255,7 +255,7 @@ class PartyDetailFragment : BaseFragment() { getString( R.string.invitation_title, member.displayName, - groupName, + groupName ) } } @@ -305,15 +305,15 @@ class PartyDetailFragment : BaseFragment() { binding?.questParticipationView?.setTextColor( ContextCompat.getColor( it, - R.color.text_ternary, - ), + R.color.text_ternary + ) ) } if (viewModel.isQuestActive) { binding?.questProgressView?.visibility = View.VISIBLE binding?.questProgressView?.setData( questContent, - viewModel.getGroupData().value?.quest?.progress, + viewModel.getGroupData().value?.quest?.progress ) val questParticipants = viewModel.getGroupData().value?.quest?.members @@ -329,8 +329,8 @@ class PartyDetailFragment : BaseFragment() { binding?.questParticipationView?.setTextColor( ContextCompat.getColor( it, - R.color.red_10, - ), + R.color.red_10 + ) ) } binding?.questImageWrapper?.alpha = 0.5f @@ -362,7 +362,7 @@ class PartyDetailFragment : BaseFragment() { view?.tag = member.id view } - ) ?: return@forEachIndexed + ) ?: return@forEachIndexed val viewHolder = GroupMemberViewHolder(memberView) viewHolder.bind(member, leaderID ?: "", viewModel.user.value?.id) viewHolder.onClickEvent = { @@ -382,7 +382,7 @@ class PartyDetailFragment : BaseFragment() { private fun showSendMessageToUserDialog( userID: String, - username: String, + username: String ) { val factory = LayoutInflater.from(context) val newMessageView = factory.inflate(R.layout.profile_new_message_dialog, null) @@ -401,7 +401,7 @@ class PartyDetailFragment : BaseFragment() { HabiticaSnackbar.showSnackbar( it1, String.format(getString(R.string.profile_message_sent_to), username), - HabiticaSnackbar.SnackbarDisplayType.NORMAL, + HabiticaSnackbar.SnackbarDisplayType.NORMAL ) } } @@ -409,7 +409,7 @@ class PartyDetailFragment : BaseFragment() { } addMessageDialog?.addButton( android.R.string.cancel, - false, + false ) { _, _ -> activity?.dismissKeyboard() } addMessageDialog?.setAdditionalContentView(newMessageView) addMessageDialog?.show() @@ -417,7 +417,7 @@ class PartyDetailFragment : BaseFragment() { private fun showTransferOwnerShipDialog( userID: String, - displayName: String, + displayName: String ) { val dialog = context?.let { HabiticaAlertDialog(it) } dialog?.addButton(R.string.transfer, true) { _, _ -> @@ -427,7 +427,7 @@ class PartyDetailFragment : BaseFragment() { HabiticaSnackbar.showSnackbar( it1, String.format(getString(R.string.transferred_ownership), displayName), - HabiticaSnackbar.SnackbarDisplayType.NORMAL, + HabiticaSnackbar.SnackbarDisplayType.NORMAL ) } } @@ -438,15 +438,15 @@ class PartyDetailFragment : BaseFragment() { dialog?.setMessage( context?.getString( R.string.transfer_ownership_confirm_message, - displayName, - ), + displayName + ) ) dialog?.show() } private fun showRemoveMemberDialog( userID: String, - displayName: String, + displayName: String ) { val dialog = context?.let { HabiticaAlertDialog(it) } dialog?.addButton(R.string.remove, true) { _, _ -> @@ -456,7 +456,7 @@ class PartyDetailFragment : BaseFragment() { HabiticaSnackbar.showSnackbar( it1, String.format(getString(R.string.removed_member), displayName), - HabiticaSnackbar.SnackbarDisplayType.NORMAL, + HabiticaSnackbar.SnackbarDisplayType.NORMAL ) binding?.membersWrapper?.findViewWithTag(userID)?.let { memberView -> binding?.membersWrapper?.removeView(memberView) @@ -515,7 +515,7 @@ class PartyDetailFragment : BaseFragment() { alert.addButton( R.string.leave_challenges_delete_tasks, false, - isDestructive = true, + isDestructive = true ) { _, _ -> viewModel.leaveGroup(viewModel.isUserOnQuest, viewModel.isUserQuestLeader, groupChallenges, false) { parentFragmentManager.popBackStack() @@ -539,7 +539,7 @@ class PartyDetailFragment : BaseFragment() { alert.addButton( R.string.leave, isPrimary = true, - isDestructive = true, + isDestructive = true ) { _, _ -> viewModel.leaveGroup(viewModel.isUserOnQuest, viewModel.isUserQuestLeader, groupChallenges, false) { if (isAdded) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt index 0176c9cd7..9fea8555d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt @@ -36,7 +36,7 @@ class PartyFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentViewpagerBinding { return FragmentViewpagerBinding.inflate(inflater, container, false) } @@ -44,7 +44,7 @@ class PartyFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.usesTabLayout = true this.hidesToolbar = true @@ -53,14 +53,14 @@ class PartyFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) viewModel.groupViewType = GroupViewType.PARTY viewModel.getGroupData().observe( - viewLifecycleOwner, + viewLifecycleOwner ) { updateGroupUI(it) } @@ -107,7 +107,7 @@ class PartyFragment : BaseMainFragment() { override fun onCreateOptionsMenu( menu: Menu, - inflater: MenuInflater, + inflater: MenuInflater ) { super.onCreateOptionsMenu(menu, inflater) val group = viewModel.getGroupData().value diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.kt index d1bd4b8f4..f87f592f1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.kt @@ -81,38 +81,38 @@ fun uUIDFromStringOrNull(name: String): UUID? { @HiltViewModel class PartyInviteViewModel - @Inject - constructor( - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val socialRepository: SocialRepository, - ) : BaseViewModel(userRepository, userViewModel) { - val invites = mutableStateListOf("") +@Inject +constructor( + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val socialRepository: SocialRepository +) : BaseViewModel(userRepository, userViewModel) { + val invites = mutableStateListOf("") - suspend fun sendInvites(): List? { - val inviteMap = - mapOf>( - "emails" to mutableListOf(), - "uuids" to mutableListOf(), - "usernames" to mutableListOf(), - ) - for (invite in invites) { - if (invite.isValidEmail()) { - inviteMap["emails"]?.add( - mapOf( - "name" to "", - "email" to invite, - ), + suspend fun sendInvites(): List? { + val inviteMap = + mapOf>( + "emails" to mutableListOf(), + "uuids" to mutableListOf(), + "usernames" to mutableListOf() + ) + for (invite in invites) { + if (invite.isValidEmail()) { + inviteMap["emails"]?.add( + mapOf( + "name" to "", + "email" to invite ) - } else if (uUIDFromStringOrNull(invite) != null) { - inviteMap["uuids"]?.add(invite) - } else if (invite.isNotBlank()) { - inviteMap["usernames"]?.add(invite) - } + ) + } else if (uUIDFromStringOrNull(invite) != null) { + inviteMap["uuids"]?.add(invite) + } else if (invite.isNotBlank()) { + inviteMap["usernames"]?.add(invite) } - return socialRepository.inviteToGroup("party", inviteMap) } + return socialRepository.inviteToGroup("party", inviteMap) } +} @AndroidEntryPoint class PartyInviteFragment : BaseFragment() { @@ -122,7 +122,7 @@ class PartyInviteFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentComposeBinding { return FragmentComposeBinding.inflate(inflater, container, false) } @@ -130,7 +130,7 @@ class PartyInviteFragment : BaseFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { val view = super.onCreateView(inflater, container, savedInstanceState) binding?.composeView?.setContent { @@ -148,7 +148,7 @@ class PartyInviteFragment : BaseFragment() { @Composable fun PartyInviteView( viewModel: PartyInviteViewModel, - dismiss: () -> Unit, + dismiss: () -> Unit ) { var inviteButtonState: LoadingButtonState by remember { mutableStateOf(LoadingButtonState.CONTENT) } val scope = rememberCoroutineScope() @@ -158,27 +158,27 @@ fun PartyInviteView( Modifier .fillMaxSize() .padding(14.dp) - .scrollable(scrollableState, Orientation.Vertical), + .scrollable(scrollableState, Orientation.Vertical) ) { item { Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = - Modifier - .fillMaxWidth() - .padding(top = 22.dp, bottom = 14.dp), + Modifier + .fillMaxWidth() + .padding(top = 22.dp, bottom = 14.dp) ) { Text( stringResource(R.string.invite_with_username_email), color = HabiticaTheme.colors.textPrimary, fontSize = 16.sp, fontWeight = FontWeight.Medium, - modifier = Modifier.padding(bottom = 4.dp), + modifier = Modifier.padding(bottom = 4.dp) ) Text( stringResource(R.string.habiticans_send_invite), color = HabiticaTheme.colors.textSecondary, - style = TextStyle(fontSize = 16.sp, fontWeight = FontWeight.Normal), + style = TextStyle(fontSize = 16.sp, fontWeight = FontWeight.Normal) ) } } @@ -189,19 +189,19 @@ fun PartyInviteView( val rotation = transition.animateFloat( label = "isAssigned", - transitionSpec = { spring(Spring.DampingRatioLowBouncy, Spring.StiffnessMediumLow) }, + transitionSpec = { spring(Spring.DampingRatioLowBouncy, Spring.StiffnessMediumLow) } ) { if (it) 135f else 0f } Row( verticalAlignment = Alignment.CenterVertically, modifier = - Modifier - .fillMaxWidth() - .padding(0.dp, 4.dp) - .background(HabiticaTheme.colors.windowBackground, HabiticaTheme.shapes.medium) - .padding(4.dp, 4.dp) - .animateItemPlacement(), + Modifier + .fillMaxWidth() + .padding(0.dp, 4.dp) + .background(HabiticaTheme.colors.windowBackground, HabiticaTheme.shapes.medium) + .padding(4.dp, 4.dp) + .animateItemPlacement() ) { Button( onClick = { @@ -213,18 +213,18 @@ fun PartyInviteView( elevation = ButtonDefaults.buttonElevation(0.dp), contentPadding = PaddingValues(0.dp), modifier = - Modifier - .size(32.dp) - .padding(3.dp), + Modifier + .size(32.dp) + .padding(3.dp) ) { Image( painterResource(R.drawable.ic_close_white_24dp), null, colorFilter = ColorFilter.tint(HabiticaTheme.colors.textPrimary), modifier = - Modifier - .rotate(rotation.value) - .size(32.dp), + Modifier + .rotate(rotation.value) + .size(32.dp) ) } @@ -240,22 +240,22 @@ fun PartyInviteView( textStyle = TextStyle(fontSize = 16.sp), placeholder = { Text(stringResource(R.string.username_or_email)) }, colors = - TextFieldDefaults.colors( - unfocusedContainerColor = Color.Transparent, - focusedContainerColor = Color.Transparent, - unfocusedIndicatorColor = Color.Transparent, - focusedIndicatorColor = Color.Transparent, - focusedTextColor = HabiticaTheme.colors.textPrimary, - ), + TextFieldDefaults.colors( + unfocusedContainerColor = Color.Transparent, + focusedContainerColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + focusedTextColor = HabiticaTheme.colors.textPrimary + ), modifier = - Modifier - .onFocusChanged { - if (!it.isFocused) { - if (viewModel.invites.size > index && viewModel.invites[index].isBlank() && viewModel.invites.size - 1 != index && viewModel.invites.size > 1) { - viewModel.invites.removeAt(index) - } + Modifier + .onFocusChanged { + if (!it.isFocused) { + if (viewModel.invites.size > index && viewModel.invites[index].isBlank() && viewModel.invites.size - 1 != index && viewModel.invites.size > 1) { + viewModel.invites.removeAt(index) } - }, + } + } ) } } @@ -283,7 +283,7 @@ fun PartyInviteView( inviteButtonState = LoadingButtonState.CONTENT } } - }, + } ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInvitePagerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInvitePagerFragment.kt index 121a9b3a4..69879d55e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInvitePagerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInvitePagerFragment.kt @@ -23,7 +23,7 @@ class PartyInvitePagerFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentViewpagerBinding { return FragmentViewpagerBinding.inflate(inflater, container, false) } @@ -31,7 +31,7 @@ class PartyInvitePagerFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.usesTabLayout = true this.hidesToolbar = true @@ -50,7 +50,7 @@ class PartyInvitePagerFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt index 40c6b59b3..4040f5ef1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt @@ -84,45 +84,45 @@ import kotlin.time.toDuration @HiltViewModel class PartySeekingViewModel - @Inject - constructor( - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val socialRepository: SocialRepository, - val configManager: AppConfigManager, - ) : BaseViewModel(userRepository, userViewModel) { - val isRefreshing = mutableStateOf(false) - val seekingUsers: Flow> - val inviteStates = mutableStateMapOf>() +@Inject +constructor( + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val socialRepository: SocialRepository, + val configManager: AppConfigManager +) : BaseViewModel(userRepository, userViewModel) { + val isRefreshing = mutableStateOf(false) + val seekingUsers: Flow> + val inviteStates = mutableStateMapOf>() - init { - seekingUsers = - Pager( - config = - PagingConfig( - pageSize = 30, - prefetchDistance = 10, - ), - pagingSourceFactory = { - PartySeekingPagingSource(socialRepository) - }, - ).flow.cachedIn(viewModelScope) - } - - suspend fun inviteUser(member: Member): InviteResponse? { - return socialRepository.inviteToGroup( - "party", - mapOf( - "uuids" to listOf(member.id), + init { + seekingUsers = + Pager( + config = + PagingConfig( + pageSize = 30, + prefetchDistance = 10 ), - )?.firstOrNull() - } - - suspend fun rescindInvite(member: Member): Member? { - return socialRepository.removeMemberFromGroup("party", member.id)?.firstOrNull() - } + pagingSourceFactory = { + PartySeekingPagingSource(socialRepository) + } + ).flow.cachedIn(viewModelScope) } + suspend fun inviteUser(member: Member): InviteResponse? { + return socialRepository.inviteToGroup( + "party", + mapOf( + "uuids" to listOf(member.id) + ) + )?.firstOrNull() + } + + suspend fun rescindInvite(member: Member): Member? { + return socialRepository.removeMemberFromGroup("party", member.id)?.firstOrNull() + } +} + @AndroidEntryPoint class PartySeekingFragment : BaseFragment() { val viewModel: PartySeekingViewModel by viewModels() @@ -131,7 +131,7 @@ class PartySeekingFragment : BaseFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentComposeBinding { return FragmentComposeBinding.inflate(inflater) } @@ -139,7 +139,7 @@ class PartySeekingFragment : BaseFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { val view = super.onCreateView(inflater, container, savedInstanceState) binding?.composeView?.setContent { @@ -162,14 +162,14 @@ fun InviteButton( state: LoadingButtonState, onClick: () -> Unit, modifier: Modifier = Modifier, - isAlreadyInvited: Boolean = false, + isAlreadyInvited: Boolean = false ) { AnimatedContent( transitionSpec = { fadeIn(animationSpec = tween(220, delayMillis = 90)) togetherWith fadeOut(animationSpec = tween(90)) }, - targetState = isAlreadyInvited, + targetState = isAlreadyInvited ) { isInvited -> if (isInvited) { LoadingButton( @@ -177,14 +177,14 @@ fun InviteButton( onClick = onClick, type = LoadingButtonType.DESTRUCTIVE, colors = - ButtonDefaults.buttonColors( - containerColor = HabiticaTheme.colors.errorBackground, - contentColor = Color.White, - ), + ButtonDefaults.buttonColors( + containerColor = HabiticaTheme.colors.errorBackground, + contentColor = Color.White + ), modifier = modifier, successContent = { Text(stringResource(R.string.rescinded)) - }, + } ) { Text(stringResource(R.string.rescind_invite)) } @@ -195,7 +195,7 @@ fun InviteButton( modifier = modifier, successContent = { Text(stringResource(R.string.invited)) - }, + } ) { Text(stringResource(R.string.send_invite)) } @@ -207,7 +207,7 @@ fun InviteButton( @Composable fun PartySeekingView( viewModel: PartySeekingViewModel, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { val pageData = viewModel.seekingUsers.collectAsLazyPagingItems() val refreshing by viewModel.isRefreshing @@ -237,14 +237,14 @@ fun PartySeekingView( modifier = Modifier .fillMaxWidth() - .padding(top = 36.dp, bottom = 14.dp), + .padding(top = 36.dp, bottom = 14.dp) ) { Text( stringResource(R.string.find_more_members), color = HabiticaTheme.colors.textPrimary, fontSize = 16.sp, fontWeight = FontWeight.Medium, - modifier = Modifier.padding(bottom = 4.dp), + modifier = Modifier.padding(bottom = 4.dp) ) if (pageData.itemCount == 0 && pageData.loadState.refresh is LoadState.NotLoading && pageData.loadState.append is LoadState.NotLoading) { Text( @@ -255,12 +255,12 @@ fun PartySeekingView( modifier = Modifier .width(320.dp) - .align(alignment = Alignment.CenterHorizontally), + .align(alignment = Alignment.CenterHorizontally) ) Image( painterResource(R.drawable.looking_for_party_empty), null, - modifier = Modifier.padding(top = 50.dp), + modifier = Modifier.padding(top = 50.dp) ) } else { Text( @@ -271,26 +271,26 @@ fun PartySeekingView( modifier = Modifier .width(320.dp) - .align(alignment = Alignment.CenterHorizontally), + .align(alignment = Alignment.CenterHorizontally) ) } } } items( - pageData.itemCount, + pageData.itemCount ) { val item = pageData[it] ?: return@items PartySeekingListItem( user = item, inviteState = - viewModel.inviteStates[item.id]?.second - ?: LoadingButtonState.CONTENT, + viewModel.inviteStates[item.id]?.second + ?: LoadingButtonState.CONTENT, isInvited = viewModel.inviteStates[item.id]?.first ?: false, configManager = viewModel.configManager, modifier = Modifier .animateItemPlacement() - .padding(horizontal = 14.dp), + .padding(horizontal = 14.dp) ) { member -> scope.launchCatching({ viewModel.inviteStates[member.id] = Pair(false, LoadingButtonState.FAILED) @@ -303,7 +303,7 @@ fun PartySeekingView( viewModel.rescindInvite(member) } else { viewModel.inviteUser( - member, + member ) } if (response != null) { @@ -328,10 +328,10 @@ fun PartySeekingView( item { Column( modifier = - Modifier - .fillParentMaxSize(), + Modifier + .fillParentMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, + verticalArrangement = Arrangement.Center ) { HabiticaCircularProgressView() } @@ -352,7 +352,7 @@ fun PartySeekingView( Modifier .fillMaxWidth() .padding(12.dp), - contentAlignment = Alignment.Center, + contentAlignment = Alignment.Center ) { HabiticaCircularProgressView(indicatorSize = 32.dp) } @@ -362,22 +362,23 @@ fun PartySeekingView( else -> {} } } - PullToRefreshContainer(modifier = Modifier.align(Alignment.TopCenter), + PullToRefreshContainer( + modifier = Modifier.align(Alignment.TopCenter), state = pullRefreshState, indicator = { HabiticaPullRefreshIndicator( pageData.itemCount == 0, refreshing, it, - Modifier.align(Alignment.TopCenter), + Modifier.align(Alignment.TopCenter) ) - }) - + } + ) } } class PartySeekingPagingSource( - private val repository: SocialRepository, + private val repository: SocialRepository ) : PagingSource() { override fun getRefreshKey(state: PagingState): Int? { return state.anchorPosition?.let { anchorPosition -> @@ -394,7 +395,7 @@ class PartySeekingPagingSource( LoadResult.Page( data = response ?: emptyList(), prevKey = if (page == 0) null else page.minus(1), - nextKey = if ((response?.size ?: 0) < 30) null else page.plus(1), + nextKey = if ((response?.size ?: 0) < 30) null else page.plus(1) ) } catch (e: Exception) { LoadResult.Error(e) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt index 994324c5b..bc60104be 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt @@ -32,7 +32,7 @@ class BugFixFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentSupportBugFixBinding { return FragmentSupportBugFixBinding.inflate(inflater, container, false) } @@ -46,7 +46,7 @@ class BugFixFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { hidesToolbar = true showsBackButton = true @@ -55,7 +55,7 @@ class BugFixFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -75,7 +75,7 @@ class BugFixFragment : BaseMainFragment() { issueBinding.root.setOnClickListener { MainNavigationController.navigate( R.id.FAQDetailFragment, - bundleOf(Pair("question", issue["title"]), Pair("answer", issue["text"])), + bundleOf(Pair("question", issue["title"]), Pair("answer", issue["text"])) ) } binding?.knownIssuesLayout?.addView(issueBinding.root) @@ -86,7 +86,7 @@ class BugFixFragment : BaseMainFragment() { try { mainActivity?.packageManager?.getPackageInfo( mainActivity?.packageName ?: "", - 0, + 0 )?.versionName ?: "" } catch (e: PackageManager.NameNotFoundException) { @@ -99,7 +99,7 @@ class BugFixFragment : BaseMainFragment() { @Suppress("DEPRECATION") mainActivity?.packageManager?.getPackageInfo( mainActivity?.packageName ?: "", - 0, + 0 )?.versionCode ?: 0 } catch (e: PackageManager.NameNotFoundException) { @@ -121,8 +121,8 @@ class BugFixFragment : BaseMainFragment() { getString( R.string.version_info, versionName, - versionCode, - ), + versionCode + ) ) if (appConfigManager.testingLevel().name != AppTestingLevel.PRODUCTION.name) { @@ -141,16 +141,16 @@ class BugFixFragment : BaseMainFragment() { ( user.stats?.habitClass ?: "None" - ) + ) } - ), + ) ) + newLine + Uri.encode("Is in Inn: " + (user.preferences?.sleep ?: false)) + newLine + Uri.encode("Uses Costume: " + (user.preferences?.costume ?: false)) + newLine + Uri.encode("Custom Day Start: " + (user.preferences?.dayStart ?: 0)) + newLine + Uri.encode( - "Timezone Offset: " + (user.preferences?.timezoneOffset ?: 0), + "Timezone Offset: " + (user.preferences?.timezoneOffset ?: 0) ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQDetailFragment.kt index 0776902ef..926611363 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQDetailFragment.kt @@ -23,7 +23,7 @@ class FAQDetailFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentFaqDetailBinding { return FragmentFaqDetailBinding.inflate(inflater, container, false) } @@ -31,7 +31,7 @@ class FAQDetailFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { hidesToolbar = true showsBackButton = true @@ -40,7 +40,7 @@ class FAQDetailFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQOverviewFragment.kt index 3c712ab99..f0d16286f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQOverviewFragment.kt @@ -55,7 +55,7 @@ class FAQOverviewFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentFaqOverviewBinding { return FragmentFaqOverviewBinding.inflate(inflater, container, false) } @@ -70,7 +70,7 @@ class FAQOverviewFragment : BaseMainFragment() { try { mainActivity?.packageManager?.getPackageInfo( mainActivity?.packageName ?: "", - 0, + 0 )?.versionName ?: "" } catch (e: PackageManager.NameNotFoundException) { @@ -83,7 +83,7 @@ class FAQOverviewFragment : BaseMainFragment() { @Suppress("DEPRECATION") mainActivity?.packageManager?.getPackageInfo( mainActivity?.packageName ?: "", - 0, + 0 )?.versionCode ?: 0 } catch (e: PackageManager.NameNotFoundException) { @@ -94,7 +94,7 @@ class FAQOverviewFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { hidesToolbar = true showsBackButton = true @@ -103,7 +103,7 @@ class FAQOverviewFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -119,25 +119,25 @@ class FAQOverviewFragment : BaseMainFragment() { } binding?.healthSection?.findViewById(R.id.icon_view)?.setImageBitmap( - HabiticaIconsHelper.imageOfHeartLarge(), + HabiticaIconsHelper.imageOfHeartLarge() ) binding?.experienceSection?.findViewById(R.id.icon_view)?.setImageBitmap( - HabiticaIconsHelper.imageOfExperienceReward(), + HabiticaIconsHelper.imageOfExperienceReward() ) binding?.manaSection?.findViewById(R.id.icon_view)?.setImageBitmap( - HabiticaIconsHelper.imageOfMagicLarge(), + HabiticaIconsHelper.imageOfMagicLarge() ) binding?.goldSection?.findViewById(R.id.icon_view)?.setImageBitmap( - HabiticaIconsHelper.imageOfGoldReward(), + HabiticaIconsHelper.imageOfGoldReward() ) binding?.gemsSection?.findViewById(R.id.icon_view)?.setImageBitmap( - HabiticaIconsHelper.imageOfGem(), + HabiticaIconsHelper.imageOfGem() ) binding?.hourglassesSection?.findViewById(R.id.icon_view)?.setImageBitmap( - HabiticaIconsHelper.imageOfHourglassLarge(), + HabiticaIconsHelper.imageOfHourglassLarge() ) binding?.statsSection?.findViewById(R.id.icon_view)?.setImageBitmap( - HabiticaIconsHelper.imageOfStats(), + HabiticaIconsHelper.imageOfStats() ) binding?.contribTierSection?.findViewById(R.id.icon_view) @@ -164,7 +164,7 @@ class FAQOverviewFragment : BaseMainFragment() { clickableSpan, startIndex, endIndex, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) binding?.moreHelpTextView?.text = spannableString @@ -188,7 +188,7 @@ class FAQOverviewFragment : BaseMainFragment() { SupportFaqItemBinding.inflate( context.layoutInflater, binding?.faqLinearLayout, - true, + true ) binding.textView.text = article.question binding.root.setOnClickListener { @@ -215,8 +215,8 @@ class FAQOverviewFragment : BaseMainFragment() { getString( R.string.version_info, versionName, - versionCode, - ), + versionCode + ) ) if (appConfigManager.testingLevel().name != AppTestingLevel.PRODUCTION.name) { @@ -235,16 +235,16 @@ class FAQOverviewFragment : BaseMainFragment() { ( user.stats?.habitClass ?: "None" - ) + ) } - ), + ) ) + newLine + Uri.encode("Is in Inn: " + (user.preferences?.sleep ?: false)) + newLine + Uri.encode("Uses Costume: " + (user.preferences?.costume ?: false)) + newLine + Uri.encode("Custom Day Start: " + (user.preferences?.dayStart ?: 0)) + newLine + Uri.encode( - "Timezone Offset: " + (user.preferences?.timezoneOffset ?: 0), + "Timezone Offset: " + (user.preferences?.timezoneOffset ?: 0) ) } @@ -277,7 +277,7 @@ class FAQOverviewFragment : BaseMainFragment() { FrameLayout.LayoutParams( FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, - Gravity.CENTER, + Gravity.CENTER ) container.addView(label, params) container.isVisible = false @@ -287,7 +287,7 @@ class FAQOverviewFragment : BaseMainFragment() { 12.dpToPx(context), 0, 12.dpToPx(context), - if (tiers.last() == tier) 12.dpToPx(context) else 6.dpToPx(context), + if (tiers.last() == tier) 12.dpToPx(context) else 6.dpToPx(context) ) val padding = context?.resources?.getDimension(R.dimen.spacing_medium)?.toInt() ?: 0 container.setPadding(0, padding, 0, padding) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt index a3d7bc1f3..329f427eb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt @@ -25,7 +25,7 @@ class SupportMainFragment : BaseMainFragment() { override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentSupportMainBinding { return FragmentSupportMainBinding.inflate(inflater, container, false) } @@ -39,7 +39,7 @@ class SupportMainFragment : BaseMainFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -47,7 +47,7 @@ class SupportMainFragment : BaseMainFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) binding?.usingHabiticaWrapper?.setOnClickListener { @@ -71,7 +71,7 @@ class SupportMainFragment : BaseMainFragment() { null, null, getString(R.string.tutorial_reset_confirmation), - displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS, + displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt index 2c5a5eb69..86da42501 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt @@ -35,7 +35,7 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { lifecycleScope.launchCatching { inventoryRepository.retrieveInAppRewards() @@ -45,7 +45,7 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) @@ -65,8 +65,8 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { binding?.recyclerView?.setBackgroundColor( ContextCompat.getColor( it, - R.color.content_background, - ), + R.color.content_background + ) ) } binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() @@ -145,13 +145,13 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { userRepository.useSkill( selectedCard?.key ?: "", "member", - it.data?.getStringExtra("member_id") ?: "", + it.data?.getStringExtra("member_id") ?: "" ) val activity = (activity as? MainActivity) ?: return@launchCatching HabiticaSnackbar.showSnackbar( activity.snackbarContainer, context?.getString(R.string.sent_card, selectedCard?.text), - HabiticaSnackbar.SnackbarDisplayType.BLUE, + HabiticaSnackbar.SnackbarDisplayType.BLUE ) } } @@ -161,7 +161,7 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { fun newInstance( context: Context?, classType: TaskType, - showCustomRewards: Boolean, + showCustomRewards: Boolean ): RewardsRecyclerviewFragment { val fragment = RewardsRecyclerviewFragment() fragment.taskType = classType @@ -173,8 +173,8 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { ArrayList( listOf( context.getString(R.string.tutorial_rewards_1), - context.getString(R.string.tutorial_rewards_2), - ), + context.getString(R.string.tutorial_rewards_2) + ) ) } fragment.tutorialCanBeDeferred = false diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt index 888982041..501970224 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt @@ -75,7 +75,7 @@ open class TaskRecyclerViewFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentRefreshRecyclerviewBinding { return FragmentRefreshRecyclerviewBinding.inflate(inflater, container, false) } @@ -126,7 +126,7 @@ open class TaskRecyclerViewFragment : RewardsRecyclerViewAdapter( null, R.layout.reward_item_card, - viewModel, + viewModel ) else -> null @@ -160,7 +160,7 @@ open class TaskRecyclerViewFragment : recyclerAdapter?.brokenTaskEvents = { showBrokenChallengeDialog(it) } recyclerAdapter?.adventureGuideOpenEvents = { MainNavigationController.navigate( - R.id.adventureGuideActivity, + R.id.adventureGuideActivity ) } @@ -181,7 +181,7 @@ open class TaskRecyclerViewFragment : private fun scoreChecklistItem( task: Task, - item: ChecklistItem, + item: ChecklistItem ) { lifecycleScope.launch(ExceptionHandler.coroutine()) { taskRepository.scoreChecklistItem(task.id ?: "", item.id ?: "") @@ -190,7 +190,7 @@ open class TaskRecyclerViewFragment : private fun handleTaskResult( result: TaskScoringResult, - value: Int, + value: Int ) { if (taskType == TaskType.REWARD) { (activity as? MainActivity)?.let { activity -> @@ -201,7 +201,7 @@ open class TaskRecyclerViewFragment : BitmapDrawable(resources, HabiticaIconsHelper.imageOfGold()), ContextCompat.getColor(activity, R.color.yellow_10), "-$value", - HabiticaSnackbar.SnackbarDisplayType.DROP, + HabiticaSnackbar.SnackbarDisplayType.DROP ) } } else { @@ -243,7 +243,7 @@ open class TaskRecyclerViewFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) savedInstanceState?.let { @@ -258,7 +258,7 @@ open class TaskRecyclerViewFragment : object : ItemTouchHelper.Callback() { override fun onSelectedChanged( viewHolder: RecyclerView.ViewHolder?, - actionState: Int, + actionState: Int ) { super.onSelectedChanged(viewHolder, actionState) if (viewHolder == null || viewHolder.bindingAdapterPosition == NO_POSITION) return @@ -272,36 +272,36 @@ open class TaskRecyclerViewFragment : override fun onMove( recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, - target: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder ): Boolean { recyclerAdapter?.notifyItemMoved( viewHolder.bindingAdapterPosition, - target.bindingAdapterPosition, + target.bindingAdapterPosition ) return true } override fun onSwiped( viewHolder: RecyclerView.ViewHolder, - direction: Int, + direction: Int ) { // no-on } // defines the enabled move directions in each state (idle, swiping, dragging). override fun getMovementFlags( recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder, + viewHolder: RecyclerView.ViewHolder ): Int { return if (( - recyclerAdapter?.getItemViewType(viewHolder.bindingAdapterPosition) - ?: 0 + recyclerAdapter?.getItemViewType(viewHolder.bindingAdapterPosition) + ?: 0 ) != 0 ) { makeFlag(ItemTouchHelper.ACTION_STATE_IDLE, 0) } else { makeFlag( ItemTouchHelper.ACTION_STATE_DRAG, - ItemTouchHelper.DOWN or ItemTouchHelper.UP, + ItemTouchHelper.DOWN or ItemTouchHelper.UP ) } } @@ -312,7 +312,7 @@ open class TaskRecyclerViewFragment : override fun clearView( recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder, + viewHolder: RecyclerView.ViewHolder ) { super.clearView(recyclerView, viewHolder) binding?.refreshLayout?.isEnabled = true @@ -328,7 +328,7 @@ open class TaskRecyclerViewFragment : private fun updateTaskInRepository( validTaskId: String?, - viewHolder: RecyclerView.ViewHolder, + viewHolder: RecyclerView.ViewHolder ) { if (validTaskId != null) { var newPosition = viewHolder.bindingAdapterPosition @@ -340,7 +340,7 @@ open class TaskRecyclerViewFragment : ( recyclerAdapter?.data?.get(newPosition + 1)?.position ?: newPosition - ) - 1 + ) - 1 } } // Factor in if adventure guide is shown. @@ -351,7 +351,7 @@ open class TaskRecyclerViewFragment : taskRepository.updateTaskPosition( taskType, validTaskId, - newPosition, + newPosition ) } } @@ -375,7 +375,7 @@ open class TaskRecyclerViewFragment : object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged( recyclerView: RecyclerView, - newState: Int, + newState: Int ) { super.onScrollStateChanged(recyclerView, newState) if (newState == RecyclerView.SCROLL_STATE_IDLE) { @@ -383,7 +383,7 @@ open class TaskRecyclerViewFragment : (activity as? MainActivity)?.isAppBarExpanded ?: false } } - }, + } ) lifecycleScope.launch(ExceptionHandler.coroutine()) { @@ -427,12 +427,12 @@ open class TaskRecyclerViewFragment : dialog.setMessage( it.getString( R.string.broken_challenge_description, - taskCount, - ), + taskCount + ) ) dialog.addButton( it.getString(R.string.keep_x_tasks, taskCount), - true, + true ) { _, _ -> if (!task.isValid) return@addButton lifecycleScope.launch { @@ -443,7 +443,7 @@ open class TaskRecyclerViewFragment : dialog.addButton( it.getString(R.string.delete_x_tasks, taskCount), isPrimary = false, - isDestructive = true, + isDestructive = true ) { _, _ -> if (!task.isValid) return@addButton lifecycleScope.launch { @@ -465,7 +465,7 @@ open class TaskRecyclerViewFragment : EmptyItem( getString(R.string.empty_title_habits_filtered), getString(R.string.empty_description_habits_filtered), - R.drawable.icon_habits, + R.drawable.icon_habits ) } @@ -473,7 +473,7 @@ open class TaskRecyclerViewFragment : EmptyItem( getString(R.string.empty_title_dailies_filtered), getString(R.string.empty_description_dailies_filtered), - R.drawable.icon_dailies, + R.drawable.icon_dailies ) } @@ -481,7 +481,7 @@ open class TaskRecyclerViewFragment : EmptyItem( getString(R.string.empty_title_todos_filtered), getString(R.string.empty_description_todos_filtered), - R.drawable.icon_todos, + R.drawable.icon_todos ) } @@ -489,7 +489,7 @@ open class TaskRecyclerViewFragment : EmptyItem( getString(R.string.empty_title_rewards_filtered), null, - R.drawable.icon_rewards, + R.drawable.icon_rewards ) } @@ -501,7 +501,7 @@ open class TaskRecyclerViewFragment : EmptyItem( getString(R.string.empty_title_habits), getString(R.string.empty_description_habits), - R.drawable.icon_habits, + R.drawable.icon_habits ) } @@ -509,7 +509,7 @@ open class TaskRecyclerViewFragment : EmptyItem( getString(R.string.empty_title_dailies), getString(R.string.empty_description_dailies), - R.drawable.icon_dailies, + R.drawable.icon_dailies ) } @@ -517,7 +517,7 @@ open class TaskRecyclerViewFragment : EmptyItem( getString(R.string.empty_title_todos), getString(R.string.empty_description_todos), - R.drawable.icon_todos, + R.drawable.icon_todos ) } @@ -525,7 +525,7 @@ open class TaskRecyclerViewFragment : EmptyItem( getString(R.string.empty_title_rewards), null, - R.drawable.icon_rewards, + R.drawable.icon_rewards ) } @@ -536,7 +536,7 @@ open class TaskRecyclerViewFragment : private fun scoreTask( task: Task, - direction: TaskDirection, + direction: TaskDirection ) { viewModel.scoreTask(task, direction) { result, value -> handleTaskResult(result, value) @@ -584,7 +584,7 @@ open class TaskRecyclerViewFragment : TaskType.TODO -> viewModel.setActiveFilter( TaskType.TODO, - Task.FILTER_ACTIVE, + Task.FILTER_ACTIVE ) TaskType.DAILY -> { @@ -604,8 +604,8 @@ open class TaskRecyclerViewFragment : private fun openTaskForm(task: Task) { if (Date().time - ( - TasksFragment.lastTaskFormOpen?.time - ?: 0 + TasksFragment.lastTaskFormOpen?.time + ?: 0 ) < 2000 || !task.isValid ) { return @@ -636,7 +636,7 @@ open class TaskRecyclerViewFragment : fun newInstance( context: Context?, - classType: TaskType, + classType: TaskType ): TaskRecyclerViewFragment { val fragment = TaskRecyclerViewFragment() fragment.taskType = classType @@ -651,7 +651,7 @@ open class TaskRecyclerViewFragment : context.getString(R.string.tutorial_habits_1), context.getString(R.string.tutorial_habits_2), context.getString(R.string.tutorial_habits_3), - context.getString(R.string.tutorial_habits_4), + context.getString(R.string.tutorial_habits_4) ) } @@ -660,7 +660,7 @@ open class TaskRecyclerViewFragment : tutorialTexts = listOf( context.getString(R.string.tutorial_dailies_1), - context.getString(R.string.tutorial_dailies_2), + context.getString(R.string.tutorial_dailies_2) ) } @@ -669,7 +669,7 @@ open class TaskRecyclerViewFragment : tutorialTexts = listOf( context.getString(R.string.tutorial_todos_1), - context.getString(R.string.tutorial_todos_2), + context.getString(R.string.tutorial_todos_2) ) } @@ -678,7 +678,7 @@ open class TaskRecyclerViewFragment : tutorialTexts = listOf( context.getString(R.string.tutorial_rewards_1), - context.getString(R.string.tutorial_rewards_2), + context.getString(R.string.tutorial_rewards_2) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt index 1eeac2d0e..6394ead06 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt @@ -54,7 +54,7 @@ class TasksFragment : override fun createBinding( inflater: LayoutInflater, - container: ViewGroup?, + container: ViewGroup? ): FragmentViewpagerBinding { return FragmentViewpagerBinding.inflate(inflater, container, false) } @@ -79,7 +79,7 @@ class TasksFragment : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View? { this.usesTabLayout = false this.usesBottomNavigation = true @@ -88,7 +88,7 @@ class TasksFragment : override fun onViewCreated( view: View, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) loadTaskLists() @@ -146,7 +146,7 @@ class TasksFragment : override fun onCreateOptionsMenu( menu: Menu, - inflater: MenuInflater, + inflater: MenuInflater ) { super.onCreateOptionsMenu(menu, inflater) if (viewModel.isPersonalBoard) { @@ -175,7 +175,7 @@ class TasksFragment : filterMenuItem?.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) return true } - }, + } ) } @@ -251,7 +251,7 @@ class TasksFragment : bottomNavigation?.selectedPosition = position updateFilterIcon(getTaskTypeFromTabPosition(position)) } - }, + } ) } @@ -265,7 +265,7 @@ class TasksFragment : val filterIcon = ContextCompat.getDrawable(it, R.drawable.ic_action_filter_list) filterIcon?.setTintWith( it.getThemeColor(R.attr.headerTextColor), - PorterDuff.Mode.MULTIPLY, + PorterDuff.Mode.MULTIPLY ) filterMenuItem?.setIcon(filterIcon) } @@ -274,7 +274,7 @@ class TasksFragment : val filterIcon = ContextCompat.getDrawable(it, R.drawable.ic_filters_active) filterIcon?.setTintWith( it.getThemeColor(R.attr.textColorPrimaryDark), - PorterDuff.Mode.MULTIPLY, + PorterDuff.Mode.MULTIPLY ) filterMenuItem?.setIcon(filterIcon) } @@ -351,7 +351,7 @@ class TasksFragment : "open create task form", EventCategory.BEHAVIOUR, HitType.EVENT, - additionalData, + additionalData ) val bundle = Bundle() @@ -391,7 +391,7 @@ class TasksFragment : private fun onTaskCreatedResult( resultCode: Int, - data: Intent?, + data: Intent? ) { if (resultCode == Activity.RESULT_OK) { val taskTypeValue = data?.getStringExtra(TaskFormActivity.TASK_TYPE_KEY) @@ -408,15 +408,15 @@ class TasksFragment : if (!DateUtils.isToday( viewModel.sharedPreferences.getLong( - "last_creation_reporting", - 0, - ), + "last_creation_reporting", + 0 + ) ) ) { Analytics.sendEvent( "task created", EventCategory.BEHAVIOUR, - HitType.EVENT, + HitType.EVENT ) viewModel.sharedPreferences.edit { putLong("last_creation_reporting", Date().time) @@ -456,7 +456,7 @@ class TasksFragment : override fun onTabSelected( taskType: TaskType, - smooth: Boolean, + smooth: Boolean ) { val newItem = when (taskType) { @@ -479,7 +479,7 @@ class TasksFragment : mainActivity?.title = viewModel.ownerTitle MainNavigationController.updateLabel( R.id.tasksFragment, - viewModel.ownerTitle.toString(), + viewModel.ownerTitle.toString() ) } val teamPlan = viewModel.teamPlans[viewModel.ownerID.value] diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteAdapter.kt index 8194a5063..4cdddddbc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteAdapter.kt @@ -9,13 +9,13 @@ import android.widget.Filterable import android.widget.TextView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.SocialRepository -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.auth.LocalAuthentication import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.social.FindUsernameResult import com.habitrpg.android.habitica.models.user.Authentication import com.habitrpg.android.habitica.models.user.Profile import com.habitrpg.android.habitica.ui.views.UsernameLabel +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.helpers.EmojiMap import com.habitrpg.common.habitica.helpers.EmojiParser import java.util.Date @@ -25,7 +25,7 @@ class AutocompleteAdapter( val socialRepository: SocialRepository? = null, var autocompleteContext: String? = null, var groupID: String? = null, - val remoteAutocomplete: Boolean = false, + val remoteAutocomplete: Boolean = false ) : BaseAdapter(), Filterable { var chatMessages: List = arrayListOf() private var userResults: List = arrayListOf() @@ -88,7 +88,7 @@ class AutocompleteAdapter( override fun publishResults( contraint: CharSequence?, - results: FilterResults?, + results: FilterResults? ) { if (results != null && results.count > 0) { notifyDataSetChanged() @@ -102,7 +102,7 @@ class AutocompleteAdapter( override fun getView( position: Int, convertView: View?, - parent: ViewGroup?, + parent: ViewGroup? ): View { return if (isAutocompletingUsers) { val view = parent?.inflate(R.layout.autocomplete_username) @@ -127,7 +127,7 @@ class AutocompleteAdapter( userResults.getOrNull(position) } else { emojiResults.getOrNull( - position, + position ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteTokenizer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteTokenizer.kt index d2a6a57a5..467d8bf9c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteTokenizer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteTokenizer.kt @@ -8,7 +8,7 @@ import android.widget.MultiAutoCompleteTextView class AutocompleteTokenizer(val tokens: List) : MultiAutoCompleteTextView.Tokenizer { override fun findTokenStart( text: CharSequence, - cursor: Int, + cursor: Int ): Int { var i = cursor @@ -25,7 +25,7 @@ class AutocompleteTokenizer(val tokens: List) : MultiAutoCompleteTextView. override fun findTokenEnd( text: CharSequence, - cursor: Int, + cursor: Int ): Int { var i = cursor val len = text.length @@ -59,7 +59,7 @@ class AutocompleteTokenizer(val tokens: List) : MultiAutoCompleteTextView. text.length, Any::class.java, sp, - 0, + 0 ) sp } else { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarginDecoration.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarginDecoration.kt index 7f096a13c..3972f1a22 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarginDecoration.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarginDecoration.kt @@ -15,7 +15,7 @@ class MarginDecoration(context: Context?, private var noMarginViewTypes: Set Unit)? - get() = emptyAdapter.onRefresh - set(value) { - emptyAdapter.onRefresh = value - } +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null +) : RecyclerView(context, attrs) { + var onRefresh: (() -> Unit)? + get() = emptyAdapter.onRefresh + set(value) { + emptyAdapter.onRefresh = value + } - var state: RecyclerViewState = RecyclerViewState.LOADING - set(value) { - field = value - when (field) { - RecyclerViewState.DISPLAYING_DATA -> updateAdapter(actualAdapter) - else -> { - updateAdapter(emptyAdapter) - emptyAdapter.state = value - } + var state: RecyclerViewState = RecyclerViewState.LOADING + set(value) { + field = value + when (field) { + RecyclerViewState.DISPLAYING_DATA -> updateAdapter(actualAdapter) + else -> { + updateAdapter(emptyAdapter) + emptyAdapter.state = value } } - - private fun updateAdapter(newAdapter: Adapter<*>?) { - if (adapter != newAdapter) { - super.setAdapter(newAdapter) - } } - var emptyItem: EmptyItem? - get() = emptyAdapter.emptyItem - set(value) { - emptyAdapter.emptyItem = value - } - - private var actualAdapter: Adapter<*>? = null - private val emptyAdapter = RecyclerViewStateAdapter() - - private val observer = - object : AdapterDataObserver() { - override fun onChanged() { - updateState() - } - - override fun onItemRangeInserted( - positionStart: Int, - itemCount: Int, - ) { - updateState() - } - - override fun onItemRangeRemoved( - positionStart: Int, - itemCount: Int, - ) { - updateState() - } - } - - internal fun updateState(isInitial: Boolean = false) { - state = - if (actualAdapter != null && !isInitial) { - val emptyViewVisible = actualAdapter?.itemCount == 0 - if (emptyViewVisible) { - RecyclerViewState.EMPTY - } else { - RecyclerViewState.DISPLAYING_DATA - } - } else { - RecyclerViewState.LOADING - } - } - - override fun setAdapter(adapter: Adapter<*>?) { - val oldAdapter = actualAdapter - oldAdapter?.unregisterAdapterDataObserver(observer) - super.setAdapter(adapter) - adapter?.registerAdapterDataObserver(observer) - actualAdapter = adapter - updateState(true) + private fun updateAdapter(newAdapter: Adapter<*>?) { + if (adapter != newAdapter) { + super.setAdapter(newAdapter) } } + + var emptyItem: EmptyItem? + get() = emptyAdapter.emptyItem + set(value) { + emptyAdapter.emptyItem = value + } + + private var actualAdapter: Adapter<*>? = null + private val emptyAdapter = RecyclerViewStateAdapter() + + private val observer = + object : AdapterDataObserver() { + override fun onChanged() { + updateState() + } + + override fun onItemRangeInserted( + positionStart: Int, + itemCount: Int + ) { + updateState() + } + + override fun onItemRangeRemoved( + positionStart: Int, + itemCount: Int + ) { + updateState() + } + } + + internal fun updateState(isInitial: Boolean = false) { + state = + if (actualAdapter != null && !isInitial) { + val emptyViewVisible = actualAdapter?.itemCount == 0 + if (emptyViewVisible) { + RecyclerViewState.EMPTY + } else { + RecyclerViewState.DISPLAYING_DATA + } + } else { + RecyclerViewState.LOADING + } + } + + override fun setAdapter(adapter: Adapter<*>?) { + val oldAdapter = actualAdapter + oldAdapter?.unregisterAdapterDataObserver(observer) + super.setAdapter(adapter) + adapter?.registerAdapterDataObserver(observer) + actualAdapter = adapter + updateState(true) + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/SafeDefaultItemAnimator.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/SafeDefaultItemAnimator.kt index a64afde7e..7fa3ddedf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/SafeDefaultItemAnimator.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/SafeDefaultItemAnimator.kt @@ -36,12 +36,12 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { var fromX: Int, var fromY: Int, var toX: Int, - var toY: Int, + var toY: Int ) private class ChangeInfo private constructor( var oldHolder: RecyclerView.ViewHolder?, - var newHolder: RecyclerView.ViewHolder?, + var newHolder: RecyclerView.ViewHolder? ) { var fromX: Int = 0 var fromY: Int = 0 @@ -54,7 +54,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { fromX: Int, fromY: Int, toX: Int, - toY: Int, + toY: Int ) : this(oldHolder, newHolder) { this.fromX = fromX this.fromY = fromY @@ -72,7 +72,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { ", toX=" + toX + ", toY=" + toY + '}'.toString() - ) + ) } } @@ -107,7 +107,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { moveInfo.fromX, moveInfo.fromY, moveInfo.toX, - moveInfo.toY, + moveInfo.toY ) } } @@ -197,7 +197,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { removeAnimations.remove(holder) dispatchFinishedWhenDone() } - }, + } ).start() } @@ -229,7 +229,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { addAnimations.remove(holder) dispatchFinishedWhenDone() } - }, + } ).start() } @@ -238,7 +238,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { fromX: Int, fromY: Int, toX: Int, - toY: Int, + toY: Int ): Boolean { var newFromX = fromX var newFromY = fromY @@ -269,7 +269,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { fromX: Int, fromY: Int, toX: Int, - toY: Int, + toY: Int ) { val view = holder.itemView val deltaX = toX - fromX @@ -307,7 +307,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { moveAnimations.remove(holder) dispatchFinishedWhenDone() } - }, + } ).start() } @@ -317,7 +317,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { fromX: Int, fromY: Int, toX: Int, - toY: Int, + toY: Int ): Boolean { if (oldHolder === newHolder) { // Don't know how to run change animations when the same view holder is re-used. @@ -355,7 +355,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { if (view != null) { val oldViewAnim = view.animate().setDuration( - changeDuration, + changeDuration ) changeInfo.oldHolder?.let { changeAnimations.add(it) } oldViewAnim.translationX((changeInfo.toX - changeInfo.fromX).toFloat()) @@ -375,7 +375,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { changeInfo.oldHolder?.let { changeAnimations.add(it) } dispatchFinishedWhenDone() } - }, + } ).start() } if (newView != null) { @@ -397,14 +397,14 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { changeInfo.newHolder?.let { changeAnimations.add(it) } dispatchFinishedWhenDone() } - }, + } ).start() } } private fun endChangeAnimation( infoList: MutableList, - item: RecyclerView.ViewHolder, + item: RecyclerView.ViewHolder ) { for (i in infoList.indices.reversed()) { val changeInfo = infoList[i] @@ -427,7 +427,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { private fun endChangeAnimationIfNecessary( changeInfo: ChangeInfo, - item: RecyclerView.ViewHolder?, + item: RecyclerView.ViewHolder? ): Boolean { var oldItem = false when { @@ -536,7 +536,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { movesList.isNotEmpty() || additionsList.isNotEmpty() || changesList.isNotEmpty() - ) + ) } /** @@ -659,7 +659,7 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { */ override fun canReuseUpdatedViewHolder( viewHolder: RecyclerView.ViewHolder, - payloads: List, + payloads: List ): Boolean { return payloads.isNotEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt index 7d94d4704..370b374ae 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt @@ -43,11 +43,11 @@ object ToolbarColorHelper { toolbar: Toolbar, activity: Activity?, iconColor: Int? = null, - backgroundColor: Int? = null, + backgroundColor: Int? = null ) { if (activity == null) return toolbar.setBackgroundColor( - backgroundColor ?: activity.getThemeColor(R.attr.headerBackgroundColor), + backgroundColor ?: activity.getThemeColor(R.attr.headerBackgroundColor) ) val toolbarIconsColor = iconColor ?: activity.getThemeColor(R.attr.headerTextColor) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { @@ -82,7 +82,7 @@ object ToolbarColorHelper { private fun colorizeChild( innerView: View, toolbarIconsColor: Int, - colorFilter: PorterDuffColorFilter, + colorFilter: PorterDuffColorFilter ) { if (innerView is ActionMenuItemView) { innerView.setTextColor(toolbarIconsColor) @@ -104,7 +104,7 @@ object ToolbarColorHelper { */ private fun setOverflowButtonColor( activity: Activity, - color: Int, + color: Int ) { val overflowDescription = activity.getString(R.string.abc_action_menu_overflow_description) activity.window.decorView.waitForLayout { @@ -112,7 +112,7 @@ object ToolbarColorHelper { findViewsWithText( outViews, overflowDescription, - View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION, + View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION ) if (outViews.isEmpty()) { return@waitForLayout diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuItem.kt index 572c3f0e4..ee5a22efb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/BottomSheetMenuItem.kt @@ -13,12 +13,12 @@ class BottomSheetMenuItem( private val title: String, private val isDestructive: Boolean = false, private val currency: String? = null, - private val price: Double = 0.0, + private val price: Double = 0.0 ) { fun inflate( context: Context, inflater: LayoutInflater, - contentView: ViewGroup, + contentView: ViewGroup ): View { val binding = MenuBottomSheetItemBinding.inflate(inflater, contentView, false) binding.textView.text = this.title diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt index 08ac28fea..42b2cd6f5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt @@ -9,7 +9,7 @@ data class HabiticaDrawerItem( val identifier: String, val text: String, val icon: Drawable? = null, - val isHeader: Boolean = false, + val isHeader: Boolean = false ) { constructor(transitionId: Int, identifier: String) : this(transitionId, identifier, "") diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/theme/HabiticaTheme.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/theme/HabiticaTheme.kt index 38dc21f9c..d871dc063 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/theme/HabiticaTheme.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/theme/HabiticaTheme.kt @@ -16,7 +16,7 @@ import com.habitrpg.common.habitica.theme.HabiticaTheme fun HabiticaColors.textPrimaryFor(task: Task?): Color { return colorResource( (if (isSystemInDarkTheme()) task?.extraExtraLightTaskColor else task?.extraDarkTaskColor) - ?: R.color.text_primary, + ?: R.color.text_primary ) } @@ -24,7 +24,7 @@ fun HabiticaColors.textPrimaryFor(task: Task?): Color { fun HabiticaColors.textSecondaryFor(task: Task?): Color { return colorResource( (if (isSystemInDarkTheme()) task?.extraLightTaskColor else task?.lowSaturationTaskColor) - ?: R.color.brand_sub_text, + ?: R.color.brand_sub_text ) } @@ -32,7 +32,7 @@ fun HabiticaColors.textSecondaryFor(task: Task?): Color { fun HabiticaColors.primaryBackgroundFor(task: Task?): Color { return colorResource( (if (isSystemInDarkTheme()) task?.mediumTaskColor else task?.lightTaskColor) - ?: R.color.brand_400, + ?: R.color.brand_400 ) } @@ -40,7 +40,7 @@ fun HabiticaColors.primaryBackgroundFor(task: Task?): Color { fun HabiticaColors.windowBackgroundFor(task: Task?): Color { return (if (isSystemInDarkTheme()) task?.extraExtraDarkTaskColor else task?.extraExtraLightTaskColor)?.let { colorResource( - it, + it ) } ?: windowBackground } @@ -49,7 +49,7 @@ fun HabiticaColors.windowBackgroundFor(task: Task?): Color { fun HabiticaColors.contentBackgroundFor(task: Task?): Color { return (if (isSystemInDarkTheme()) task?.darkestTaskColor else task?.lightestTaskColor)?.let { colorResource( - it, + it ) } ?: windowBackground } @@ -94,6 +94,6 @@ val HabiticaTheme.colors: HabiticaColors errorBackground = Color(ContextCompat.getColor(context, R.color.background_red)), errorColor = Color(ContextCompat.getColor(context, R.color.text_red)), successBackground = Color(ContextCompat.getColor(context, R.color.background_green)), - successColor = Color(ContextCompat.getColor(context, R.color.text_green)), + successColor = Color(ContextCompat.getColor(context, R.color.text_green)) ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/BindableViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/BindableViewHolder.kt index 04e64a337..a4a457a46 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/BindableViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/BindableViewHolder.kt @@ -7,6 +7,6 @@ abstract class BindableViewHolder(itemView: View) : RecyclerView.ViewHolder(i abstract fun bind( data: T, position: Int, - displayMode: String, + displayMode: String ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ChatRecyclerViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ChatRecyclerViewHolder.kt index d4aa80690..39cfda7d0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ChatRecyclerViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ChatRecyclerViewHolder.kt @@ -54,7 +54,7 @@ class ChatRecyclerIntroViewHolder(itemView: View, replyToUUID: String) : class ChatRecyclerMessageViewHolder( itemView: View, private var userId: String, - private val isGroupChat: Boolean, + private val isGroupChat: Boolean ) : ChatRecyclerViewHolder(itemView) { val binding = ChatItemBinding.bind(itemView) @@ -95,28 +95,28 @@ class ChatRecyclerMessageViewHolder( BitmapDrawable(res, HabiticaIconsHelper.imageOfChatReplyIcon()), null, null, - null, + null ) binding.copyButton.setOnClickListener { chatMessage?.let { onCopyMessage?.invoke(it) } } binding.copyButton.setCompoundDrawablesWithIntrinsicBounds( BitmapDrawable(res, HabiticaIconsHelper.imageOfChatCopyIcon()), null, null, - null, + null ) binding.reportButton.setOnClickListener { chatMessage?.let { onFlagMessage?.invoke(it) } } binding.reportButton.setCompoundDrawablesWithIntrinsicBounds( BitmapDrawable(res, HabiticaIconsHelper.imageOfChatReportIcon()), null, null, - null, + null ) binding.deleteButton.setOnClickListener { chatMessage?.let { onDeleteMessage?.invoke(it) } } binding.deleteButton.setCompoundDrawablesWithIntrinsicBounds( BitmapDrawable(res, HabiticaIconsHelper.imageOfChatDeleteIcon()), null, null, - null, + null ) } @@ -124,7 +124,7 @@ class ChatRecyclerMessageViewHolder( msg: ChatMessage, uuid: String, user: User?, - isExpanded: Boolean, + isExpanded: Boolean ) { chatMessage = msg this.user = user @@ -184,7 +184,7 @@ class ChatRecyclerMessageViewHolder( 64.dpToPx(context), itemView.paddingTop, itemView.paddingRight, - itemView.paddingBottom, + itemView.paddingBottom ) } else { val displayMetrics = res.displayMetrics @@ -201,7 +201,7 @@ class ChatRecyclerMessageViewHolder( 16.dpToPx(context), itemView.paddingTop, itemView.paddingRight, - itemView.paddingBottom, + itemView.paddingBottom ) } @@ -220,8 +220,8 @@ class ChatRecyclerMessageViewHolder( val username = user?.formattedUsername binding.messageWrapper.background = if ((name != null && msg.text?.contains("@$name") == true) || ( - username != null && msg.text?.contains( - username, + username != null && msg.text?.contains( + username ) == true ) ) { @@ -253,15 +253,15 @@ class ChatRecyclerMessageViewHolder( binding.flagCountTextview.setTextColor( ContextCompat.getColor( context, - R.color.text_orange, - ), + R.color.text_orange + ) ) } else { binding.flagCountTextview.setTextColor( ContextCompat.getColor( context, - R.color.text_red, - ), + R.color.text_red + ) ) } } else { @@ -296,7 +296,7 @@ class ChatRecyclerMessageViewHolder( DataBindingUtils.setRoundedBackground( binding.likeBackgroundLayout, - ContextCompat.getColor(context, backgroundColorRes), + ContextCompat.getColor(context, backgroundColorRes) ) binding.tvLikes.setTextColor(ContextCompat.getColor(context, foregroundColorRes)) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/EmptySectionViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/EmptyShopSectionViewHolder.kt similarity index 100% rename from Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/EmptySectionViewHolder.kt rename to Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/EmptyShopSectionViewHolder.kt diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/GroupMemberViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/GroupMemberViewHolder.kt index 02b9acb1e..e41232e1c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/GroupMemberViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/GroupMemberViewHolder.kt @@ -60,7 +60,7 @@ class GroupMemberViewHolder(itemView: View) : fun bind( user: Member, leaderID: String?, - userID: String?, + userID: String? ) { binding.avatarView.setAvatar(user) this.leaderID = leaderID @@ -90,7 +90,7 @@ class GroupMemberViewHolder(itemView: View) : itemView.context.getString( R.string.user_level_with_class, user.stats?.lvl, - getTranslatedClassName(itemView.context.resources, user.stats?.habitClass), + getTranslatedClassName(itemView.context.resources, user.stats?.habitClass) ) } else { binding.sublineTextview.text = diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt index a35b8ff4b..5a46af68d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt @@ -8,11 +8,11 @@ import android.view.ViewGroup import androidx.core.graphics.drawable.toBitmap import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.MountOverviewItemBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.inventory.Mount import com.habitrpg.android.habitica.ui.views.showAsBottomSheet import com.habitrpg.android.habitica.ui.views.stable.MountBottomSheet import com.habitrpg.common.habitica.extensions.DataBindingUtils +import com.habitrpg.common.habitica.extensions.inflate import dagger.hilt.android.internal.managers.ViewComponentManager class MountViewHolder(parent: ViewGroup, private val onEquip: ((String) -> Unit)?) : @@ -32,7 +32,7 @@ class MountViewHolder(parent: ViewGroup, private val onEquip: ((String) -> Unit) fun bind( item: Mount, owned: Boolean, - currentMount: String?, + currentMount: String? ) { animal = item this.owned = owned @@ -55,7 +55,7 @@ class MountViewHolder(parent: ViewGroup, private val onEquip: ((String) -> Unit) } else { BitmapDrawable( itemView.context.resources, - it.toBitmap().extractAlpha(), + it.toBitmap().extractAlpha() ) } if (binding.imageView.tag == imageName) { @@ -76,12 +76,12 @@ class MountViewHolder(parent: ViewGroup, private val onEquip: ((String) -> Unit) } else { context } as Activity - ).showAsBottomSheet { + ).showAsBottomSheet { MountBottomSheet( pet, currentMount.equals(animal?.key), onEquip, - it, + it ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt index 137bf07e3..826c17594 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt @@ -8,7 +8,6 @@ import android.view.ViewGroup import androidx.core.graphics.drawable.toBitmap import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.PetDetailItemBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.inventory.Animal import com.habitrpg.android.habitica.models.inventory.Egg import com.habitrpg.android.habitica.models.inventory.Food @@ -18,6 +17,7 @@ import com.habitrpg.android.habitica.ui.views.dialogs.PetSuggestHatchDialog import com.habitrpg.android.habitica.ui.views.showAsBottomSheet import com.habitrpg.android.habitica.ui.views.stable.PetBottomSheet import com.habitrpg.common.habitica.extensions.DataBindingUtils +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.shared.habitica.models.responses.FeedResponse import dagger.hilt.android.internal.managers.ViewComponentManager @@ -25,7 +25,7 @@ class PetViewHolder( parent: ViewGroup, private val onEquip: ((String) -> Unit)?, private val onFeed: (suspend (Pet, Food?) -> FeedResponse?)?, - private val ingredientsReceiver: ((Animal, ((Pair) -> Unit)) -> Unit)?, + private val ingredientsReceiver: ((Animal, ((Pair) -> Unit)) -> Unit)? ) : androidx.recyclerview.widget.RecyclerView.ViewHolder(parent.inflate(R.layout.pet_detail_item)), View.OnClickListener { private var hasMount: Boolean = false @@ -58,7 +58,7 @@ class PetViewHolder( hasUnlockedEgg: Boolean, hasUnlockedPotion: Boolean, hasMount: Boolean, - currentPet: String?, + currentPet: String? ) { this.animal = item this.trained = trained @@ -105,7 +105,7 @@ class PetViewHolder( if (trained == 0 && canRaiseToMount) { BitmapDrawable( resources, - it.toBitmap().extractAlpha(), + it.toBitmap().extractAlpha() ) } else { it @@ -129,7 +129,7 @@ class PetViewHolder( } else { context } as Activity - ).showAsBottomSheet { + ).showAsBottomSheet { PetBottomSheet( pet, trained, @@ -138,7 +138,7 @@ class PetViewHolder( ownsSaddles, onEquip, onFeed, - it, + it ) } } @@ -157,7 +157,7 @@ class PetViewHolder( potionCount, hasUnlockedEgg, hasUnlockedPotion, - hasMount, + hasMount ) dialog.show() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/SectionViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/SectionViewHolder.kt index 4afac73f0..9b4a278fc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/SectionViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/SectionViewHolder.kt @@ -16,9 +16,9 @@ import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.getImpreciseRemainingString import com.habitrpg.android.habitica.extensions.getTranslatedAnimalType -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.models.inventory.StableSection import com.habitrpg.android.habitica.ui.views.CurrencyView +import com.habitrpg.common.habitica.extensions.inflate import java.util.Date class SectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { @@ -55,7 +55,7 @@ class SectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { parent: AdapterView<*>?, view: View?, position: Int, - id: Long, + id: Long ) { spinnerSelectionChanged?.invoke() } @@ -79,7 +79,7 @@ class SectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { } else { context.getString( R.string.mount_category, - getTranslatedAnimalType(context, section.key), + getTranslatedAnimalType(context, section.key) ) } if (section.key == "special") { @@ -92,7 +92,7 @@ class SectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { itemView.context.getString( R.string.pet_ownership_fraction, section.ownedCount, - section.totalCount, + section.totalCount ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt index 933a43b1b..d73379bac 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.ui.viewHolders import android.content.Context -import android.graphics.drawable.BitmapDrawable import android.view.View import android.view.ViewGroup import androidx.appcompat.content.res.AppCompatResources @@ -48,7 +47,7 @@ class ShopItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vi fun bind( item: ShopItem, canBuy: Boolean, - numberOwned: Int, + numberOwned: Int ) { this.item = item binding.buyButton.visibility = View.VISIBLE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt index 8d573b24b..e8881f9df 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt @@ -32,7 +32,7 @@ abstract class BaseTaskViewHolder( var scoreTaskFunc: ((Task, TaskDirection) -> Unit), var openTaskFunc: ((Task, View) -> Unit), var brokenTaskFunc: ((Task) -> Unit), - var assignedTextProvider: GroupPlanInfoProvider?, + var assignedTextProvider: GroupPlanInfoProvider? ) : BindableViewHolder(itemView), View.OnTouchListener { private val scope = MainScope() @@ -125,7 +125,7 @@ abstract class BaseTaskViewHolder( if (ellipses || notesExpanded) View.VISIBLE else View.GONE } } - }, + } ) context = itemView.context } @@ -143,7 +143,7 @@ abstract class BaseTaskViewHolder( override fun bind( data: Task, position: Int, - displayMode: String, + displayMode: String ) { bind(data, position, displayMode, null) } @@ -152,7 +152,7 @@ abstract class BaseTaskViewHolder( data: Task, position: Int, displayMode: String, - ownerID: String?, + ownerID: String? ) { notesExpanded = false task = data @@ -238,7 +238,7 @@ abstract class BaseTaskViewHolder( assignedTextView.text = assignedTextProvider?.assignedTextForTask( context.resources, - data.group?.assignedUsers ?: emptyList(), + data.group?.assignedUsers ?: emptyList() ) assignedTextView.visibility = View.VISIBLE } else { @@ -269,7 +269,7 @@ abstract class BaseTaskViewHolder( override fun onTouch( view: View?, - motionEvent: MotionEvent?, + motionEvent: MotionEvent? ): Boolean { if (motionEvent != null) { if (motionEvent.action != MotionEvent.ACTION_UP) return true @@ -318,7 +318,7 @@ abstract class BaseTaskViewHolder( open fun setDisabled( openTaskDisabled: Boolean, - taskActionsDisabled: Boolean, + taskActionsDisabled: Boolean ) { this.openTaskDisabled = openTaskDisabled this.taskActionsDisabled = taskActionsDisabled diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.kt index 10eb0b1cd..1a6fb5254 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.kt @@ -33,7 +33,7 @@ abstract class ChecklistedViewHolder( var scoreChecklistItemFunc: ((Task, ChecklistItem) -> Unit), openTaskFunc: ((Task, View) -> Unit), brokenTaskFunc: ((Task) -> Unit), - assignedTextProvider: GroupPlanInfoProvider?, + assignedTextProvider: GroupPlanInfoProvider? ) : BaseTaskViewHolder(itemView, scoreTaskFunc, openTaskFunc, brokenTaskFunc, assignedTextProvider) { private val checkboxHolder: ViewGroup = itemView.findViewById(R.id.checkBoxHolder) private val checkmarkView: ImageView = itemView.findViewById(R.id.checkmark) @@ -54,7 +54,7 @@ abstract class ChecklistedViewHolder( data: Task, position: Int, displayMode: String, - ownerID: String?, + ownerID: String? ) { var completed = data.completed(userID) if (data.isPendingApproval) { @@ -102,7 +102,7 @@ abstract class ChecklistedViewHolder( abstract fun shouldDisplayAsActive( task: Task?, - userID: String?, + userID: String? ): Boolean private fun updateChecklistDisplay() { @@ -130,7 +130,7 @@ abstract class ChecklistedViewHolder( } else { R.color.checkbox_fill } - ) ?: R.color.checkbox_fill, + ) ?: R.color.checkbox_fill ) val textView = itemView?.findViewById(R.id.checkedTextView) // Populate the data into the template view using the data object @@ -161,7 +161,7 @@ abstract class ChecklistedViewHolder( val color = if (context.isUsingNightModeResources()) task?.extraExtraDarkTaskColor else task?.darkTaskColor checkmark?.drawable?.setTint(ContextCompat.getColor(context, color ?: R.color.text_dimmed)) task?.extraLightTaskColor ?: R.color.offset_background - }, + } ) color.let { checkboxHolder?.setBackgroundColor(it) } this.checklistView.addView(itemView) @@ -235,7 +235,7 @@ abstract class ChecklistedViewHolder( override fun setDisabled( openTaskDisabled: Boolean, - taskActionsDisabled: Boolean, + taskActionsDisabled: Boolean ) { super.setDisabled(openTaskDisabled, taskActionsDisabled) this.checkboxHolder.isEnabled = !taskActionsDisabled diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/DailyViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/DailyViewHolder.kt index 758ba001a..c0c7b2c9d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/DailyViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/DailyViewHolder.kt @@ -16,7 +16,7 @@ class DailyViewHolder( scoreChecklistItemFunc: ((Task, ChecklistItem) -> Unit), openTaskFunc: ((Task, View) -> Unit), brokenTaskFunc: ((Task) -> Unit), - assignedTextProvider: GroupPlanInfoProvider?, + assignedTextProvider: GroupPlanInfoProvider? ) : ChecklistedViewHolder(itemView, scoreTaskFunc, scoreChecklistItemFunc, openTaskFunc, brokenTaskFunc, assignedTextProvider) { override val taskIconWrapperIsVisible: Boolean get() { @@ -31,7 +31,7 @@ class DailyViewHolder( data: Task, position: Int, displayMode: String, - ownerID: String?, + ownerID: String? ) { this.task = data setChecklistIndicatorBackgroundActive(data.isChecklistDisplayActive) @@ -51,7 +51,7 @@ class DailyViewHolder( calendar.get(Calendar.DATE), it.getZonedDateTime()?.hour ?: 0, it.getZonedDateTime()?.minute ?: 0, - 0, + 0 ) now < calendar.time } ?: data.reminders?.first() @@ -72,7 +72,7 @@ class DailyViewHolder( override fun shouldDisplayAsActive( task: Task?, - userID: String?, + userID: String? ): Boolean { return task?.isDisplayedActiveForUser(userID) ?: false } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/HabitViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/HabitViewHolder.kt index aa0525a05..2615f7805 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/HabitViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/HabitViewHolder.kt @@ -16,7 +16,7 @@ class HabitViewHolder( scoreTaskFunc: ((Task, TaskDirection) -> Unit), openTaskFunc: ((Task, View) -> Unit), brokenTaskFunc: ((Task) -> Unit), - assignedTextProvider: GroupPlanInfoProvider?, + assignedTextProvider: GroupPlanInfoProvider? ) : BaseTaskViewHolder(itemView, scoreTaskFunc, openTaskFunc, brokenTaskFunc, assignedTextProvider) { private val btnPlusWrapper: FrameLayout = itemView.findViewById(R.id.btnPlusWrapper) private val btnPlusIconView: ImageView = itemView.findViewById(R.id.btnPlusIconView) @@ -38,7 +38,7 @@ class HabitViewHolder( data: Task, position: Int, displayMode: String, - ownerID: String?, + ownerID: String? ) { this.task = data if (data.up == true) { @@ -164,7 +164,7 @@ class HabitViewHolder( override fun setDisabled( openTaskDisabled: Boolean, - taskActionsDisabled: Boolean, + taskActionsDisabled: Boolean ) { super.setDisabled(openTaskDisabled, taskActionsDisabled) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt index b707b8c3e..026a16df7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt @@ -18,14 +18,14 @@ class RewardViewHolder( scoreTaskFunc: ((Task, TaskDirection) -> Unit), openTaskFunc: ((Task, View) -> Unit), brokenTaskFunc: ((Task) -> Unit), - assignedTextProvider: GroupPlanInfoProvider?, + assignedTextProvider: GroupPlanInfoProvider? ) : BaseTaskViewHolder( - itemView, - scoreTaskFunc, - openTaskFunc, - brokenTaskFunc, - assignedTextProvider, - ) { + itemView, + scoreTaskFunc, + openTaskFunc, + brokenTaskFunc, + assignedTextProvider +) { private val binding = RewardItemCardBinding.bind(itemView) init { @@ -41,7 +41,7 @@ class RewardViewHolder( override fun setDisabled( openTaskDisabled: Boolean, - taskActionsDisabled: Boolean, + taskActionsDisabled: Boolean ) { super.setDisabled(openTaskDisabled, taskActionsDisabled) binding.buyButton.isEnabled = !taskActionsDisabled @@ -52,7 +52,7 @@ class RewardViewHolder( position: Int, canBuy: Boolean, displayMode: String, - ownerID: String?, + ownerID: String? ) { this.task = reward streakTextView.visibility = View.GONE @@ -65,11 +65,11 @@ class RewardViewHolder( HabiticaIconsHelper.imageOfLocked( ContextCompat.getColor(context, R.color.gray_1_30), 10, - 12, + 12 ).toDrawable(context.resources), null, null, - null, + null ) binding.priceLabel.compoundDrawablePadding = 2.dpToPx(context) } else { @@ -80,14 +80,14 @@ class RewardViewHolder( binding.priceLabel.setTextColor( ContextCompat.getColor( context, - R.color.reward_buy_button_text, - ), + R.color.reward_buy_button_text + ) ) binding.buyButton.setBackgroundColor( ContextCompat.getColor( context, - R.color.reward_buy_button_bg, - ), + R.color.reward_buy_button_bg + ) ) } else { binding.goldIcon.alpha = 0.6f @@ -96,10 +96,10 @@ class RewardViewHolder( ColorUtils.setAlphaComponent( ContextCompat.getColor( context, - R.color.offset_background, + R.color.offset_background ), - 127, - ), + 127 + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/TodoViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/TodoViewHolder.kt index 19c9470c6..83c439012 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/TodoViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/TodoViewHolder.kt @@ -15,13 +15,13 @@ class TodoViewHolder( scoreChecklistItemFunc: ((Task, ChecklistItem) -> Unit), openTaskFunc: ((Task, View) -> Unit), brokenTaskFunc: ((Task) -> Unit), - assignedTextProvider: GroupPlanInfoProvider?, + assignedTextProvider: GroupPlanInfoProvider? ) : ChecklistedViewHolder(itemView, scoreTaskFunc, scoreChecklistItemFunc, openTaskFunc, brokenTaskFunc, assignedTextProvider) { override fun bind( data: Task, position: Int, displayMode: String, - ownerID: String?, + ownerID: String? ) { this.task = data setChecklistIndicatorBackgroundActive(data.isChecklistDisplayActive) @@ -51,7 +51,7 @@ class TodoViewHolder( override fun shouldDisplayAsActive( task: Task?, - userID: String?, + userID: String? ): Boolean { return task?.completed(userID) != true } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt index 65ceaa559..47954c2cd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt @@ -32,155 +32,155 @@ import kotlinx.coroutines.Dispatchers import javax.inject.Inject class AuthenticationViewModel - @Inject - constructor( - val apiClient: ApiClient, - val userRepository: UserRepository, - val sharedPrefs: SharedPreferences, - val authenticationHandler: AuthenticationHandler, - val hostConfig: HostConfig, - private val keyHelper: KeyHelper?, +@Inject +constructor( + val apiClient: ApiClient, + val userRepository: UserRepository, + val sharedPrefs: SharedPreferences, + val authenticationHandler: AuthenticationHandler, + val hostConfig: HostConfig, + private val keyHelper: KeyHelper? +) { + var googleEmail: String? = null + + fun handleGoogleLogin( + activity: Activity, + pickAccountResult: ActivityResultLauncher ) { - var googleEmail: String? = null - - fun handleGoogleLogin( - activity: Activity, - pickAccountResult: ActivityResultLauncher, - ) { - if (!checkPlayServices(activity)) { - return - } - val accountTypes = arrayOf("com.google") - val intent = - AccountManager.newChooseAccountIntent( - null, - null, - accountTypes, - true, - null, - null, - null, - null, - ) - try { - pickAccountResult.launch(intent) - } catch (e: ActivityNotFoundException) { - val alert = HabiticaAlertDialog(activity) - alert.setTitle(R.string.authentication_error_title) - alert.setMessage(R.string.google_services_missing) - alert.addCloseButton() - alert.show() - } + if (!checkPlayServices(activity)) { + return } - - fun handleGoogleLoginResult( - activity: Activity, - recoverFromPlayServicesErrorResult: ActivityResultLauncher?, - onSuccess: (Boolean) -> Unit, - ) { - val scopesString = Scopes.PROFILE + " " + Scopes.EMAIL - val scopes = "oauth2:$scopesString" - var newUser: Boolean - CoroutineScope(Dispatchers.IO).launchCatching({ throwable -> - if (recoverFromPlayServicesErrorResult == null) return@launchCatching - if (throwable is GoogleAuthException) { - handleGoogleAuthException( - throwable, - activity, - recoverFromPlayServicesErrorResult, - ) - } - }) { - val token = GoogleAuthUtil.getToken(activity, googleEmail ?: "", scopes) - val response = - apiClient.connectSocial("google", googleEmail ?: "", token) ?: return@launchCatching - newUser = response.newUser - handleAuthResponse(response) - onSuccess(newUser) - } - } - - private fun handleGoogleAuthException( - e: Exception, - activity: Activity, - recoverFromPlayServicesErrorResult: ActivityResultLauncher, - ) { - if (e is GooglePlayServicesAvailabilityException) { - GoogleApiAvailability.getInstance() - GooglePlayServicesUtil.showErrorDialogFragment( - e.connectionStatusCode, - activity, - null, - REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR, - ) { - } - return - } else if (e is UserRecoverableAuthException) { - // Unable to authenticate, such as when the user has not yet granted - // the app access to the account, but the user can fix this. - // Forward the user to an activity in Google Play services. - if (!activity.isFinishing) { - val intent = e.intent ?: return - recoverFromPlayServicesErrorResult.launch(intent) - } - } - } - - private fun checkPlayServices(activity: Activity): Boolean { - val googleAPI = GoogleApiAvailability.getInstance() - val result = googleAPI.isGooglePlayServicesAvailable(activity) - if (result != ConnectionResult.SUCCESS) { - if (googleAPI.isUserResolvableError(result)) { - googleAPI.getErrorDialog( - activity, - result, - PLAY_SERVICES_RESOLUTION_REQUEST, - )?.show() - } - return false - } - - return true - } - - fun handleAuthResponse(userAuthResponse: UserAuthResponse) { - try { - saveTokens(userAuthResponse.apiToken, userAuthResponse.id) - } catch (e: Exception) { - Analytics.logException(e) - } - } - - @Throws(Exception::class) - private fun saveTokens( - api: String, - user: String, - ) { - this.apiClient.updateAuthenticationCredentials(user, api) - authenticationHandler.updateUserID(user) - sharedPrefs.edit { - putString("UserID", user) - val encryptedKey = - if (keyHelper != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - try { - keyHelper.encrypt(api) - } catch (e: Exception) { - null - } - } else { - null - } - if ((encryptedKey?.length ?: 0) > 5) { - putString(user, encryptedKey) - } else { - // Something might have gone wrong with encryption, so fall back to this. - putString("APIToken", api) - } - } - } - - companion object { - private const val REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR = 1001 - private const val PLAY_SERVICES_RESOLUTION_REQUEST = 9000 + val accountTypes = arrayOf("com.google") + val intent = + AccountManager.newChooseAccountIntent( + null, + null, + accountTypes, + true, + null, + null, + null, + null + ) + try { + pickAccountResult.launch(intent) + } catch (e: ActivityNotFoundException) { + val alert = HabiticaAlertDialog(activity) + alert.setTitle(R.string.authentication_error_title) + alert.setMessage(R.string.google_services_missing) + alert.addCloseButton() + alert.show() } } + + fun handleGoogleLoginResult( + activity: Activity, + recoverFromPlayServicesErrorResult: ActivityResultLauncher?, + onSuccess: (Boolean) -> Unit + ) { + val scopesString = Scopes.PROFILE + " " + Scopes.EMAIL + val scopes = "oauth2:$scopesString" + var newUser: Boolean + CoroutineScope(Dispatchers.IO).launchCatching({ throwable -> + if (recoverFromPlayServicesErrorResult == null) return@launchCatching + if (throwable is GoogleAuthException) { + handleGoogleAuthException( + throwable, + activity, + recoverFromPlayServicesErrorResult + ) + } + }) { + val token = GoogleAuthUtil.getToken(activity, googleEmail ?: "", scopes) + val response = + apiClient.connectSocial("google", googleEmail ?: "", token) ?: return@launchCatching + newUser = response.newUser + handleAuthResponse(response) + onSuccess(newUser) + } + } + + private fun handleGoogleAuthException( + e: Exception, + activity: Activity, + recoverFromPlayServicesErrorResult: ActivityResultLauncher + ) { + if (e is GooglePlayServicesAvailabilityException) { + GoogleApiAvailability.getInstance() + GooglePlayServicesUtil.showErrorDialogFragment( + e.connectionStatusCode, + activity, + null, + REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR + ) { + } + return + } else if (e is UserRecoverableAuthException) { + // Unable to authenticate, such as when the user has not yet granted + // the app access to the account, but the user can fix this. + // Forward the user to an activity in Google Play services. + if (!activity.isFinishing) { + val intent = e.intent ?: return + recoverFromPlayServicesErrorResult.launch(intent) + } + } + } + + private fun checkPlayServices(activity: Activity): Boolean { + val googleAPI = GoogleApiAvailability.getInstance() + val result = googleAPI.isGooglePlayServicesAvailable(activity) + if (result != ConnectionResult.SUCCESS) { + if (googleAPI.isUserResolvableError(result)) { + googleAPI.getErrorDialog( + activity, + result, + PLAY_SERVICES_RESOLUTION_REQUEST + )?.show() + } + return false + } + + return true + } + + fun handleAuthResponse(userAuthResponse: UserAuthResponse) { + try { + saveTokens(userAuthResponse.apiToken, userAuthResponse.id) + } catch (e: Exception) { + Analytics.logException(e) + } + } + + @Throws(Exception::class) + private fun saveTokens( + api: String, + user: String + ) { + this.apiClient.updateAuthenticationCredentials(user, api) + authenticationHandler.updateUserID(user) + sharedPrefs.edit { + putString("UserID", user) + val encryptedKey = + if (keyHelper != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + try { + keyHelper.encrypt(api) + } catch (e: Exception) { + null + } + } else { + null + } + if ((encryptedKey?.length ?: 0) > 5) { + putString(user, encryptedKey) + } else { + // Something might have gone wrong with encryption, so fall back to this. + putString("APIToken", api) + } + } + } + + companion object { + private const val REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR = 1001 + private const val PLAY_SERVICES_RESOLUTION_REQUEST = 9000 + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt index eebdcb2c1..3e14f3f68 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt @@ -10,7 +10,7 @@ import kotlinx.coroutines.launch abstract class BaseViewModel( val userRepository: UserRepository, - val userViewModel: MainUserViewModel, + val userViewModel: MainUserViewModel ) : ViewModel() { val user: LiveData by lazy { userViewModel.user @@ -23,7 +23,7 @@ abstract class BaseViewModel( fun updateUser( path: String, - value: Any, + value: Any ) { viewModelScope.launch(ExceptionHandler.coroutine()) { userRepository.updateUser(path, value) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt index b0d6d830c..e0a5a8a10 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt @@ -38,293 +38,293 @@ import kotlin.time.toDuration enum class GroupViewType(internal val order: String) { PARTY("party"), - GUILD("guild"), + GUILD("guild") } @OptIn(ExperimentalCoroutinesApi::class) @HiltViewModel open class GroupViewModel - @Inject - constructor( - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val challengeRepository: ChallengeRepository, - val socialRepository: SocialRepository, - val notificationsManager: NotificationsManager, - ) : BaseViewModel(userRepository, userViewModel) { - protected val groupIDState = MutableStateFlow(null) - val groupIDFlow: Flow = groupIDState +@Inject +constructor( + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val challengeRepository: ChallengeRepository, + val socialRepository: SocialRepository, + val notificationsManager: NotificationsManager +) : BaseViewModel(userRepository, userViewModel) { + protected val groupIDState = MutableStateFlow(null) + val groupIDFlow: Flow = groupIDState - var groupViewType: GroupViewType? = null + var groupViewType: GroupViewType? = null - private val groupFlow = - groupIDFlow - .filterNotNull() - .flatMapLatest { socialRepository.getGroup(it) } - private val group = groupFlow.asLiveData() + private val groupFlow = + groupIDFlow + .filterNotNull() + .flatMapLatest { socialRepository.getGroup(it) } + private val group = groupFlow.asLiveData() - private val leaderFlow = - groupFlow.map { it?.leaderID } - .filterNotNull() - .flatMapLatest { socialRepository.retrieveMember(it).toFlow() } - private val leader = leaderFlow.asLiveData() + private val leaderFlow = + groupFlow.map { it?.leaderID } + .filterNotNull() + .flatMapLatest { socialRepository.retrieveMember(it).toFlow() } + private val leader = leaderFlow.asLiveData() - private val isMemberFlow = - groupIDFlow - .filterNotNull() - .flatMapLatest { socialRepository.getGroupMembership(it) } - .map { it != null } - private val isMemberData = isMemberFlow.asLiveData() + private val isMemberFlow = + groupIDFlow + .filterNotNull() + .flatMapLatest { socialRepository.getGroupMembership(it) } + .map { it != null } + private val isMemberData = isMemberFlow.asLiveData() - private val chatMessagesLiveData: MutableLiveData> by lazy { - MutableLiveData>(listOf()) - } - val chatmessages: LiveData> by lazy { - chatMessagesLiveData + private val chatMessagesLiveData: MutableLiveData> by lazy { + MutableLiveData>(listOf()) + } + val chatmessages: LiveData> by lazy { + chatMessagesLiveData + } + + var gotNewMessages: Boolean = false + + override fun onCleared() { + socialRepository.close() + super.onCleared() + } + + fun setGroupID(groupID: String) { + if (groupID == groupIDState.value) return + groupIDState.value = groupID + + viewModelScope.launchCatching { + val notifications = + notificationsManager.getNotifications().firstOrNull()?.filter { notification -> + val data = notification.data as? NewChatMessageData + data?.group?.id == groupID + } ?: return@launchCatching + notifications.forEach { userRepository.readNotification(it.id) } } + } - var gotNewMessages: Boolean = false + val groupID: String? + get() = groupIDState.value + val isMember: Boolean + get() = isMemberData.value ?: false + val leaderID: String? + get() = group.value?.leaderID + val isLeader: Boolean + get() = user.value?.id == leaderID + val isPublicGuild: Boolean + get() = group.value?.privacy == "public" - override fun onCleared() { - socialRepository.close() - super.onCleared() - } + val pendingInvites = mutableStateListOf() + val pendingInviteStates = mutableStateMapOf() - fun setGroupID(groupID: String) { - if (groupID == groupIDState.value) return - groupIDState.value = groupID + fun getGroupData(): LiveData = group - viewModelScope.launchCatching { - val notifications = - notificationsManager.getNotifications().firstOrNull()?.filter { notification -> - val data = notification.data as? NewChatMessageData - data?.group?.id == groupID - } ?: return@launchCatching - notifications.forEach { userRepository.readNotification(it.id) } - } - } + fun getLeaderData(): LiveData = leader - val groupID: String? - get() = groupIDState.value - val isMember: Boolean - get() = isMemberData.value ?: false - val leaderID: String? - get() = group.value?.leaderID - val isLeader: Boolean - get() = user.value?.id == leaderID - val isPublicGuild: Boolean - get() = group.value?.privacy == "public" + fun getIsMemberData(): LiveData = isMemberData - val pendingInvites = mutableStateListOf() - val pendingInviteStates = mutableStateMapOf() - - fun getGroupData(): LiveData = group - - fun getLeaderData(): LiveData = leader - - fun getIsMemberData(): LiveData = isMemberData - - fun retrieveGroup(function: (() -> Unit)?) { - if (groupID?.isNotEmpty() == true) { - viewModelScope.launch( - ExceptionHandler.coroutine { - if (it is HttpException && it.code() == 404) { - MainNavigationController.navigateBack() - } - }, - ) { - val group = socialRepository.retrieveGroup(groupID ?: "") - if (groupViewType == GroupViewType.PARTY) { - socialRepository.retrievePartyMembers(group?.id ?: "", true) - if (isLeader) { - val invites = - socialRepository.retrievegroupInvites(group?.id ?: "", true) - ?: emptyList() - pendingInvites.clear() - pendingInvites.addAll(invites) - } - } - function?.invoke() - } - } - } - - fun inviteToGroup(inviteData: HashMap) { - viewModelScope.launchCatching { - socialRepository.inviteToGroup(group.value?.id ?: "", inviteData) - } - } - - fun updateOrCreateGroup(bundle: Bundle?) { - viewModelScope.launch(ExceptionHandler.coroutine()) { - if (group.value == null) { - socialRepository.createGroup( - bundle?.getString("name"), - bundle?.getString("description"), - bundle?.getString("leader"), - bundle?.getString("groupType"), - bundle?.getString("privacy"), - bundle?.getBoolean("leaderCreateChallenge"), - ) - } else { - socialRepository.updateGroup( - group.value, - bundle?.getString("name"), - bundle?.getString("description"), - bundle?.getString("leader"), - bundle?.getBoolean("leaderOnlyChallenges"), - ) - } - } - } - - fun leaveGroup( - leaveQuest: Boolean, - abortQuest: Boolean, - groupChallenges: List, - keepChallenges: Boolean = true, - function: (() -> Unit)? = null, - ) { - if (!keepChallenges) { - viewModelScope.launchCatching { - for (challenge in groupChallenges) { - challengeRepository.leaveChallenge(challenge, "remove-all") - } - } - } - viewModelScope.launch(ExceptionHandler.coroutine()) { - if (abortQuest) { - socialRepository.abortQuest(groupID ?: "") - } else if (leaveQuest) { - socialRepository.leaveQuest(groupID ?: "") - } - socialRepository.leaveGroup(groupID ?: "", keepChallenges) - userRepository.retrieveUser(withTasks = false, forced = true) - function?.invoke() - } - } - - fun joinGroup( - id: String? = null, - function: (() -> Unit)? = null, - ) { - viewModelScope.launchCatching { - socialRepository.joinGroup(id ?: groupID) - function?.invoke() - } - } - - fun rejectGroupInvite(id: String? = null) { - groupID?.let { - viewModelScope.launchCatching { - socialRepository.rejectGroupInvite(id ?: it) - } - } - } - - fun markMessagesSeen() { - groupID?.let { - if (it.isNotEmpty() && gotNewMessages) { - viewModelScope.launchCatching { - socialRepository.markMessagesSeen(it) - } - } - } - } - - fun likeMessage(message: ChatMessage) { - viewModelScope.launchCatching { - val newMessage = socialRepository.likeMessage(message) - val index = chatMessagesLiveData.value?.indexOfFirst { it.id == newMessage?.id } - if (index == null || index < 0) { - retrieveGroupChat { } - return@launchCatching - } - val list = mutableListOf() - chatMessagesLiveData.value?.let { list.addAll(it) } - if (newMessage != null) { - list[index] = newMessage - } - chatMessagesLiveData.postValue(list) - } - } - - fun deleteMessage(chatMessage: ChatMessage) { - val oldIndex = chatMessagesLiveData.value?.indexOf(chatMessage) ?: return - val list = chatMessagesLiveData.value?.toMutableList() - list?.remove(chatMessage) - chatMessagesLiveData.postValue(list) + fun retrieveGroup(function: (() -> Unit)?) { + if (groupID?.isNotEmpty() == true) { viewModelScope.launch( ExceptionHandler.coroutine { - list?.add(oldIndex, chatMessage) - chatMessagesLiveData.postValue(list) - ExceptionHandler.reportError(it) - }, - ) { - socialRepository.deleteMessage(chatMessage) - } - } - - fun postGroupChat( - chatText: String, - onComplete: () -> Unit, - onError: () -> Unit, - ) { - groupID?.let { groupID -> - viewModelScope.launch( - ExceptionHandler.coroutine { - ExceptionHandler.reportError(it) - onError() - }, - ) { - val response = socialRepository.postGroupChat(groupID, chatText) - val list = chatMessagesLiveData.value?.toMutableList() - if (response != null) { - list?.add(0, response.message) + if (it is HttpException && it.code() == 404) { + MainNavigationController.navigateBack() } - chatMessagesLiveData.postValue(list) - onComplete() } + ) { + val group = socialRepository.retrieveGroup(groupID ?: "") + if (groupViewType == GroupViewType.PARTY) { + socialRepository.retrievePartyMembers(group?.id ?: "", true) + if (isLeader) { + val invites = + socialRepository.retrievegroupInvites(group?.id ?: "", true) + ?: emptyList() + pendingInvites.clear() + pendingInvites.addAll(invites) + } + } + function?.invoke() } } + } - fun retrieveGroupChat(onComplete: () -> Unit) { - var groupID = groupID - if (groupViewType == GroupViewType.PARTY) { - groupID = "party" - } - if (groupID.isNullOrEmpty()) { - onComplete() - return - } - viewModelScope.launch(ExceptionHandler.coroutine()) { - val messages = socialRepository.retrieveGroupChat(groupID) - chatMessagesLiveData.postValue(messages) - onComplete() - } + fun inviteToGroup(inviteData: HashMap) { + viewModelScope.launchCatching { + socialRepository.inviteToGroup(group.value?.id ?: "", inviteData) } + } - fun updateGroup(bundle: Bundle?) { - viewModelScope.launch(ExceptionHandler.coroutine()) { + fun updateOrCreateGroup(bundle: Bundle?) { + viewModelScope.launch(ExceptionHandler.coroutine()) { + if (group.value == null) { + socialRepository.createGroup( + bundle?.getString("name"), + bundle?.getString("description"), + bundle?.getString("leader"), + bundle?.getString("groupType"), + bundle?.getString("privacy"), + bundle?.getBoolean("leaderCreateChallenge") + ) + } else { socialRepository.updateGroup( group.value, bundle?.getString("name"), bundle?.getString("description"), bundle?.getString("leader"), - bundle?.getBoolean("leaderOnlyChallenges"), + bundle?.getBoolean("leaderOnlyChallenges") ) } } + } - fun rescindInvite(invitedMember: Member) { - pendingInviteStates[invitedMember.id] = LoadingButtonState.LOADING - viewModelScope.launchCatching({ - pendingInviteStates[invitedMember.id] = LoadingButtonState.FAILED - }) { - socialRepository.removeMemberFromGroup(groupID ?: "", invitedMember.id) - pendingInviteStates[invitedMember.id] = LoadingButtonState.SUCCESS - delay(1.toDuration(DurationUnit.SECONDS)) - pendingInvites.remove(invitedMember) + fun leaveGroup( + leaveQuest: Boolean, + abortQuest: Boolean, + groupChallenges: List, + keepChallenges: Boolean = true, + function: (() -> Unit)? = null + ) { + if (!keepChallenges) { + viewModelScope.launchCatching { + for (challenge in groupChallenges) { + challengeRepository.leaveChallenge(challenge, "remove-all") + } + } + } + viewModelScope.launch(ExceptionHandler.coroutine()) { + if (abortQuest) { + socialRepository.abortQuest(groupID ?: "") + } else if (leaveQuest) { + socialRepository.leaveQuest(groupID ?: "") + } + socialRepository.leaveGroup(groupID ?: "", keepChallenges) + userRepository.retrieveUser(withTasks = false, forced = true) + function?.invoke() + } + } + + fun joinGroup( + id: String? = null, + function: (() -> Unit)? = null + ) { + viewModelScope.launchCatching { + socialRepository.joinGroup(id ?: groupID) + function?.invoke() + } + } + + fun rejectGroupInvite(id: String? = null) { + groupID?.let { + viewModelScope.launchCatching { + socialRepository.rejectGroupInvite(id ?: it) } } } + + fun markMessagesSeen() { + groupID?.let { + if (it.isNotEmpty() && gotNewMessages) { + viewModelScope.launchCatching { + socialRepository.markMessagesSeen(it) + } + } + } + } + + fun likeMessage(message: ChatMessage) { + viewModelScope.launchCatching { + val newMessage = socialRepository.likeMessage(message) + val index = chatMessagesLiveData.value?.indexOfFirst { it.id == newMessage?.id } + if (index == null || index < 0) { + retrieveGroupChat { } + return@launchCatching + } + val list = mutableListOf() + chatMessagesLiveData.value?.let { list.addAll(it) } + if (newMessage != null) { + list[index] = newMessage + } + chatMessagesLiveData.postValue(list) + } + } + + fun deleteMessage(chatMessage: ChatMessage) { + val oldIndex = chatMessagesLiveData.value?.indexOf(chatMessage) ?: return + val list = chatMessagesLiveData.value?.toMutableList() + list?.remove(chatMessage) + chatMessagesLiveData.postValue(list) + viewModelScope.launch( + ExceptionHandler.coroutine { + list?.add(oldIndex, chatMessage) + chatMessagesLiveData.postValue(list) + ExceptionHandler.reportError(it) + } + ) { + socialRepository.deleteMessage(chatMessage) + } + } + + fun postGroupChat( + chatText: String, + onComplete: () -> Unit, + onError: () -> Unit + ) { + groupID?.let { groupID -> + viewModelScope.launch( + ExceptionHandler.coroutine { + ExceptionHandler.reportError(it) + onError() + } + ) { + val response = socialRepository.postGroupChat(groupID, chatText) + val list = chatMessagesLiveData.value?.toMutableList() + if (response != null) { + list?.add(0, response.message) + } + chatMessagesLiveData.postValue(list) + onComplete() + } + } + } + + fun retrieveGroupChat(onComplete: () -> Unit) { + var groupID = groupID + if (groupViewType == GroupViewType.PARTY) { + groupID = "party" + } + if (groupID.isNullOrEmpty()) { + onComplete() + return + } + viewModelScope.launch(ExceptionHandler.coroutine()) { + val messages = socialRepository.retrieveGroupChat(groupID) + chatMessagesLiveData.postValue(messages) + onComplete() + } + } + + fun updateGroup(bundle: Bundle?) { + viewModelScope.launch(ExceptionHandler.coroutine()) { + socialRepository.updateGroup( + group.value, + bundle?.getString("name"), + bundle?.getString("description"), + bundle?.getString("leader"), + bundle?.getBoolean("leaderOnlyChallenges") + ) + } + } + + fun rescindInvite(invitedMember: Member) { + pendingInviteStates[invitedMember.id] = LoadingButtonState.LOADING + viewModelScope.launchCatching({ + pendingInviteStates[invitedMember.id] = LoadingButtonState.FAILED + }) { + socialRepository.removeMemberFromGroup(groupID ?: "", invitedMember.id) + pendingInviteStates[invitedMember.id] = LoadingButtonState.SUCCESS + delay(1.toDuration(DurationUnit.SECONDS)) + pendingInvites.remove(invitedMember) + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt index beebd2f48..b57b37326 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt @@ -1,12 +1,9 @@ package com.habitrpg.android.habitica.ui.viewmodels import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope -import androidx.paging.DataSource -import androidx.paging.PagedList import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData @@ -19,82 +16,74 @@ import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.common.habitica.helpers.ExceptionHandler import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.kotlin.toFlow -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.take import kotlinx.coroutines.launch import javax.inject.Inject -import kotlin.math.ceil @HiltViewModel class InboxViewModel - @Inject - constructor( - savedStateHandle: SavedStateHandle, - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val socialRepository: SocialRepository, - ) : BaseViewModel(userRepository, userViewModel) { - val recipientID: String? = savedStateHandle["userID"] - val recipientUsername: String? = savedStateHandle["username"] +@Inject +constructor( + savedStateHandle: SavedStateHandle, + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val socialRepository: SocialRepository +) : BaseViewModel(userRepository, userViewModel) { + val recipientID: String? = savedStateHandle["userID"] + val recipientUsername: String? = savedStateHandle["username"] - private var memberIDFlow = MutableStateFlow(null) - val memberIDState: StateFlow = memberIDFlow + private var memberIDFlow = MutableStateFlow(null) + val memberIDState: StateFlow = memberIDFlow - private val config = - PagingConfig(pageSize = 10, enablePlaceholders = false) - private var messagesDataSource = MessagesDataSource(socialRepository, memberID, ChatMessage()) - val messages: LiveData> = - Pager( - config, - null, - ) { - messagesDataSource = MessagesDataSource(socialRepository, memberID, ChatMessage()) - messagesDataSource - }.liveData - private val member = - memberIDFlow - .filterNotNull() - .flatMapLatest { socialRepository.retrieveMember(it).toFlow() } - .asLiveData() + private val config = + PagingConfig(pageSize = 10, enablePlaceholders = false) + private var messagesDataSource = MessagesDataSource(socialRepository, memberID, ChatMessage()) + val messages: LiveData> = + Pager( + config, + null + ) { + messagesDataSource = MessagesDataSource(socialRepository, memberID, ChatMessage()) + messagesDataSource + }.liveData + private val member = + memberIDFlow + .filterNotNull() + .flatMapLatest { socialRepository.retrieveMember(it).toFlow() } + .asLiveData() - fun setMemberID(memberID: String) { - if (memberID == memberIDState.value) return - memberIDFlow.value = memberID - } + fun setMemberID(memberID: String) { + if (memberID == memberIDState.value) return + memberIDFlow.value = memberID + } - val memberID: String? - get() = memberIDFlow.value + val memberID: String? + get() = memberIDFlow.value - fun invalidateDataSource() { - messagesDataSource.invalidate() - } + fun invalidateDataSource() { + messagesDataSource.invalidate() + } - init { - if (recipientID?.isNotBlank() == true) { - setMemberID(recipientID) - } else if (recipientUsername?.isNotBlank() == true) { - viewModelScope.launch(ExceptionHandler.coroutine()) { - val member = socialRepository.retrieveMember(recipientUsername, false) - setMemberID(member?.id ?: "") - invalidateDataSource() - } + init { + if (recipientID?.isNotBlank() == true) { + setMemberID(recipientID) + } else if (recipientUsername?.isNotBlank() == true) { + viewModelScope.launch(ExceptionHandler.coroutine()) { + val member = socialRepository.retrieveMember(recipientUsername, false) + setMemberID(member?.id ?: "") + invalidateDataSource() } } } +} class MessagesDataSource( val socialRepository: SocialRepository, var recipientID: String?, - var footer: ChatMessage?, + var footer: ChatMessage? ) : PagingSource() { private var lastFetchWasEnd = false diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt index ac7e3fd59..cca1902a8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt @@ -32,173 +32,173 @@ import javax.inject.Inject @HiltViewModel class MainActivityViewModel - @Inject - constructor( - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val hostConfig: HostConfig, - val pushNotificationManager: PushNotificationManager, - val sharedPreferences: SharedPreferences, - val contentRepository: ContentRepository, - val taskRepository: TaskRepository, - val inventoryRepository: InventoryRepository, - val taskAlarmManager: TaskAlarmManager, - val maintenanceService: MaintenanceApiService, - ) : BaseViewModel(userRepository, userViewModel), TutorialView.OnTutorialReaction { - val isAuthenticated: Boolean - get() = hostConfig.hasAuthentication() - val launchScreen: String? - get() = sharedPreferences.getString("launch_screen", "") - var preferenceLanguage: String? - get() = sharedPreferences.getString("language", "en") - set(value) { - sharedPreferences.edit { - putString("language", value) - } - } - var requestNotificationPermission = MutableLiveData(false) - - val canShowTeamPlanHeader = mutableStateOf(false) - - override fun onCleared() { - taskRepository.close() - inventoryRepository.close() - contentRepository.close() - super.onCleared() - } - - fun onCreate() { - try { - viewModelScope.launch(ExceptionHandler.coroutine()) { - taskAlarmManager.scheduleAllSavedAlarms( - sharedPreferences.getBoolean( - "preventDailyReminder", - false, - ), - ) - } - } catch (e: Exception) { - Analytics.logException(e) - } - } - - fun onResume() { - // Track when the app was last opened, so that we can use this to send out special reminders after a week of inactivity +@Inject +constructor( + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val hostConfig: HostConfig, + val pushNotificationManager: PushNotificationManager, + val sharedPreferences: SharedPreferences, + val contentRepository: ContentRepository, + val taskRepository: TaskRepository, + val inventoryRepository: InventoryRepository, + val taskAlarmManager: TaskAlarmManager, + val maintenanceService: MaintenanceApiService +) : BaseViewModel(userRepository, userViewModel), TutorialView.OnTutorialReaction { + val isAuthenticated: Boolean + get() = hostConfig.hasAuthentication() + val launchScreen: String? + get() = sharedPreferences.getString("launch_screen", "") + var preferenceLanguage: String? + get() = sharedPreferences.getString("language", "en") + set(value) { sharedPreferences.edit { - putLong("lastAppLaunch", Date().time) - putBoolean("preventDailyReminder", false) + putString("language", value) } } + var requestNotificationPermission = MutableLiveData(false) - fun retrieveUser(forced: Boolean = false) { - if (hostConfig.hasAuthentication()) { - viewModelScope.launch(ExceptionHandler.coroutine()) { - contentRepository.retrieveWorldState() - userRepository.retrieveUser(true, forced)?.let { user -> - Analytics.setUserProperty( - "has_party", - if (user.party?.id?.isNotEmpty() == true) "true" else "false", - ) - Analytics.setUserProperty( - "is_subscribed", - if (user.isSubscribed) "true" else "false", - ) - Analytics.setUserProperty( - "checkin_count", - user.loginIncentives.toString(), - ) - user.preferences?.pushNotifications?.listOfEnabledKeys()?.let { - Analytics.setUserProperty("allowed_push_notifications", it) - } - Analytics.setUserProperty("level", user.stats?.lvl?.toString() ?: "") - pushNotificationManager.setUser(user) - if (!pushNotificationManager.notificationPermissionEnabled()) { - if (sharedPreferences.getBoolean("usePushNotifications", true)) { - requestNotificationPermission.value = true - } - } else { - pushNotificationManager.addPushDeviceUsingStoredToken() - } - } - inventoryRepository.retrieveInAppRewards() - contentRepository.retrieveContent() - } - viewModelScope.launchCatching { - userRepository.retrieveTeamPlans() - } - } - } + val canShowTeamPlanHeader = mutableStateOf(false) - fun updateAllowPushNotifications(allowPushNotifications: Boolean) { - sharedPreferences.getBoolean("usePushNotifications", true) - sharedPreferences.edit { - putBoolean("usePushNotifications", allowPushNotifications) - } - } + override fun onCleared() { + taskRepository.close() + inventoryRepository.close() + contentRepository.close() + super.onCleared() + } - override fun onTutorialCompleted(step: TutorialStep) { - updateUser("flags.tutorial." + step.tutorialGroup + "." + step.identifier, true) - logTutorialStatus(step, true) - } - - override fun onTutorialDeferred(step: TutorialStep) { - taskRepository.modify(step) { it.displayedOn = Date() } - } - - fun logTutorialStatus( - step: TutorialStep, - complete: Boolean, - ) { - val additionalData = HashMap() - additionalData["eventLabel"] = step.identifier + "-android" - additionalData["eventValue"] = step.identifier ?: "" - additionalData["complete"] = complete - Analytics.sendEvent( - "tutorial", - EventCategory.BEHAVIOUR, - HitType.EVENT, - additionalData, - ) - } - - fun ifNeedsMaintenance(onResult: ((MaintenanceResponse) -> Unit)) { - viewModelScope.launchCatching { - val maintenanceResponse = maintenanceService.getMaintenanceStatus() - if (maintenanceResponse?.activeMaintenance == null) { - return@launchCatching - } - onResult(maintenanceResponse) - } - } - - fun getToolbarTitle( - id: Int, - label: CharSequence?, - eggType: String?, - onSuccess: ((CharSequence?) -> Unit), - ) { - if (id == R.id.petDetailRecyclerFragment || id == R.id.mountDetailRecyclerFragment) { - viewModelScope.launchCatching { - val item = inventoryRepository.getItem("egg", eggType ?: "").firstOrNull() - if (item?.isValid() != true) return@launchCatching - onSuccess( - if (id == R.id.petDetailRecyclerFragment) { - (item as? Egg)?.text - } else { - (item as? Egg)?.mountText - }, + fun onCreate() { + try { + viewModelScope.launch(ExceptionHandler.coroutine()) { + taskAlarmManager.scheduleAllSavedAlarms( + sharedPreferences.getBoolean( + "preventDailyReminder", + false ) - } - } else { - onSuccess( - if (id == R.id.promoInfoFragment) { - "" - } else if (label.isNullOrEmpty() && user.value?.isValid == true) { - user.value?.profile?.name - } else { - label ?: "" - }, ) } + } catch (e: Exception) { + Analytics.logException(e) + } + } + + fun onResume() { + // Track when the app was last opened, so that we can use this to send out special reminders after a week of inactivity + sharedPreferences.edit { + putLong("lastAppLaunch", Date().time) + putBoolean("preventDailyReminder", false) + } + } + + fun retrieveUser(forced: Boolean = false) { + if (hostConfig.hasAuthentication()) { + viewModelScope.launch(ExceptionHandler.coroutine()) { + contentRepository.retrieveWorldState() + userRepository.retrieveUser(true, forced)?.let { user -> + Analytics.setUserProperty( + "has_party", + if (user.party?.id?.isNotEmpty() == true) "true" else "false" + ) + Analytics.setUserProperty( + "is_subscribed", + if (user.isSubscribed) "true" else "false" + ) + Analytics.setUserProperty( + "checkin_count", + user.loginIncentives.toString() + ) + user.preferences?.pushNotifications?.listOfEnabledKeys()?.let { + Analytics.setUserProperty("allowed_push_notifications", it) + } + Analytics.setUserProperty("level", user.stats?.lvl?.toString() ?: "") + pushNotificationManager.setUser(user) + if (!pushNotificationManager.notificationPermissionEnabled()) { + if (sharedPreferences.getBoolean("usePushNotifications", true)) { + requestNotificationPermission.value = true + } + } else { + pushNotificationManager.addPushDeviceUsingStoredToken() + } + } + inventoryRepository.retrieveInAppRewards() + contentRepository.retrieveContent() + } + viewModelScope.launchCatching { + userRepository.retrieveTeamPlans() + } } } + + fun updateAllowPushNotifications(allowPushNotifications: Boolean) { + sharedPreferences.getBoolean("usePushNotifications", true) + sharedPreferences.edit { + putBoolean("usePushNotifications", allowPushNotifications) + } + } + + override fun onTutorialCompleted(step: TutorialStep) { + updateUser("flags.tutorial." + step.tutorialGroup + "." + step.identifier, true) + logTutorialStatus(step, true) + } + + override fun onTutorialDeferred(step: TutorialStep) { + taskRepository.modify(step) { it.displayedOn = Date() } + } + + fun logTutorialStatus( + step: TutorialStep, + complete: Boolean + ) { + val additionalData = HashMap() + additionalData["eventLabel"] = step.identifier + "-android" + additionalData["eventValue"] = step.identifier ?: "" + additionalData["complete"] = complete + Analytics.sendEvent( + "tutorial", + EventCategory.BEHAVIOUR, + HitType.EVENT, + additionalData + ) + } + + fun ifNeedsMaintenance(onResult: ((MaintenanceResponse) -> Unit)) { + viewModelScope.launchCatching { + val maintenanceResponse = maintenanceService.getMaintenanceStatus() + if (maintenanceResponse?.activeMaintenance == null) { + return@launchCatching + } + onResult(maintenanceResponse) + } + } + + fun getToolbarTitle( + id: Int, + label: CharSequence?, + eggType: String?, + onSuccess: ((CharSequence?) -> Unit) + ) { + if (id == R.id.petDetailRecyclerFragment || id == R.id.mountDetailRecyclerFragment) { + viewModelScope.launchCatching { + val item = inventoryRepository.getItem("egg", eggType ?: "").firstOrNull() + if (item?.isValid() != true) return@launchCatching + onSuccess( + if (id == R.id.petDetailRecyclerFragment) { + (item as? Egg)?.text + } else { + (item as? Egg)?.mountText + } + ) + } + } else { + onSuccess( + if (id == R.id.promoInfoFragment) { + "" + } else if (label.isNullOrEmpty() && user.value?.isValid == true) { + user.value?.profile?.name + } else { + label ?: "" + } + ) + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainUserViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainUserViewModel.kt index 6aa5c471a..80eafd782 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainUserViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainUserViewModel.kt @@ -23,85 +23,85 @@ import kotlinx.coroutines.launch import javax.inject.Inject class MainUserViewModel - @Inject - constructor( - private val authenticationHandler: AuthenticationHandler, - val userRepository: UserRepository, - val socialRepository: SocialRepository, - ) { - val formattedUsername: CharSequence? - get() = validatedUser?.formattedUsername - val userID: String - get() = validatedUser?.id ?: authenticationHandler.currentUserID ?: "" - val username: CharSequence - get() = validatedUser?.username ?: "" - val displayName: CharSequence - get() = validatedUser?.profile?.name ?: "" - val partyID: String? - get() = validatedUser?.party?.id - val isUserFainted: Boolean - get() = (validatedUser?.stats?.hp ?: 1.0) == 0.0 - val isUserInParty: Boolean - get() = validatedUser?.hasParty == true - val mirrorGroupTasks: List - get() = validatedUser?.preferences?.tasks?.mirrorGroupTasks ?: emptyList() +@Inject +constructor( + private val authenticationHandler: AuthenticationHandler, + val userRepository: UserRepository, + val socialRepository: SocialRepository +) { + val formattedUsername: CharSequence? + get() = validatedUser?.formattedUsername + val userID: String + get() = validatedUser?.id ?: authenticationHandler.currentUserID ?: "" + val username: CharSequence + get() = validatedUser?.username ?: "" + val displayName: CharSequence + get() = validatedUser?.profile?.name ?: "" + val partyID: String? + get() = validatedUser?.party?.id + val isUserFainted: Boolean + get() = (validatedUser?.stats?.hp ?: 1.0) == 0.0 + val isUserInParty: Boolean + get() = validatedUser?.hasParty == true + val mirrorGroupTasks: List + get() = validatedUser?.preferences?.tasks?.mirrorGroupTasks ?: emptyList() - val user: LiveData = userRepository.getUser().asLiveData() - private val validatedUser: User? - get() { - val u = this.user.value - if (u?.isValid == true) { - return u - } - return null + val user: LiveData = userRepository.getUser().asLiveData() + private val validatedUser: User? + get() { + val u = this.user.value + if (u?.isValid == true) { + return u } - var currentTeamPlan = - MutableSharedFlow( - replay = 1, - onBufferOverflow = BufferOverflow.DROP_OLDEST, - ) + return null + } + var currentTeamPlan = + MutableSharedFlow( + replay = 1, + onBufferOverflow = BufferOverflow.DROP_OLDEST + ) - @OptIn(ExperimentalCoroutinesApi::class) - var currentTeamPlanGroup = - currentTeamPlan - .map { it?.id } - .distinctUntilChanged { old, new -> old == new } - .filterNotNull() - .flatMapLatest { socialRepository.getGroup(it) } + @OptIn(ExperimentalCoroutinesApi::class) + var currentTeamPlanGroup = + currentTeamPlan + .map { it?.id } + .distinctUntilChanged { old, new -> old == new } + .filterNotNull() + .flatMapLatest { socialRepository.getGroup(it) } - @OptIn(ExperimentalCoroutinesApi::class) - var currentTeamPlanMembers: LiveData> = - currentTeamPlan - .map { it?.id } - .distinctUntilChanged { old, new -> old == new } - .filterNotNull() - .flatMapLatest { socialRepository.getGroupMembers(it) } - .distinctUntilChanged { old, new -> - old.size == new.size && - !old.mapIndexed { index, member -> member.id == new[index].id } - .contains(false) - } - .onEach { - if (it.isEmpty()) { - currentTeamPlan.lastOrNull()?.let { plan -> - userRepository.retrieveTeamPlan(plan.id) - } + @OptIn(ExperimentalCoroutinesApi::class) + var currentTeamPlanMembers: LiveData> = + currentTeamPlan + .map { it?.id } + .distinctUntilChanged { old, new -> old == new } + .filterNotNull() + .flatMapLatest { socialRepository.getGroupMembers(it) } + .distinctUntilChanged { old, new -> + old.size == new.size && + !old.mapIndexed { index, member -> member.id == new[index].id } + .contains(false) + } + .onEach { + if (it.isEmpty()) { + currentTeamPlan.lastOrNull()?.let { plan -> + userRepository.retrieveTeamPlan(plan.id) } } - .asLiveData() - - fun updateUser( - path: String, - value: Any, - ) { - MainScope().launch(ExceptionHandler.coroutine()) { - userRepository.updateUser(path, value) } - } + .asLiveData() - fun updateUser(data: Map) { - MainScope().launch(ExceptionHandler.coroutine()) { - userRepository.updateUser(data) - } + fun updateUser( + path: String, + value: Any + ) { + MainScope().launch(ExceptionHandler.coroutine()) { + userRepository.updateUser(path, value) } } + + fun updateUser(data: Map) { + MainScope().launch(ExceptionHandler.coroutine()) { + userRepository.updateUser(data) + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt index b5f39d006..3a4e98e87 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt @@ -33,428 +33,428 @@ import javax.inject.Inject @HiltViewModel open class NotificationsViewModel - @Inject - constructor( - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val notificationsManager: NotificationsManager, - val socialRepository: SocialRepository, - ) : BaseViewModel(userRepository, userViewModel) { - private val supportedNotificationTypes = - listOf( - Notification.Type.NEW_STUFF.type, - Notification.Type.NEW_CHAT_MESSAGE.type, - Notification.Type.NEW_MYSTERY_ITEMS.type, - Notification.Type.GROUP_TASK_NEEDS_WORK.type, - Notification.Type.GROUP_TASK_APPROVED.type, - Notification.Type.UNALLOCATED_STATS_POINTS.type, - Notification.Type.ITEM_RECEIVED.type, - ) +@Inject +constructor( + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val notificationsManager: NotificationsManager, + val socialRepository: SocialRepository +) : BaseViewModel(userRepository, userViewModel) { + private val supportedNotificationTypes = + listOf( + Notification.Type.NEW_STUFF.type, + Notification.Type.NEW_CHAT_MESSAGE.type, + Notification.Type.NEW_MYSTERY_ITEMS.type, + Notification.Type.GROUP_TASK_NEEDS_WORK.type, + Notification.Type.GROUP_TASK_APPROVED.type, + Notification.Type.UNALLOCATED_STATS_POINTS.type, + Notification.Type.ITEM_RECEIVED.type + ) - private val actionableNotificationTypes = - listOf( - Notification.Type.GUILD_INVITATION.type, - Notification.Type.PARTY_INVITATION.type, - Notification.Type.QUEST_INVITATION.type, - ) + private val actionableNotificationTypes = + listOf( + Notification.Type.GUILD_INVITATION.type, + Notification.Type.PARTY_INVITATION.type, + Notification.Type.QUEST_INVITATION.type + ) - private var party: UserParty? = null - private var hasStats = false + private var party: UserParty? = null + private var hasStats = false - private val customNotifications = MutableStateFlow>(emptyList()) + private val customNotifications = MutableStateFlow>(emptyList()) - init { - userViewModel.user.observeForever { - if (it == null) return@observeForever - party = it.party - hasStats = it.hasClass - val notifications = convertInvitationsToNotifications(it) - if (it.flags?.newStuff == true) { - val notification = Notification() - notification.id = "custom-new-stuff-notification" - notification.type = Notification.Type.NEW_STUFF.type - val data = NewStuffData() - notification.data = data - notifications.add(notification) - } - customNotifications.value = notifications - } - } - - fun getNotifications(): Flow> { - val serverNotifications = - notificationsManager.getNotifications().map { filterSupportedTypes(it) } - - return serverNotifications.combine(customNotifications) { serverNotificationsList, customNotificationsList -> - if (serverNotificationsList.firstOrNull { notification -> notification.type == Notification.Type.NEW_STUFF.type } != null) { - return@combine serverNotificationsList + customNotificationsList.filter { notification -> notification.type != Notification.Type.NEW_STUFF.type } - } - return@combine serverNotificationsList + customNotificationsList - }.map { it.sortedBy { notification -> notification.priority } } - } - - fun getNotificationCount(): Flow { - return getNotifications().map { - it.count { notification -> - (notification.type != Notification.Type.UNALLOCATED_STATS_POINTS.type) || hasStats - } - }.distinctUntilChanged() - } - - fun allNotificationsSeen(): Flow { - return getNotifications().map { it.all { notification -> notification.seen == true } } - .distinctUntilChanged() - } - - fun getHasPartyNotification(): Flow { - return getNotifications().map { - it.find { notification -> - val data = notification.data as? NewChatMessageData - isPartyMessage(data) - } != null - }.distinctUntilChanged() - } - - suspend fun refreshNotifications(): User? { - return userRepository.retrieveUser(withTasks = false, forced = true) - } - - private fun filterSupportedTypes(notifications: List): List { - return notifications.filter { supportedNotificationTypes.contains(it.type) } - } - - private fun convertInvitationsToNotifications(user: User): MutableList { - val notifications = mutableListOf() - - notifications.addAll( - user.invitations?.parties?.map { - val notification = Notification() - notification.id = "custom-party-invitation-" + it.id - notification.type = Notification.Type.PARTY_INVITATION.type - val data = PartyInvitationData() - data.invitation = PartyInvite() - data.invitation?.id = it.id - data.invitation?.name = it.name - data.invitation?.inviter = it.inviter - notification.data = data - notification - } ?: emptyList(), - ) - - notifications.addAll( - user.invitations?.guilds?.map { - val notification = Notification() - notification.id = "custom-guild-invitation-" + it.id - notification.type = Notification.Type.GUILD_INVITATION.type - val data = GuildInvitationData() - data.invitation = GuildInvite() - data.invitation?.id = it.id - data.invitation?.name = it.name - data.invitation?.inviter = it.inviter - data.invitation?.publicGuild = it.publicGuild - notification.data = data - notification - } ?: emptyList(), - ) - - val quest = user.party?.quest - if (quest != null && quest.rsvpNeeded) { + init { + userViewModel.user.observeForever { + if (it == null) return@observeForever + party = it.party + hasStats = it.hasClass + val notifications = convertInvitationsToNotifications(it) + if (it.flags?.newStuff == true) { val notification = Notification() - notification.id = "custom-quest-invitation-" + user.party?.id - notification.type = Notification.Type.QUEST_INVITATION.type - val data = QuestInvitationData() - data.questKey = quest.key + notification.id = "custom-new-stuff-notification" + notification.type = Notification.Type.NEW_STUFF.type + val data = NewStuffData() notification.data = data - notifications.add(notification) } - - return notifications - } - - fun isPartyMessage(data: NewChatMessageData?): Boolean { - if (party?.isValid != true || data?.group?.id == null) { - return false - } - - return party?.id == data.group?.id - } - - /** - * Is the given notification an "artificial" custom notification (created by this class) - * instead of one of the ones coming from server. - */ - private fun isCustomNotification(notification: Notification): Boolean { - return notification.id.startsWith("custom-") - } - - private fun isCustomNewStuffNotification(notification: Notification) = - notification.id == "custom-new-stuff-notification" - - fun dismissNotification(notification: Notification) { - if (isCustomNotification(notification)) { - if (isCustomNewStuffNotification(notification)) { - updateUser("flags.newStuff", false) - customNotifications.value = - customNotifications.value.filterNot { it.id == notification.id } - } - return - } - - viewModelScope.launchCatching { - userRepository.readNotification(notification.id) - } - } - - fun dismissAllNotifications(notifications: List) { - val dismissableIds = - notifications.filter { !isCustomNotification(it) } - .filter { !actionableNotificationTypes.contains(it.type) }.map { it.id } - - val customNewStuffNotification = - notifications.firstOrNull { isCustomNewStuffNotification(it) } - - if (customNewStuffNotification != null) { - dismissNotification(customNewStuffNotification) - } - - if (dismissableIds.isEmpty()) { - return - } - - val notificationIds = HashMap>() - notificationIds["notificationIds"] = dismissableIds - - viewModelScope.launchCatching { - userRepository.readNotifications(notificationIds) - } - } - - fun markNotificationsAsSeen(notifications: List) { - val unseenIds = - notifications.filter { !isCustomNotification(it) }.filter { it.seen == false } - .map { it.id } - - if (unseenIds.isEmpty()) { - return - } - - val notificationIds = HashMap>() - notificationIds["notificationIds"] = unseenIds - - viewModelScope.launchCatching { - userRepository.seeNotifications(notificationIds) - } - } - - private fun findNotification(id: String): Notification? { - return notificationsManager.getNotification(id) - ?: customNotifications.value.find { it.id == id } - } - - fun click( - notificationId: String, - navController: MainNavigationController, - ) { - val notification = findNotification(notificationId) ?: return - - dismissNotification(notification) - - when (notification.type) { - Notification.Type.NEW_STUFF.type -> navController.navigate(R.id.newsFragment) - Notification.Type.NEW_CHAT_MESSAGE.type -> - clickNewChatMessage( - notification, - navController, - ) - - Notification.Type.GUILD_INVITATION.type -> - clickGroupInvitation( - notification, - navController, - ) - - Notification.Type.PARTY_INVITATION.type -> - clickGroupInvitation( - notification, - navController, - ) - - Notification.Type.QUEST_INVITATION.type -> navController.navigate(R.id.partyFragment) - Notification.Type.NEW_MYSTERY_ITEMS.type -> - navController.navigate( - R.id.itemsFragment, - bundleOf(Pair("itemType", "special")), - ) - - Notification.Type.UNALLOCATED_STATS_POINTS.type -> navController.navigate(R.id.statsFragment) - // Group tasks should go to Group tasks view if that is added to this app at some point - Notification.Type.GROUP_TASK_APPROVED.type -> navController.navigate(R.id.tasksFragment) - Notification.Type.GROUP_TASK_NEEDS_WORK.type -> navController.navigate(R.id.tasksFragment) - Notification.Type.ITEM_RECEIVED.type -> - clickItemReceivedNotification( - notification, - navController, - ) - } - } - - private fun clickItemReceivedNotification( - notification: Notification, - navController: MainNavigationController, - ) { - val data = notification.data as? ItemReceivedData - if (data?.destination?.startsWith("/") == true) { - MainNavigationController.navigate(data.destination ?: "") - return - } - when (data?.destination) { - "equipment" -> navController.navigate(R.id.equipmentOverviewFragment) - "customization" -> navController.navigate(R.id.composeAvatarEquipmentFragment) - "stable" -> navController.navigate(R.id.stableFragment) - "pets" -> navController.navigate(R.id.stableFragment) - "mounts" -> navController.navigate(R.id.stableFragment) - else -> navController.navigate(R.id.itemsFragment) - } - } - - private fun clickNewChatMessage( - notification: Notification, - navController: MainNavigationController, - ) { - val data = notification.data as? NewChatMessageData - if (isPartyMessage(data)) { - val bundle = Bundle() - bundle.putString("groupID", data?.group?.id) - bundle.putInt("tabToOpen", 1) - navController.navigate(R.id.partyFragment, bundle) - } else { - val bundle = Bundle() - bundle.putString("groupID", data?.group?.id) - bundle.putBoolean( - "isMember", - true, - ) // safe to assume user is member since they got the notification - bundle.putInt("tabToOpen", 1) - navController.navigate(R.id.guildFragment, bundle) - } - } - - private fun clickGroupInvitation( - notification: Notification, - navController: MainNavigationController, - ) { - when (notification.type) { - Notification.Type.GUILD_INVITATION.type -> { - val bundle = Bundle() - val data = notification.data as? GuildInvitationData - bundle.putString("groupID", data?.invitation?.id) - bundle.putBoolean( - "isMember", - true, - ) // safe to assume user is member since they got the notification - navController.navigate(R.id.guildFragment, bundle) - } - - Notification.Type.PARTY_INVITATION.type -> { - navController.navigate(R.id.partyFragment) - } - } - } - - fun accept(notificationId: String) { - val notification = findNotification(notificationId) ?: return - when (notification.type) { - Notification.Type.GUILD_INVITATION.type -> { - val data = notification.data as? GuildInvitationData - acceptGroupInvitation(data?.invitation?.id) - } - - Notification.Type.PARTY_INVITATION.type -> { - val data = notification.data as? PartyInvitationData - acceptGroupInvitation(data?.invitation?.id) - } - - Notification.Type.QUEST_INVITATION.type -> acceptQuestInvitation() - Notification.Type.GROUP_TASK_REQUIRES_APPROVAL.type -> acceptTaskApproval(notification) - } - if (isCustomNotification(notification)) { - viewModelScope.launch(ExceptionHandler.coroutine()) { - userRepository.retrieveUser() - } - } else { - dismissNotification(notification) - } - } - - fun reject(notificationId: String) { - val notification = findNotification(notificationId) ?: return - when (notification.type) { - Notification.Type.GUILD_INVITATION.type -> { - val data = notification.data as? GuildInvitationData - rejectGroupInvite(data?.invitation?.id) - } - - Notification.Type.PARTY_INVITATION.type -> { - val data = notification.data as? PartyInvitationData - rejectGroupInvite(data?.invitation?.id) - } - - Notification.Type.QUEST_INVITATION.type -> rejectQuestInvitation() - Notification.Type.GROUP_TASK_REQUIRES_APPROVAL.type -> rejectTaskApproval(notification) - } - if (!isCustomNotification(notification)) { - dismissNotification(notification) - } - } - - private fun acceptGroupInvitation(groupId: String?) { - groupId?.let { - viewModelScope.launch(ExceptionHandler.coroutine()) { - socialRepository.joinGroup(it) - refreshUser() - } - } - } - - fun rejectGroupInvite(groupId: String?) { - groupId?.let { - viewModelScope.launchCatching { - socialRepository.rejectGroupInvite(it) - refreshUser() - } - } - } - - private fun acceptQuestInvitation() { - party?.id?.let { - viewModelScope.launchCatching { - socialRepository.acceptQuest(null, it) - refreshUser() - } - } - } - - private fun rejectQuestInvitation() { - party?.id?.let { - viewModelScope.launchCatching { - socialRepository.rejectQuest(null, it) - refreshUser() - } - } - } - - private fun refreshUser() { - viewModelScope.launch(ExceptionHandler.coroutine()) { - refreshNotifications() - } - } - - private fun acceptTaskApproval(notification: Notification) { - notification.data as? GroupTaskRequiresApprovalData - } - - private fun rejectTaskApproval(notification: Notification) { - notification.data as? GroupTaskRequiresApprovalData + customNotifications.value = notifications } } + + fun getNotifications(): Flow> { + val serverNotifications = + notificationsManager.getNotifications().map { filterSupportedTypes(it) } + + return serverNotifications.combine(customNotifications) { serverNotificationsList, customNotificationsList -> + if (serverNotificationsList.firstOrNull { notification -> notification.type == Notification.Type.NEW_STUFF.type } != null) { + return@combine serverNotificationsList + customNotificationsList.filter { notification -> notification.type != Notification.Type.NEW_STUFF.type } + } + return@combine serverNotificationsList + customNotificationsList + }.map { it.sortedBy { notification -> notification.priority } } + } + + fun getNotificationCount(): Flow { + return getNotifications().map { + it.count { notification -> + (notification.type != Notification.Type.UNALLOCATED_STATS_POINTS.type) || hasStats + } + }.distinctUntilChanged() + } + + fun allNotificationsSeen(): Flow { + return getNotifications().map { it.all { notification -> notification.seen == true } } + .distinctUntilChanged() + } + + fun getHasPartyNotification(): Flow { + return getNotifications().map { + it.find { notification -> + val data = notification.data as? NewChatMessageData + isPartyMessage(data) + } != null + }.distinctUntilChanged() + } + + suspend fun refreshNotifications(): User? { + return userRepository.retrieveUser(withTasks = false, forced = true) + } + + private fun filterSupportedTypes(notifications: List): List { + return notifications.filter { supportedNotificationTypes.contains(it.type) } + } + + private fun convertInvitationsToNotifications(user: User): MutableList { + val notifications = mutableListOf() + + notifications.addAll( + user.invitations?.parties?.map { + val notification = Notification() + notification.id = "custom-party-invitation-" + it.id + notification.type = Notification.Type.PARTY_INVITATION.type + val data = PartyInvitationData() + data.invitation = PartyInvite() + data.invitation?.id = it.id + data.invitation?.name = it.name + data.invitation?.inviter = it.inviter + notification.data = data + notification + } ?: emptyList() + ) + + notifications.addAll( + user.invitations?.guilds?.map { + val notification = Notification() + notification.id = "custom-guild-invitation-" + it.id + notification.type = Notification.Type.GUILD_INVITATION.type + val data = GuildInvitationData() + data.invitation = GuildInvite() + data.invitation?.id = it.id + data.invitation?.name = it.name + data.invitation?.inviter = it.inviter + data.invitation?.publicGuild = it.publicGuild + notification.data = data + notification + } ?: emptyList() + ) + + val quest = user.party?.quest + if (quest != null && quest.rsvpNeeded) { + val notification = Notification() + notification.id = "custom-quest-invitation-" + user.party?.id + notification.type = Notification.Type.QUEST_INVITATION.type + val data = QuestInvitationData() + data.questKey = quest.key + notification.data = data + + notifications.add(notification) + } + + return notifications + } + + fun isPartyMessage(data: NewChatMessageData?): Boolean { + if (party?.isValid != true || data?.group?.id == null) { + return false + } + + return party?.id == data.group?.id + } + + /** + * Is the given notification an "artificial" custom notification (created by this class) + * instead of one of the ones coming from server. + */ + private fun isCustomNotification(notification: Notification): Boolean { + return notification.id.startsWith("custom-") + } + + private fun isCustomNewStuffNotification(notification: Notification) = + notification.id == "custom-new-stuff-notification" + + fun dismissNotification(notification: Notification) { + if (isCustomNotification(notification)) { + if (isCustomNewStuffNotification(notification)) { + updateUser("flags.newStuff", false) + customNotifications.value = + customNotifications.value.filterNot { it.id == notification.id } + } + return + } + + viewModelScope.launchCatching { + userRepository.readNotification(notification.id) + } + } + + fun dismissAllNotifications(notifications: List) { + val dismissableIds = + notifications.filter { !isCustomNotification(it) } + .filter { !actionableNotificationTypes.contains(it.type) }.map { it.id } + + val customNewStuffNotification = + notifications.firstOrNull { isCustomNewStuffNotification(it) } + + if (customNewStuffNotification != null) { + dismissNotification(customNewStuffNotification) + } + + if (dismissableIds.isEmpty()) { + return + } + + val notificationIds = HashMap>() + notificationIds["notificationIds"] = dismissableIds + + viewModelScope.launchCatching { + userRepository.readNotifications(notificationIds) + } + } + + fun markNotificationsAsSeen(notifications: List) { + val unseenIds = + notifications.filter { !isCustomNotification(it) }.filter { it.seen == false } + .map { it.id } + + if (unseenIds.isEmpty()) { + return + } + + val notificationIds = HashMap>() + notificationIds["notificationIds"] = unseenIds + + viewModelScope.launchCatching { + userRepository.seeNotifications(notificationIds) + } + } + + private fun findNotification(id: String): Notification? { + return notificationsManager.getNotification(id) + ?: customNotifications.value.find { it.id == id } + } + + fun click( + notificationId: String, + navController: MainNavigationController + ) { + val notification = findNotification(notificationId) ?: return + + dismissNotification(notification) + + when (notification.type) { + Notification.Type.NEW_STUFF.type -> navController.navigate(R.id.newsFragment) + Notification.Type.NEW_CHAT_MESSAGE.type -> + clickNewChatMessage( + notification, + navController + ) + + Notification.Type.GUILD_INVITATION.type -> + clickGroupInvitation( + notification, + navController + ) + + Notification.Type.PARTY_INVITATION.type -> + clickGroupInvitation( + notification, + navController + ) + + Notification.Type.QUEST_INVITATION.type -> navController.navigate(R.id.partyFragment) + Notification.Type.NEW_MYSTERY_ITEMS.type -> + navController.navigate( + R.id.itemsFragment, + bundleOf(Pair("itemType", "special")) + ) + + Notification.Type.UNALLOCATED_STATS_POINTS.type -> navController.navigate(R.id.statsFragment) + // Group tasks should go to Group tasks view if that is added to this app at some point + Notification.Type.GROUP_TASK_APPROVED.type -> navController.navigate(R.id.tasksFragment) + Notification.Type.GROUP_TASK_NEEDS_WORK.type -> navController.navigate(R.id.tasksFragment) + Notification.Type.ITEM_RECEIVED.type -> + clickItemReceivedNotification( + notification, + navController + ) + } + } + + private fun clickItemReceivedNotification( + notification: Notification, + navController: MainNavigationController + ) { + val data = notification.data as? ItemReceivedData + if (data?.destination?.startsWith("/") == true) { + MainNavigationController.navigate(data.destination ?: "") + return + } + when (data?.destination) { + "equipment" -> navController.navigate(R.id.equipmentOverviewFragment) + "customization" -> navController.navigate(R.id.composeAvatarEquipmentFragment) + "stable" -> navController.navigate(R.id.stableFragment) + "pets" -> navController.navigate(R.id.stableFragment) + "mounts" -> navController.navigate(R.id.stableFragment) + else -> navController.navigate(R.id.itemsFragment) + } + } + + private fun clickNewChatMessage( + notification: Notification, + navController: MainNavigationController + ) { + val data = notification.data as? NewChatMessageData + if (isPartyMessage(data)) { + val bundle = Bundle() + bundle.putString("groupID", data?.group?.id) + bundle.putInt("tabToOpen", 1) + navController.navigate(R.id.partyFragment, bundle) + } else { + val bundle = Bundle() + bundle.putString("groupID", data?.group?.id) + bundle.putBoolean( + "isMember", + true + ) // safe to assume user is member since they got the notification + bundle.putInt("tabToOpen", 1) + navController.navigate(R.id.guildFragment, bundle) + } + } + + private fun clickGroupInvitation( + notification: Notification, + navController: MainNavigationController + ) { + when (notification.type) { + Notification.Type.GUILD_INVITATION.type -> { + val bundle = Bundle() + val data = notification.data as? GuildInvitationData + bundle.putString("groupID", data?.invitation?.id) + bundle.putBoolean( + "isMember", + true + ) // safe to assume user is member since they got the notification + navController.navigate(R.id.guildFragment, bundle) + } + + Notification.Type.PARTY_INVITATION.type -> { + navController.navigate(R.id.partyFragment) + } + } + } + + fun accept(notificationId: String) { + val notification = findNotification(notificationId) ?: return + when (notification.type) { + Notification.Type.GUILD_INVITATION.type -> { + val data = notification.data as? GuildInvitationData + acceptGroupInvitation(data?.invitation?.id) + } + + Notification.Type.PARTY_INVITATION.type -> { + val data = notification.data as? PartyInvitationData + acceptGroupInvitation(data?.invitation?.id) + } + + Notification.Type.QUEST_INVITATION.type -> acceptQuestInvitation() + Notification.Type.GROUP_TASK_REQUIRES_APPROVAL.type -> acceptTaskApproval(notification) + } + if (isCustomNotification(notification)) { + viewModelScope.launch(ExceptionHandler.coroutine()) { + userRepository.retrieveUser() + } + } else { + dismissNotification(notification) + } + } + + fun reject(notificationId: String) { + val notification = findNotification(notificationId) ?: return + when (notification.type) { + Notification.Type.GUILD_INVITATION.type -> { + val data = notification.data as? GuildInvitationData + rejectGroupInvite(data?.invitation?.id) + } + + Notification.Type.PARTY_INVITATION.type -> { + val data = notification.data as? PartyInvitationData + rejectGroupInvite(data?.invitation?.id) + } + + Notification.Type.QUEST_INVITATION.type -> rejectQuestInvitation() + Notification.Type.GROUP_TASK_REQUIRES_APPROVAL.type -> rejectTaskApproval(notification) + } + if (!isCustomNotification(notification)) { + dismissNotification(notification) + } + } + + private fun acceptGroupInvitation(groupId: String?) { + groupId?.let { + viewModelScope.launch(ExceptionHandler.coroutine()) { + socialRepository.joinGroup(it) + refreshUser() + } + } + } + + fun rejectGroupInvite(groupId: String?) { + groupId?.let { + viewModelScope.launchCatching { + socialRepository.rejectGroupInvite(it) + refreshUser() + } + } + } + + private fun acceptQuestInvitation() { + party?.id?.let { + viewModelScope.launchCatching { + socialRepository.acceptQuest(null, it) + refreshUser() + } + } + } + + private fun rejectQuestInvitation() { + party?.id?.let { + viewModelScope.launchCatching { + socialRepository.rejectQuest(null, it) + refreshUser() + } + } + } + + private fun refreshUser() { + viewModelScope.launch(ExceptionHandler.coroutine()) { + refreshNotifications() + } + } + + private fun acceptTaskApproval(notification: Notification) { + notification.data as? GroupTaskRequiresApprovalData + } + + private fun rejectTaskApproval(notification: Notification) { + notification.data as? GroupTaskRequiresApprovalData + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt index d2288f35f..6c0110915 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt @@ -19,80 +19,80 @@ import javax.inject.Inject @HiltViewModel class PartyViewModel - @Inject - constructor( - userRepository: UserRepository, - userViewModel: MainUserViewModel, - challengeRepository: ChallengeRepository, - socialRepository: SocialRepository, - notificationsManager: NotificationsManager, - ) : GroupViewModel( - userRepository, - userViewModel, - challengeRepository, - socialRepository, - notificationsManager, - ) { - internal val isQuestActive: Boolean - get() = getGroupData().value?.quest?.active == true +@Inject +constructor( + userRepository: UserRepository, + userViewModel: MainUserViewModel, + challengeRepository: ChallengeRepository, + socialRepository: SocialRepository, + notificationsManager: NotificationsManager +) : GroupViewModel( + userRepository, + userViewModel, + challengeRepository, + socialRepository, + notificationsManager +) { + internal val isQuestActive: Boolean + get() = getGroupData().value?.quest?.active == true - internal val isUserOnQuest: Boolean - get() = - !( - getGroupData().value?.quest?.members?.none { it.key == user.value?.id } - ?: true + internal val isUserOnQuest: Boolean + get() = + !( + getGroupData().value?.quest?.members?.none { it.key == user.value?.id } + ?: true ) - internal val isUserQuestLeader: Boolean - get() = user.value?.id == getGroupData().value?.quest?.leader + internal val isUserQuestLeader: Boolean + get() = user.value?.id == getGroupData().value?.quest?.leader - @OptIn(ExperimentalCoroutinesApi::class) - private val membersFlow = - groupIDFlow - .filterNotNull() - .flatMapLatest { socialRepository.getPartyMembers(it) } - private val members = membersFlow.asLiveData() + @OptIn(ExperimentalCoroutinesApi::class) + private val membersFlow = + groupIDFlow + .filterNotNull() + .flatMapLatest { socialRepository.getPartyMembers(it) } + private val members = membersFlow.asLiveData() - init { - groupViewType = GroupViewType.PARTY - } + init { + groupViewType = GroupViewType.PARTY + } - fun getMembersData() = members + fun getMembersData() = members - fun acceptQuest() { - groupID?.let { groupID -> - viewModelScope.launchCatching { - socialRepository.acceptQuest(null, groupID) - socialRepository.retrieveGroup(groupID) - userRepository.retrieveUser() - } - } - } - - fun rejectQuest() { - groupID?.let { groupID -> - viewModelScope.launchCatching { - socialRepository.rejectQuest(null, groupID) - socialRepository.retrieveGroup(groupID) - userRepository.retrieveUser() - } - } - } - - fun showParticipantButtons(): Boolean { - val user = user.value - return !(user?.party == null || user.party?.quest == null) && !isQuestActive && user.party?.quest?.rsvpNeeded == true - } - - fun loadPartyID() { - viewModelScope.launch(ExceptionHandler.coroutine()) { - userRepository.getUser() - .map { it?.party?.id } - .distinctUntilChanged() - .filterNotNull() - .collect { - setGroupID(it) - } + fun acceptQuest() { + groupID?.let { groupID -> + viewModelScope.launchCatching { + socialRepository.acceptQuest(null, groupID) + socialRepository.retrieveGroup(groupID) + userRepository.retrieveUser() } } } + + fun rejectQuest() { + groupID?.let { groupID -> + viewModelScope.launchCatching { + socialRepository.rejectQuest(null, groupID) + socialRepository.retrieveGroup(groupID) + userRepository.retrieveUser() + } + } + } + + fun showParticipantButtons(): Boolean { + val user = user.value + return !(user?.party == null || user.party?.quest == null) && !isQuestActive && user.party?.quest?.rsvpNeeded == true + } + + fun loadPartyID() { + viewModelScope.launch(ExceptionHandler.coroutine()) { + userRepository.getUser() + .map { it?.party?.id } + .distinctUntilChanged() + .filterNotNull() + .collect { + setGroupID(it) + } + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt index 615380a63..e74da3ae6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt @@ -24,144 +24,144 @@ import javax.inject.Inject @HiltViewModel class StableViewModel - @Inject - constructor( - savedStateHandle: SavedStateHandle, - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val inventoryRepository: InventoryRepository, - ) : BaseViewModel(userRepository, userViewModel) { - internal val itemType: String? = savedStateHandle[StableRecyclerFragment.ITEM_TYPE_KEY] +@Inject +constructor( + savedStateHandle: SavedStateHandle, + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val inventoryRepository: InventoryRepository +) : BaseViewModel(userRepository, userViewModel) { + internal val itemType: String? = savedStateHandle[StableRecyclerFragment.ITEM_TYPE_KEY] - private val _items: MutableLiveData> = MutableLiveData() - val items: LiveData> = _items - val eggs: LiveData> = - inventoryRepository.getItems(Egg::class.java) - .map { - val eggMap = mutableMapOf() - it.forEach { egg -> - eggMap[egg.key] = egg as Egg - } - eggMap + private val _items: MutableLiveData> = MutableLiveData() + val items: LiveData> = _items + val eggs: LiveData> = + inventoryRepository.getItems(Egg::class.java) + .map { + val eggMap = mutableMapOf() + it.forEach { egg -> + eggMap[egg.key] = egg as Egg } - .asLiveData() - val ownedItems: LiveData> = - inventoryRepository.getOwnedItems(true).asLiveData() - val mounts: LiveData> = inventoryRepository.getMounts().asLiveData() - private val _ownedPets: MutableLiveData> = MutableLiveData() - val ownedPets: LiveData> = _ownedPets - private val _ownedMounts: MutableLiveData> = MutableLiveData() - val ownedMounts: LiveData> = _ownedMounts + eggMap + } + .asLiveData() + val ownedItems: LiveData> = + inventoryRepository.getOwnedItems(true).asLiveData() + val mounts: LiveData> = inventoryRepository.getMounts().asLiveData() + private val _ownedPets: MutableLiveData> = MutableLiveData() + val ownedPets: LiveData> = _ownedPets + private val _ownedMounts: MutableLiveData> = MutableLiveData() + val ownedMounts: LiveData> = _ownedMounts - init { - loadItems() - } + init { + loadItems() + } - private fun loadItems() { - viewModelScope.launchCatching { - val animals = - if ("pets" == itemType) { - inventoryRepository.getPets().firstOrNull() - } else { - inventoryRepository.getMounts().firstOrNull() - } ?: emptyList() + private fun loadItems() { + viewModelScope.launchCatching { + val animals = if ("pets" == itemType) { - inventoryRepository.getOwnedPets() + inventoryRepository.getPets().firstOrNull() } else { - inventoryRepository.getOwnedMounts() - }.map { - val animalMap = mutableMapOf() - it.forEach { animal -> - val castedAnimal = animal as? OwnedObject ?: return@forEach - animalMap[castedAnimal.key ?: ""] = castedAnimal - } - animalMap - }.collect { - _items.value = mapAnimals(animals, it) - } - } - viewModelScope.launchCatching { - inventoryRepository.getOwnedPets().map { ownedPets -> - val petMap = mutableMapOf() - ownedPets.forEach { petMap[it.key ?: ""] = it } - return@map petMap - }.collect { - _ownedPets.value = it - } - } - viewModelScope.launchCatching { - inventoryRepository.getOwnedMounts().map { ownedMounts -> - val mountMap = mutableMapOf() - ownedMounts.forEach { mountMap[it.key ?: ""] = it } - return@map mountMap - }.collect { - _ownedMounts.value = it + inventoryRepository.getMounts().firstOrNull() + } ?: emptyList() + if ("pets" == itemType) { + inventoryRepository.getOwnedPets() + } else { + inventoryRepository.getOwnedMounts() + }.map { + val animalMap = mutableMapOf() + it.forEach { animal -> + val castedAnimal = animal as? OwnedObject ?: return@forEach + animalMap[castedAnimal.key ?: ""] = castedAnimal } + animalMap + }.collect { + _items.value = mapAnimals(animals, it) } } - - private fun mapAnimals( - unsortedAnimals: List, - ownedAnimals: Map, - ): ArrayList { - val items = ArrayList() - var lastAnimal: Animal = unsortedAnimals.firstOrNull() ?: return items - var lastSection: StableSection? = null - for (animal in unsortedAnimals) { - val identifier = - if (animal.animal.isNotEmpty() && (animal.type != "special" && animal.type != "wacky")) animal.animal else animal.key - val lastIdentifier = lastAnimal.animal.ifEmpty { lastAnimal.key } - if (animal.type == "premium") { - if (!items.contains(lastAnimal)) { - items.add(lastAnimal) - } - lastAnimal = items.first { (it as? Animal)?.animal == animal.animal } as Animal - } else if (identifier != lastIdentifier || animal === unsortedAnimals[unsortedAnimals.size - 1]) { - if (!((lastAnimal.type == "special") && lastAnimal.numberOwned == 0) && - !items.contains( - lastAnimal, - ) - ) { - items.add(lastAnimal) - } - lastAnimal = animal - } - - if (animal.type != lastSection?.key && animal.type != "premium") { - if (items.size > 0 && items[items.size - 1].javaClass == StableSection::class.java) { - items.removeAt(items.size - 1) - } - val section = StableSection(animal.type, itemType ?: "") - items.add(section) - lastSection = section - } - val isOwned = - when (itemType) { - "pets" -> { - val ownedPet = ownedAnimals[animal.key] as? OwnedPet - (ownedPet?.trained ?: 0) > 0 - } - - "mounts" -> { - val ownedMount = ownedAnimals[animal.key] as? OwnedMount - ownedMount?.owned == true - } - - else -> false - } - lastAnimal.totalNumber += 1 - lastSection?.totalCount = (lastSection?.totalCount ?: 0) + 1 - if (isOwned) { - lastAnimal.numberOwned += 1 - lastSection?.ownedCount = (lastSection?.ownedCount ?: 0) + 1 - } + viewModelScope.launchCatching { + inventoryRepository.getOwnedPets().map { ownedPets -> + val petMap = mutableMapOf() + ownedPets.forEach { petMap[it.key ?: ""] = it } + return@map petMap + }.collect { + _ownedPets.value = it } - if (!((lastAnimal.type == "premium" || lastAnimal.type == "special") && lastAnimal.numberOwned == 0)) { - items.add(lastAnimal) + } + viewModelScope.launchCatching { + inventoryRepository.getOwnedMounts().map { ownedMounts -> + val mountMap = mutableMapOf() + ownedMounts.forEach { mountMap[it.key ?: ""] = it } + return@map mountMap + }.collect { + _ownedMounts.value = it } - - items.add(0, "header") - items.removeAll { it is StableSection && it.key == "special" && it.ownedCount == 0 } - return items } } + + private fun mapAnimals( + unsortedAnimals: List, + ownedAnimals: Map + ): ArrayList { + val items = ArrayList() + var lastAnimal: Animal = unsortedAnimals.firstOrNull() ?: return items + var lastSection: StableSection? = null + for (animal in unsortedAnimals) { + val identifier = + if (animal.animal.isNotEmpty() && (animal.type != "special" && animal.type != "wacky")) animal.animal else animal.key + val lastIdentifier = lastAnimal.animal.ifEmpty { lastAnimal.key } + if (animal.type == "premium") { + if (!items.contains(lastAnimal)) { + items.add(lastAnimal) + } + lastAnimal = items.first { (it as? Animal)?.animal == animal.animal } as Animal + } else if (identifier != lastIdentifier || animal === unsortedAnimals[unsortedAnimals.size - 1]) { + if (!((lastAnimal.type == "special") && lastAnimal.numberOwned == 0) && + !items.contains( + lastAnimal + ) + ) { + items.add(lastAnimal) + } + lastAnimal = animal + } + + if (animal.type != lastSection?.key && animal.type != "premium") { + if (items.size > 0 && items[items.size - 1].javaClass == StableSection::class.java) { + items.removeAt(items.size - 1) + } + val section = StableSection(animal.type, itemType ?: "") + items.add(section) + lastSection = section + } + val isOwned = + when (itemType) { + "pets" -> { + val ownedPet = ownedAnimals[animal.key] as? OwnedPet + (ownedPet?.trained ?: 0) > 0 + } + + "mounts" -> { + val ownedMount = ownedAnimals[animal.key] as? OwnedMount + ownedMount?.owned == true + } + + else -> false + } + lastAnimal.totalNumber += 1 + lastSection?.totalCount = (lastSection?.totalCount ?: 0) + 1 + if (isOwned) { + lastAnimal.numberOwned += 1 + lastSection?.ownedCount = (lastSection?.ownedCount ?: 0) + 1 + } + } + if (!((lastAnimal.type == "premium" || lastAnimal.type == "special") && lastAnimal.numberOwned == 0)) { + items.add(lastAnimal) + } + + items.add(0, "header") + items.removeAll { it is StableSection && it.key == "special" && it.ownedCount == 0 } + return items + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TaskFormViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TaskFormViewModel.kt index d8f81edb7..9c0ce0b35 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TaskFormViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TaskFormViewModel.kt @@ -10,14 +10,14 @@ import javax.inject.Inject @HiltViewModel class TaskFormViewModel - @Inject - constructor( - userRepository: UserRepository, - userViewModel: MainUserViewModel, - ) : BaseViewModel(userRepository, userViewModel) { - val taskDifficulty = mutableStateOf(TaskDifficulty.EASY) - val selectedAttribute = mutableStateOf(Attribute.STRENGTH) - val habitResetOption = mutableStateOf(HabitResetOption.DAILY) - val habitScoringPositive = mutableStateOf(true) - val habitScoringNegative = mutableStateOf(false) - } +@Inject +constructor( + userRepository: UserRepository, + userViewModel: MainUserViewModel +) : BaseViewModel(userRepository, userViewModel) { + val taskDifficulty = mutableStateOf(TaskDifficulty.EASY) + val selectedAttribute = mutableStateOf(Attribute.STRENGTH) + val habitResetOption = mutableStateOf(HabitResetOption.DAILY) + val habitScoringPositive = mutableStateOf(true) + val habitScoringNegative = mutableStateOf(false) +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt index cf7faafeb..8e52f6e3d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt @@ -35,356 +35,356 @@ import javax.inject.Inject @HiltViewModel class TasksViewModel - @Inject - constructor( - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val taskRepository: TaskRepository, - val tagRepository: TagRepository, - val appConfigManager: AppConfigManager, - val sharedPreferences: SharedPreferences, - val contentRepository: ContentRepository - ) : BaseViewModel(userRepository, userViewModel), GroupPlanInfoProvider { - private var owners: List> = listOf() - var canSwitchOwners = MutableLiveData() - val ownerID: MutableLiveData by lazy { - MutableLiveData() +@Inject +constructor( + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val taskRepository: TaskRepository, + val tagRepository: TagRepository, + val appConfigManager: AppConfigManager, + val sharedPreferences: SharedPreferences, + val contentRepository: ContentRepository +) : BaseViewModel(userRepository, userViewModel), GroupPlanInfoProvider { + private var owners: List> = listOf() + var canSwitchOwners = MutableLiveData() + val ownerID: MutableLiveData by lazy { + MutableLiveData() + } + var teamPlans = mapOf() + var initialPreferenceFilterSet: Boolean = false + + val isPersonalBoard: Boolean + get() { + return ownerID.value == userViewModel.userID + } + val ownerTitle: CharSequence + get() { + return owners.firstOrNull { it.first == ownerID.value }?.second ?: "" } - var teamPlans = mapOf() - var initialPreferenceFilterSet: Boolean = false - val isPersonalBoard: Boolean - get() { - return ownerID.value == userViewModel.userID - } - val ownerTitle: CharSequence - get() { - return owners.firstOrNull { it.first == ownerID.value }?.second ?: "" - } - - init { - viewModelScope.launch(ExceptionHandler.coroutine()) { - userRepository.getTeamPlans() - .collect { plans -> - teamPlans = plans.associateBy { it.id } - owners = - listOf(Pair(userViewModel.userID, userViewModel.displayName)) + + init { + viewModelScope.launch(ExceptionHandler.coroutine()) { + userRepository.getTeamPlans() + .collect { plans -> + teamPlans = plans.associateBy { it.id } + owners = + listOf(Pair(userViewModel.userID, userViewModel.displayName)) + plans.map { Pair( it.id, - it.summary, + it.summary ) } - if (owners.size > 1 && canSwitchOwners.value != false) { - canSwitchOwners.value = owners.size > 1 - } - } - } - } - - internal fun refreshData(onComplete: () -> Unit) { - viewModelScope.launch(ExceptionHandler.coroutine()) { - if (isPersonalBoard) { - userRepository.retrieveUser( - withTasks = true, - forced = true, - ) - if (activeFilters[TaskType.TODO] == Task.FILTER_COMPLETED) { - taskRepository.retrieveCompletedTodos() - } - contentRepository.retrieveWorldState() - } else { - userRepository.retrieveTeamPlan(ownerID.value ?: "") - } - onComplete() - } - } - - fun cycleOwnerIDs() { - if (owners.size <= 1) return - val nextIndex = owners.indexOfFirst { it.first == ownerID.value } + 1 - if (nextIndex < owners.size) { - ownerID.value = owners[nextIndex].first - } else { - ownerID.value = owners[0].first - } - } - - fun scoreTask( - task: Task, - direction: TaskDirection, - onResult: (TaskScoringResult, Int) -> Unit, - ) { - viewModelScope.launch(ExceptionHandler.coroutine()) { - taskRepository.taskChecked( - null, - task.id ?: "", - direction == TaskDirection.UP, - false, - ) { result -> - onResult(result, task.value.toInt()) - if (!DateUtils.isToday(sharedPreferences.getLong("last_task_reporting", 0))) { - Analytics.sendEvent( - "task scored", - EventCategory.BEHAVIOUR, - HitType.EVENT, - ) - sharedPreferences.edit { - putLong("last_task_reporting", Date().time) - } + if (owners.size > 1 && canSwitchOwners.value != false) { + canSwitchOwners.value = owners.size > 1 } } - } } + } - private val filterSets: HashMap>>> = - hashMapOf( - Pair(TaskType.HABIT, MutableLiveData()), - Pair(TaskType.DAILY, MutableLiveData()), - Pair(TaskType.TODO, MutableLiveData()), - ) - - fun getFilterSet(type: TaskType): MutableLiveData>>? { - return filterSets[type] - } - - var searchQuery: String? = null - set(value) { - field = value - filterSets.forEach { - val old = it.value.value - it.value.value = Triple(value, old?.second, old?.third ?: listOf()) - } - } - private val activeFilters = HashMap() - - var tags: MutableList = mutableListOf() - set(value) { - field = value - filterSets.forEach { - val old = it.value.value - it.value.value = Triple(old?.first, old?.second, field) - } - } - - fun addActiveTag(tagID: String) { - if (!tags.contains(tagID)) { - tags.add(tagID) - } - filterSets.forEach { - val old = it.value.value - it.value.value = Triple(old?.first, old?.second, tags) - } - } - - fun removeActiveTag(tagID: String) { - if (tags.contains(tagID)) { - tags.remove(tagID) - } - filterSets.forEach { - val old = it.value.value - it.value.value = Triple(old?.first, old?.second, tags) - } - } - - fun filterCount(type: TaskType?): Int { - return this.tags.size + if (isTaskFilterActive(type)) 1 else 0 - } - - fun isFiltering(type: TaskType?): Boolean { - return filterCount(type) > 0 - } - - private fun isTaskFilterActive(type: TaskType?): Boolean { - if (activeFilters[type] == null) { - return false - } - return if (TaskType.TODO == type) { - Task.FILTER_ACTIVE != activeFilters[type] - } else { - Task.FILTER_ALL != activeFilters[type] - } - } - - fun filter(tasks: List): List { - if (tasks.isEmpty()) { - return tasks - } - val filtered = ArrayList() - var activeFilter: String? = null - if (activeFilters.size > 0) { - activeFilter = activeFilters[tasks[0].type] - } - for (task in tasks) { - if (isFiltered(task, activeFilter)) { - filtered.add(task) - } - } - - return filtered - } - - private fun isFiltered( - task: Task, - activeFilter: String?, - ): Boolean { - if (!task.containsAllTagIds(tags)) { - return false - } - return if (activeFilter != null && activeFilter != Task.FILTER_ALL) { - when (activeFilter) { - Task.FILTER_ACTIVE -> - if (task.type == TaskType.DAILY) { - task.isDisplayedActive - } else { - !task.completed - } - - Task.FILTER_GRAY -> task.completed || !task.isDisplayedActive - Task.FILTER_WEAK -> task.value < 1 - Task.FILTER_STRONG -> task.value >= 1 - Task.FILTER_DATED -> task.dueDate != null - Task.FILTER_COMPLETED -> task.completed - else -> true - } - } else { - true - } - } - - fun setActiveFilter( - type: TaskType, - activeFilter: String, - ) { - activeFilters[type] = activeFilter - filterSets[type]?.value = Triple(searchQuery, activeFilter, tags) - - if (activeFilters[TaskType.TODO] == Task.FILTER_COMPLETED) { - viewModelScope.launchCatching { + internal fun refreshData(onComplete: () -> Unit) { + viewModelScope.launch(ExceptionHandler.coroutine()) { + if (isPersonalBoard) { + userRepository.retrieveUser( + withTasks = true, + forced = true + ) + if (activeFilters[TaskType.TODO] == Task.FILTER_COMPLETED) { taskRepository.retrieveCompletedTodos() } - } - - if (type == TaskType.DAILY) { - val isShowingDue = activeFilter == Task.FILTER_ACTIVE - if (isShowingDue != user.value?.preferences?.dailyDueDefaultView) { - viewModelScope.launchCatching { - userRepository.updateUser("preferences.dailyDueDefaultView", isShowingDue) - } - } - } - } - - fun getActiveFilter(type: TaskType?): String? { - return if (activeFilters.containsKey(type)) { - activeFilters[type] + contentRepository.retrieveWorldState() } else { - null + userRepository.retrieveTeamPlan(ownerID.value ?: "") } + onComplete() } + } - fun createQuery(unfilteredData: OrderedRealmCollection): RealmQuery? { - if (!unfilteredData.isValid) { - return null - } - var query = unfilteredData.where() + fun cycleOwnerIDs() { + if (owners.size <= 1) return + val nextIndex = owners.indexOfFirst { it.first == ownerID.value } + 1 + if (nextIndex < owners.size) { + ownerID.value = owners[nextIndex].first + } else { + ownerID.value = owners[0].first + } + } - if (unfilteredData.size != 0) { - val taskType = unfilteredData[0].type - val activeFilter = getActiveFilter(taskType) - - if (tags.size > 0) { - query = query.`in`("tags.id", tags.toTypedArray()) - } - if (searchQuery?.isNotEmpty() == true) { - query = - query - .beginGroup() - .contains("text", searchQuery ?: "", Case.INSENSITIVE) - .or() - .contains("notes", searchQuery ?: "", Case.INSENSITIVE) - .endGroup() - } - if (activeFilter != null && activeFilter != Task.FILTER_ALL) { - when (activeFilter) { - Task.FILTER_ACTIVE -> - query = - if (TaskType.DAILY == taskType) { - query.equalTo("completed", false).equalTo("isDue", true) - } else { - query.equalTo("completed", false) - } - - Task.FILTER_GRAY -> - query = - query.equalTo("completed", true).or().equalTo("isDue", false) - - Task.FILTER_WEAK -> query = query.lessThan("value", 1.0) - Task.FILTER_STRONG -> query = query.greaterThanOrEqualTo("value", 1.0) - Task.FILTER_DATED -> - query = - query.isNotNull("dueDate").equalTo("completed", false).sort("dueDate") - - Task.FILTER_COMPLETED -> query = query.equalTo("completed", true) + fun scoreTask( + task: Task, + direction: TaskDirection, + onResult: (TaskScoringResult, Int) -> Unit + ) { + viewModelScope.launch(ExceptionHandler.coroutine()) { + taskRepository.taskChecked( + null, + task.id ?: "", + direction == TaskDirection.UP, + false + ) { result -> + onResult(result, task.value.toInt()) + if (!DateUtils.isToday(sharedPreferences.getLong("last_task_reporting", 0))) { + Analytics.sendEvent( + "task scored", + EventCategory.BEHAVIOUR, + HitType.EVENT + ) + sharedPreferences.edit { + putLong("last_task_reporting", Date().time) } } - if (activeFilter != Task.FILTER_DATED) { - query = query.sort("position", Sort.ASCENDING, "dateCreated", Sort.DESCENDING) - } - } - return query - } - - override fun canScoreTask(task: Task): Boolean { - if (!task.isGroupTask) { - return true - } - return task.isAssignedToUser(userViewModel.userID) || task.group?.assignedUsers?.isEmpty() != false - } - - override suspend fun canEditTask(task: Task): Boolean { - if (!task.isGroupTask) { - return true - } - val groupID = task.group?.groupID ?: return true - val group = userRepository.getTeamPlan(groupID).firstOrNull() - return group?.hasTaskEditPrivileges(userViewModel.userID) ?: false - } - - override suspend fun canAddTasks(): Boolean { - if (isPersonalBoard) { - return true - } - val groupID = ownerID.value ?: return true - val group = userRepository.getTeamPlan(groupID).firstOrNull() - return group?.hasTaskEditPrivileges(userViewModel.userID) ?: false - } - - override fun assignedTextForTask( - resources: Resources, - assignedUsers: List, - ): String { - return if (assignedUsers.contains(userViewModel.userID)) { - if (assignedUsers.size == 1) { - resources.getString(R.string.you) - } else { - resources.getQuantityString( - R.plurals.you_x_others, - assignedUsers.size - 1, - assignedUsers.size - 1, - ) - } - } else { - if (assignedUsers.size == 1) { - userViewModel.currentTeamPlanMembers.value?.firstOrNull { it.id == assignedUsers.first() }?.displayName - ?: "" - } else { - resources.getQuantityString( - R.plurals.people, - assignedUsers.size, - assignedUsers.size, - ) - } } } } + + private val filterSets: HashMap>>> = + hashMapOf( + Pair(TaskType.HABIT, MutableLiveData()), + Pair(TaskType.DAILY, MutableLiveData()), + Pair(TaskType.TODO, MutableLiveData()) + ) + + fun getFilterSet(type: TaskType): MutableLiveData>>? { + return filterSets[type] + } + + var searchQuery: String? = null + set(value) { + field = value + filterSets.forEach { + val old = it.value.value + it.value.value = Triple(value, old?.second, old?.third ?: listOf()) + } + } + private val activeFilters = HashMap() + + var tags: MutableList = mutableListOf() + set(value) { + field = value + filterSets.forEach { + val old = it.value.value + it.value.value = Triple(old?.first, old?.second, field) + } + } + + fun addActiveTag(tagID: String) { + if (!tags.contains(tagID)) { + tags.add(tagID) + } + filterSets.forEach { + val old = it.value.value + it.value.value = Triple(old?.first, old?.second, tags) + } + } + + fun removeActiveTag(tagID: String) { + if (tags.contains(tagID)) { + tags.remove(tagID) + } + filterSets.forEach { + val old = it.value.value + it.value.value = Triple(old?.first, old?.second, tags) + } + } + + fun filterCount(type: TaskType?): Int { + return this.tags.size + if (isTaskFilterActive(type)) 1 else 0 + } + + fun isFiltering(type: TaskType?): Boolean { + return filterCount(type) > 0 + } + + private fun isTaskFilterActive(type: TaskType?): Boolean { + if (activeFilters[type] == null) { + return false + } + return if (TaskType.TODO == type) { + Task.FILTER_ACTIVE != activeFilters[type] + } else { + Task.FILTER_ALL != activeFilters[type] + } + } + + fun filter(tasks: List): List { + if (tasks.isEmpty()) { + return tasks + } + val filtered = ArrayList() + var activeFilter: String? = null + if (activeFilters.size > 0) { + activeFilter = activeFilters[tasks[0].type] + } + for (task in tasks) { + if (isFiltered(task, activeFilter)) { + filtered.add(task) + } + } + + return filtered + } + + private fun isFiltered( + task: Task, + activeFilter: String? + ): Boolean { + if (!task.containsAllTagIds(tags)) { + return false + } + return if (activeFilter != null && activeFilter != Task.FILTER_ALL) { + when (activeFilter) { + Task.FILTER_ACTIVE -> + if (task.type == TaskType.DAILY) { + task.isDisplayedActive + } else { + !task.completed + } + + Task.FILTER_GRAY -> task.completed || !task.isDisplayedActive + Task.FILTER_WEAK -> task.value < 1 + Task.FILTER_STRONG -> task.value >= 1 + Task.FILTER_DATED -> task.dueDate != null + Task.FILTER_COMPLETED -> task.completed + else -> true + } + } else { + true + } + } + + fun setActiveFilter( + type: TaskType, + activeFilter: String + ) { + activeFilters[type] = activeFilter + filterSets[type]?.value = Triple(searchQuery, activeFilter, tags) + + if (activeFilters[TaskType.TODO] == Task.FILTER_COMPLETED) { + viewModelScope.launchCatching { + taskRepository.retrieveCompletedTodos() + } + } + + if (type == TaskType.DAILY) { + val isShowingDue = activeFilter == Task.FILTER_ACTIVE + if (isShowingDue != user.value?.preferences?.dailyDueDefaultView) { + viewModelScope.launchCatching { + userRepository.updateUser("preferences.dailyDueDefaultView", isShowingDue) + } + } + } + } + + fun getActiveFilter(type: TaskType?): String? { + return if (activeFilters.containsKey(type)) { + activeFilters[type] + } else { + null + } + } + + fun createQuery(unfilteredData: OrderedRealmCollection): RealmQuery? { + if (!unfilteredData.isValid) { + return null + } + var query = unfilteredData.where() + + if (unfilteredData.size != 0) { + val taskType = unfilteredData[0].type + val activeFilter = getActiveFilter(taskType) + + if (tags.size > 0) { + query = query.`in`("tags.id", tags.toTypedArray()) + } + if (searchQuery?.isNotEmpty() == true) { + query = + query + .beginGroup() + .contains("text", searchQuery ?: "", Case.INSENSITIVE) + .or() + .contains("notes", searchQuery ?: "", Case.INSENSITIVE) + .endGroup() + } + if (activeFilter != null && activeFilter != Task.FILTER_ALL) { + when (activeFilter) { + Task.FILTER_ACTIVE -> + query = + if (TaskType.DAILY == taskType) { + query.equalTo("completed", false).equalTo("isDue", true) + } else { + query.equalTo("completed", false) + } + + Task.FILTER_GRAY -> + query = + query.equalTo("completed", true).or().equalTo("isDue", false) + + Task.FILTER_WEAK -> query = query.lessThan("value", 1.0) + Task.FILTER_STRONG -> query = query.greaterThanOrEqualTo("value", 1.0) + Task.FILTER_DATED -> + query = + query.isNotNull("dueDate").equalTo("completed", false).sort("dueDate") + + Task.FILTER_COMPLETED -> query = query.equalTo("completed", true) + } + } + if (activeFilter != Task.FILTER_DATED) { + query = query.sort("position", Sort.ASCENDING, "dateCreated", Sort.DESCENDING) + } + } + return query + } + + override fun canScoreTask(task: Task): Boolean { + if (!task.isGroupTask) { + return true + } + return task.isAssignedToUser(userViewModel.userID) || task.group?.assignedUsers?.isEmpty() != false + } + + override suspend fun canEditTask(task: Task): Boolean { + if (!task.isGroupTask) { + return true + } + val groupID = task.group?.groupID ?: return true + val group = userRepository.getTeamPlan(groupID).firstOrNull() + return group?.hasTaskEditPrivileges(userViewModel.userID) ?: false + } + + override suspend fun canAddTasks(): Boolean { + if (isPersonalBoard) { + return true + } + val groupID = ownerID.value ?: return true + val group = userRepository.getTeamPlan(groupID).firstOrNull() + return group?.hasTaskEditPrivileges(userViewModel.userID) ?: false + } + + override fun assignedTextForTask( + resources: Resources, + assignedUsers: List + ): String { + return if (assignedUsers.contains(userViewModel.userID)) { + if (assignedUsers.size == 1) { + resources.getString(R.string.you) + } else { + resources.getQuantityString( + R.plurals.you_x_others, + assignedUsers.size - 1, + assignedUsers.size - 1 + ) + } + } else { + if (assignedUsers.size == 1) { + userViewModel.currentTeamPlanMembers.value?.firstOrNull { it.id == assignedUsers.first() }?.displayName + ?: "" + } else { + resources.getQuantityString( + R.plurals.people, + assignedUsers.size, + assignedUsers.size + ) + } + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/inventory/equipment/EquipmentOverviewViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/inventory/equipment/EquipmentOverviewViewModel.kt index 27210cb97..2898d79fd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/inventory/equipment/EquipmentOverviewViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/inventory/equipment/EquipmentOverviewViewModel.kt @@ -12,25 +12,25 @@ import javax.inject.Inject @HiltViewModel class EquipmentOverviewViewModel - @Inject - constructor( - userRepository: UserRepository, - userViewModel: MainUserViewModel, - val inventoryRepository: InventoryRepository, - ) : BaseViewModel(userRepository, userViewModel) { - val usesAutoEquip: Boolean - get() = user.value?.preferences?.autoEquip == true - val usesCostume: Boolean - get() = user.value?.preferences?.costume == true +@Inject +constructor( + userRepository: UserRepository, + userViewModel: MainUserViewModel, + val inventoryRepository: InventoryRepository +) : BaseViewModel(userRepository, userViewModel) { + val usesAutoEquip: Boolean + get() = user.value?.preferences?.autoEquip == true + val usesCostume: Boolean + get() = user.value?.preferences?.costume == true - fun getGear( - key: String, - onSuccess: (Equipment) -> Unit, - ) { - viewModelScope.launchCatching { - inventoryRepository.getEquipment(key).collect { - onSuccess(it) - } + fun getGear( + key: String, + onSuccess: (Equipment) -> Unit + ) { + viewModelScope.launchCatching { + inventoryRepository.getEquipment(key).collect { + onSuccess(it) } } } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt index 82fc647d1..9d2284e2a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt @@ -49,7 +49,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.os.bundleOf import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.models.TeamPlan import com.habitrpg.android.habitica.models.auth.LocalAuthentication @@ -80,8 +79,8 @@ fun UserLevelText(user: Avatar) { user.stats?.lvl ?: 0, getTranslatedClassName( LocalContext.current.resources, - user.stats?.habitClass, - ), + user.stats?.habitClass + ) ) } else { stringResource(id = R.string.user_level, user.stats?.lvl ?: 0) @@ -90,13 +89,13 @@ fun UserLevelText(user: Avatar) { text, fontSize = 12.sp, fontWeight = FontWeight.SemiBold, - color = colorResource(R.color.text_primary), + color = colorResource(R.color.text_primary) ) } fun getTranslatedClassName( resources: Resources, - className: String?, + className: String? ): String { return when (className) { Stats.HEALER -> resources.getString(R.string.healer) @@ -109,7 +108,7 @@ fun getTranslatedClassName( fun getTranslatedClassNamePlural( resources: Resources, - className: String?, + className: String? ): String { return when (className) { Stats.HEALER -> resources.getString(R.string.healers) @@ -130,7 +129,7 @@ fun AppHeaderView( onAvatarClicked: (() -> Unit)? = null, onMemberRowClicked: () -> Unit, onClassSelectionClicked: () -> Unit, - configManager: AppConfigManager? = null, + configManager: AppConfigManager? = null ) { val isPlayerOptedOutOfClass = user?.preferences?.disableClasses ?: false Column(modifier) { @@ -143,7 +142,7 @@ fun AppHeaderView( .padding(end = 16.dp) .clickable { onAvatarClicked?.invoke() - }, + } ) val animationValue = animateFloatAsState(targetValue = if (teamPlan != null) 1f else 0f).value @@ -151,8 +150,8 @@ fun AppHeaderView( Column( Modifier.padding( bottom = (animationValue * 48f).dp, - end = (animationValue * 80f).dp, - ), + end = (animationValue * 80f).dp + ) ) { LabeledBar( icon = HabiticaIconsHelper.imageOfHeartLightBg(), @@ -161,7 +160,7 @@ fun AppHeaderView( value = user?.stats?.hp ?: 0.0, maxValue = user?.stats?.maxHealth?.toDouble() ?: 0.0, displayCompact = teamPlan != null, - modifier = Modifier.weight(1f), + modifier = Modifier.weight(1f) ) LabeledBar( icon = HabiticaIconsHelper.imageOfExperience(), @@ -172,7 +171,7 @@ fun AppHeaderView( displayCompact = teamPlan != null, abbreviateValue = false, abbreviateMax = false, - modifier = Modifier.weight(1f), + modifier = Modifier.weight(1f) ) if (user?.hasClass == true) { LabeledBar( @@ -185,11 +184,11 @@ fun AppHeaderView( abbreviateValue = false, abbreviateMax = false, modifier = - Modifier - .weight(1f) - .clickable { - MainNavigationController.navigate(R.id.skillsFragment) - }, + Modifier + .weight(1f) + .clickable { + MainNavigationController.navigate(R.id.skillsFragment) + } ) } else if ((user?.stats?.lvl ?: 0) < 10) { LabeledBar( @@ -200,7 +199,7 @@ fun AppHeaderView( maxValue = 1.0, displayCompact = teamPlan != null, disabled = true, - modifier = Modifier.weight(1f), + modifier = Modifier.weight(1f) ) } else if (user?.hasClass == false && isMyProfile && !isPlayerOptedOutOfClass) { HabiticaButton( @@ -211,11 +210,11 @@ fun AppHeaderView( }, contentPadding = PaddingValues(0.dp), fontSize = 14.sp, - modifier = Modifier.height(28.dp), + modifier = Modifier.height(28.dp) ) { Text( text = stringResource(R.string.choose_class), - color = HabiticaTheme.colors.basicTextColor(), + color = HabiticaTheme.colors.basicTextColor() ) } } else { @@ -227,34 +226,34 @@ fun AppHeaderView( visible = teamPlan != null, enter = slideInHorizontally { animWidth } + fadeIn(), exit = slideOutHorizontally { animWidth } + fadeOut(), - modifier = Modifier.align(Alignment.TopEnd), + modifier = Modifier.align(Alignment.TopEnd) ) { Row( horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically, modifier = - Modifier - .padding(start = 12.dp) - .width(72.dp) - .height(48.dp) - .clip(MaterialTheme.shapes.medium) - .background( - colorResource(R.color.window_background), + Modifier + .padding(start = 12.dp) + .width(72.dp) + .height(48.dp) + .clip(MaterialTheme.shapes.medium) + .background( + colorResource(R.color.window_background) + ) + .clickable { + MainNavigationController.navigate( + R.id.guildFragment, + bundleOf("groupID" to teamPlan?.id, "tabToOpen" to 1) ) - .clickable { - MainNavigationController.navigate( - R.id.guildFragment, - bundleOf("groupID" to teamPlan?.id, "tabToOpen" to 1), - ) - }, + } ) { Image( painterResource(R.drawable.icon_chat), null, colorFilter = - ColorFilter.tint( - colorResource(R.color.text_ternary), - ), + ColorFilter.tint( + colorResource(R.color.text_ternary) + ) ) } } @@ -263,61 +262,61 @@ fun AppHeaderView( visible = teamPlan != null, enter = slideInVertically { animHeight } + fadeIn(), exit = slideOutVertically { animHeight } + fadeOut(), - modifier = Modifier.align(Alignment.BottomCenter), + modifier = Modifier.align(Alignment.BottomCenter) ) { AnimatedContent( targetState = teamPlanMembers?.filter { it.id != user?.id }, transitionSpec = { ContentTransform( targetContentEnter = - fadeIn( - animationSpec = - tween( - 200, - easing = FastOutSlowInEasing, - ), - ) + slideInVertically { height -> height }, - initialContentExit = fadeOut(animationSpec = tween(200)) + slideOutVertically { height -> -height }, + fadeIn( + animationSpec = + tween( + 200, + easing = FastOutSlowInEasing + ) + ) + slideInVertically { height -> height }, + initialContentExit = fadeOut(animationSpec = tween(200)) + slideOutVertically { height -> -height } ) - }, + } ) { members -> Row( horizontalArrangement = - Arrangement.spacedBy( - 12.dp, - Alignment.CenterHorizontally, - ), + Arrangement.spacedBy( + 12.dp, + Alignment.CenterHorizontally + ), verticalAlignment = Alignment.CenterVertically, modifier = - Modifier - .fillMaxWidth() - .height(40.dp) - .width(72.dp) - .clip(MaterialTheme.shapes.medium) - .background( - colorResource(R.color.window_background), - ) - .padding(start = 12.dp, end = 12.dp) - .clickable { - onMemberRowClicked() - }, + Modifier + .fillMaxWidth() + .height(40.dp) + .width(72.dp) + .clip(MaterialTheme.shapes.medium) + .background( + colorResource(R.color.window_background) + ) + .padding(start = 12.dp, end = 12.dp) + .clickable { + onMemberRowClicked() + } ) { for (member in members ?.sortedByDescending { it.authentication?.timestamps?.lastLoggedIn } ?.take(6) ?: emptyList()) { Box( modifier = - Modifier - .clip(CircleShape) - .size(26.dp) - .padding(end = 6.dp, top = 4.dp), + Modifier + .clip(CircleShape) + .size(26.dp) + .padding(end = 6.dp, top = 4.dp) ) { ComposableAvatarView( avatar = member, configManager, Modifier .size(64.dp) - .requiredSize(64.dp), + .requiredSize(64.dp) ) } } @@ -328,12 +327,12 @@ fun AppHeaderView( } Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.defaultMinSize(minHeight = 28.dp), + modifier = Modifier.defaultMinSize(minHeight = 28.dp) ) { ClassIcon( className = user?.stats?.habitClass, hasClass = user?.hasClass ?: false, - modifier = Modifier.padding(4.dp), + modifier = Modifier.padding(4.dp) ) user?.let { UserLevelText(it) } Spacer(Modifier.weight(1f)) @@ -343,12 +342,12 @@ fun AppHeaderView( "hourglasses", user.hourglassCount.toDouble(), modifier = - Modifier - .padding(end = 12.dp) - .clickable { - MainNavigationController.navigate(R.id.subscriptionPurchaseActivity) - }, - decimals = 0, + Modifier + .padding(end = 12.dp) + .clickable { + MainNavigationController.navigate(R.id.subscriptionPurchaseActivity) + }, + decimals = 0 ) } CurrencyText( @@ -356,16 +355,16 @@ fun AppHeaderView( user.stats?.gp ?: 0.0, modifier = Modifier.padding(end = 12.dp), decimals = 0, - minForAbbreviation = 10000, + minForAbbreviation = 10000 ) CurrencyText( "gems", user.gemCount.toDouble(), modifier = - Modifier.clickable { - MainNavigationController.navigate(R.id.gemPurchaseActivity) - }, - decimals = 0, + Modifier.clickable { + MainNavigationController.navigate(R.id.gemPurchaseActivity) + }, + decimals = 0 ) } } @@ -434,16 +433,16 @@ private class UserProvider : PreviewParameterProvider> { @Composable @Preview private fun Preview( - @PreviewParameter(UserProvider::class) data: Pair, + @PreviewParameter(UserProvider::class) data: Pair ) { HabiticaTheme { AppHeaderView( data.first, teamPlan = data.second, modifier = - Modifier - .background(HabiticaTheme.colors.contentBackground) - .padding(8.dp), + Modifier + .background(HabiticaTheme.colors.contentBackground) + .padding(8.dp), onMemberRowClicked = { }, onClassSelectionClicked = { } ) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BackgroundScene.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BackgroundScene.kt index ecf044a23..8a06f6e29 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BackgroundScene.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BackgroundScene.kt @@ -39,7 +39,7 @@ private fun getBackgroundPainter(): ImageBitmap { Calendar.NOVEMBER -> R.drawable.stable_tile_november Calendar.DECEMBER -> R.drawable.stable_tile_december else -> R.drawable.stable_tile_may - }, + } ) } @@ -48,17 +48,17 @@ fun BackgroundScene(modifier: Modifier = Modifier) { val image = getBackgroundPainter() Canvas( modifier = - modifier - .height(124.dp) - .fillMaxWidth() - .zIndex(1f), + modifier + .height(124.dp) + .fillMaxWidth() + .zIndex(1f), onDraw = { val bitmap = Bitmap.createScaledBitmap( image.asAndroidBitmap(), image.width.dp.roundToPx(), 124.dp.roundToPx(), - false, + false ) val paint = Paint().asFrameworkPaint().apply { @@ -67,13 +67,13 @@ fun BackgroundScene(modifier: Modifier = Modifier) { ImageShader( bitmap.asImageBitmap(), TileMode.Repeated, - TileMode.Repeated, + TileMode.Repeated ) } drawIntoCanvas { it.nativeCanvas.drawPaint(paint) } paint.reset() - }, + } ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BottomSheetUtils.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BottomSheetUtils.kt index df75bfe46..9b3d6cad6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BottomSheetUtils.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BottomSheetUtils.kt @@ -4,7 +4,6 @@ import android.app.Activity import android.view.ViewGroup import androidx.activity.compose.BackHandler import androidx.compose.foundation.background -import androidx.compose.foundation.gestures.scrollable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi @@ -59,7 +58,7 @@ fun Fragment.showAsBottomSheet(content: @Composable (() -> Unit) -> Unit) { @OptIn(ExperimentalLayoutApi::class) private fun addContentToView( viewGroup: ViewGroup, - content: @Composable (() -> Unit) -> Unit, + content: @Composable (() -> Unit) -> Unit ) { viewGroup.addView( ComposeView(viewGroup.context).apply { @@ -70,7 +69,7 @@ private fun addContentToView( } } } - }, + } ) } @@ -79,7 +78,7 @@ private fun addContentToView( private fun BottomSheetWrapper( parent: ViewGroup, composeView: ComposeView, - content: @Composable (() -> Unit) -> Unit, + content: @Composable (() -> Unit) -> Unit ) { val coroutineScope = rememberCoroutineScope() val modalBottomSheetState = @@ -111,21 +110,21 @@ private fun BottomSheetWrapper( Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = - Modifier - .verticalScroll(rememberScrollState()) - .padding(horizontal = 4.dp) - .background( - HabiticaTheme.colors.windowBackground, - RoundedCornerShape(topStart = radius, topEnd = radius), - ) - .padding(vertical = 8.dp), + Modifier + .verticalScroll(rememberScrollState()) + .padding(horizontal = 4.dp) + .background( + HabiticaTheme.colors.windowBackground, + RoundedCornerShape(topStart = radius, topEnd = radius) + ) + .padding(vertical = 8.dp) ) { Box( modifier = - Modifier - .padding(bottom = 16.dp) - .background(colorResource(R.color.content_background_offset)) - .size(24.dp, 3.dp), + Modifier + .padding(bottom = 16.dp) + .background(colorResource(R.color.content_background_offset)) + .size(24.dp, 3.dp) ) content { // Action passed for clicking close button in the content @@ -133,11 +132,13 @@ private fun BottomSheetWrapper( modalBottomSheetState.hide() // will trigger the LaunchedEffect } } - Spacer(Modifier.windowInsetsBottomHeight( - WindowInsets.navigationBarsIgnoringVisibility - )) + Spacer( + Modifier.windowInsetsBottomHeight( + WindowInsets.navigationBarsIgnoringVisibility + ) + ) } - }, + } ) BackHandler { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BuffIcon.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BuffIcon.kt index 6e4218f0e..bd7521b8f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BuffIcon.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BuffIcon.kt @@ -8,7 +8,7 @@ import androidx.compose.ui.graphics.asImageBitmap @Composable fun BuffIcon( buffed: Boolean?, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { if (buffed == true) { Image(HabiticaIconsHelper.imageOfBuffIcon().asImageBitmap(), null, modifier = modifier) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ClassIcon.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ClassIcon.kt index daf20699b..efe767280 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ClassIcon.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ClassIcon.kt @@ -9,7 +9,7 @@ import androidx.compose.ui.graphics.asImageBitmap fun ClassIcon( className: String?, hasClass: Boolean, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { if (hasClass) { val icon = diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ClassText.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ClassText.kt index b08d64460..baed12e93 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ClassText.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ClassText.kt @@ -20,7 +20,7 @@ fun ClassText( hasClass: Boolean, fontSize: TextUnit, modifier: Modifier = Modifier, - iconSize: Dp? = null, + iconSize: Dp? = null ) { if (!hasClass) return val classColor = @@ -31,24 +31,24 @@ fun ClassText( "rogue" -> R.color.text_brand "healer" -> R.color.text_yellow else -> R.color.text_primary - }, + } ) Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier) { ClassIcon( className = className, hasClass = true, modifier = - Modifier.size( - iconSize ?: with(LocalDensity.current) { - fontSize.toDp() - }, - ), + Modifier.size( + iconSize ?: with(LocalDensity.current) { + fontSize.toDp() + } + ) ) Text( getTranslatedClassName(LocalContext.current.resources, className), fontSize = fontSize, fontWeight = FontWeight.SemiBold, - color = classColor, + color = classColor ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CollapsibleSectionView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CollapsibleSectionView.kt index 7c59478ca..1309d95f1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CollapsibleSectionView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CollapsibleSectionView.kt @@ -95,7 +95,7 @@ class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : l: Int, t: Int, r: Int, - b: Int, + b: Int ) { setChildMargins() super.onLayout(changed, l, t, r, b) @@ -103,7 +103,7 @@ class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : override fun onMeasure( widthMeasureSpec: Int, - heightMeasureSpec: Int, + heightMeasureSpec: Int ) { var height = 0 measureChildWithMargins( @@ -111,7 +111,7 @@ class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : widthMeasureSpec, 0, heightMeasureSpec, - height, + height ) height += binding.sectionTitleView.measuredHeight (1 until childCount) @@ -139,7 +139,7 @@ class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : attrs, R.styleable.CollapsibleSectionView, 0, - 0, + 0 ) title = attributes?.getString(R.styleable.CollapsibleSectionView_title) ?: "" identifier = attributes?.getString(R.styleable.CollapsibleSectionView_identifier) @@ -152,15 +152,15 @@ class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : if (attributes?.getBoolean( R.styleable.CollapsibleSectionView_hasAdditionalInfo, - false, + false ) == true ) { binding.infoIconView.setImageBitmap( HabiticaIconsHelper.imageOfInfoIcon( context.getThemeColor( - R.attr.colorPrimaryOffset, - ), - ), + R.attr.colorPrimaryOffset + ) + ) ) } else { binding.infoIconView.visibility = View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CompletedAt.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CompletedAt.kt index 31c6f17d6..1f04ca762 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CompletedAt.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CompletedAt.kt @@ -24,12 +24,12 @@ val completedTimeFormat: DateFormat = @Composable fun CompletedAt( - completedAt: Date?, + completedAt: Date? ) { val completedToday = completedAt?.time?.let { DateUtils.isToday(it) } ?: false Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(top = 4.dp), + modifier = Modifier.padding(top = 4.dp) ) { Image(painterResource(R.drawable.completed), null) Text( @@ -40,15 +40,15 @@ fun CompletedAt( completedTimeFormatToday.format(it) } else { completedTimeFormat.format( - it, + it ) } } - ?: "", + ?: "" ), fontSize = 14.sp, color = if (completedToday) colorResource(R.color.green_10) else colorResource(R.color.text_secondary), - modifier = Modifier.padding(start = 4.dp), + modifier = Modifier.padding(start = 4.dp) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyText.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyText.kt index 5e8768013..a9f3c104b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyText.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyText.kt @@ -26,7 +26,7 @@ fun CurrencyText( fontSize: TextUnit = 12.sp, decimals: Int = 0, minForAbbreviation: Int = 0, - animated: Boolean = true, + animated: Boolean = true ) { CurrencyText( currency = currency, @@ -35,7 +35,7 @@ fun CurrencyText( fontSize, decimals, minForAbbreviation, - animated, + animated ) } @@ -47,13 +47,13 @@ fun CurrencyText( fontSize: TextUnit = 12.sp, decimals: Int = 0, minForAbbreviation: Int = 0, - animated: Boolean = true, + animated: Boolean = true ) { val animatedValue = if (animated) { animateFloatAsState( targetValue = value.toFloat(), - animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec, + animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec ).value } else { value.toFloat() @@ -68,14 +68,14 @@ fun CurrencyText( Text( NumberAbbreviator.abbreviate(null, animatedValue, decimals, minForAbbreviation), color = - when (currency) { - "gold" -> colorResource(R.color.text_gold) - "gems" -> colorResource(R.color.text_green) - "hourglasses" -> colorResource(R.color.text_brand) - else -> colorResource(R.color.text_primary) - }, + when (currency) { + "gold" -> colorResource(R.color.text_gold) + "gems" -> colorResource(R.color.text_green) + "hourglasses" -> colorResource(R.color.text_brand) + else -> colorResource(R.color.text_primary) + }, fontSize = fontSize, - fontWeight = FontWeight.SemiBold, + fontWeight = FontWeight.SemiBold ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyView.kt index 511cb6d3b..bfd37e6ab 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyView.kt @@ -39,7 +39,7 @@ class CurrencyView : androidx.appcompat.widget.AppCompatTextView { attrs, R.styleable.CurrencyView, 0, - 0, + 0 ) val fallBackLight = !context.isUsingNightModeResources() lightBackground = @@ -111,13 +111,13 @@ class CurrencyView : androidx.appcompat.widget.AppCompatTextView { drawable, null, null, - null, + null ) val padding = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 6f, - context.resources.displayMetrics, + context.resources.displayMetrics ).toInt() compoundDrawablePadding = padding this.gravity = Gravity.CENTER_VERTICAL @@ -135,7 +135,7 @@ class CurrencyView : androidx.appcompat.widget.AppCompatTextView { context, value, decimals, - minForAbbrevation = minForAbbrevation, + minForAbbrevation = minForAbbrevation ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyViews.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyViews.kt index c3221ccfd..f25a3ee5f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyViews.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/CurrencyViews.kt @@ -59,7 +59,7 @@ class CurrencyViews : LinearLayout { attrs, R.styleable.CurrencyViews, 0, - 0, + 0 ) setupViews() val fallBackLight = !context.isUsingNightModeResources() @@ -77,7 +77,7 @@ class CurrencyViews : LinearLayout { TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 12f, - context.resources.displayMetrics, + context.resources.displayMetrics ).toInt() setupView(hourglassTextView, margin) setupView(goldTextView, margin) @@ -86,7 +86,7 @@ class CurrencyViews : LinearLayout { private fun setupView( view: CurrencyView, - margin: Int, + margin: Int ) { this.addView(view) view.textSize = 12f diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/DayNightTextView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/DayNightTextView.kt index 3c0965106..6638a27c5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/DayNightTextView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/DayNightTextView.kt @@ -15,14 +15,14 @@ class DayNightTextView(context: Context, attrs: AttributeSet?) : AppCompatTextVi if (context.isUsingNightModeResources()) { attributes?.getColor( R.styleable.DayNightTextView_nightTextColor, - ContextCompat.getColor(context, R.color.text_primary), + ContextCompat.getColor(context, R.color.text_primary) ) } else { attributes?.getColor( R.styleable.DayNightTextView_dayTextColor, - ContextCompat.getColor(context, R.color.text_primary), + ContextCompat.getColor(context, R.color.text_primary) ) - } ?: ContextCompat.getColor(context, R.color.text_primary), + } ?: ContextCompat.getColor(context, R.color.text_primary) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/DragLinearLayout.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/DragLinearLayout.kt index 841bd2ba0..558cfba79 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/DragLinearLayout.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/DragLinearLayout.kt @@ -40,517 +40,517 @@ import kotlin.math.min * declared as draggable to prevent memory leaks and/or subtle bugs. Pull requests welcome! */ open class DragLinearLayout - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - ) : LinearLayout(context, attrs) { - private val nominalDistanceScaled: Float +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null +) : LinearLayout(context, attrs) { + private val nominalDistanceScaled: Float - private var swapListener: OnViewSwapListener? = null - private val draggableChildren: SparseArray - private val draggedItem: DragItem - private val slop: Int - private var downY = -1 - private var activePointerId = INVALID_POINTER_ID - private val dragTopShadowDrawable: Drawable? - private val dragBottomShadowDrawable: Drawable? - private val dragShadowHeight: Int - private var containerScrollView: ScrollView? = null + private var swapListener: OnViewSwapListener? = null + private val draggableChildren: SparseArray + private val draggedItem: DragItem + private val slop: Int + private var downY = -1 + private var activePointerId = INVALID_POINTER_ID + private val dragTopShadowDrawable: Drawable? + private val dragBottomShadowDrawable: Drawable? + private val dragShadowHeight: Int + private var containerScrollView: ScrollView? = null + /** + * Sets the height from upper / lower edge at which a container [android.widget.ScrollView], + * if one is registered via [.setContainerScrollView], + * is scrolled. + */ + var scrollSensitiveHeight: Int = 0 + + private var dragUpdater: Runnable? = null + + /** + * Use with [com.habitrpg.android.habitica.ui.views.DragLinearLayout.setOnViewSwapListener] + * to listen for draggable view swaps. + */ + interface OnViewSwapListener { /** - * Sets the height from upper / lower edge at which a container [android.widget.ScrollView], - * if one is registered via [.setContainerScrollView], - * is scrolled. - */ - var scrollSensitiveHeight: Int = 0 - - private var dragUpdater: Runnable? = null - - /** - * Use with [com.habitrpg.android.habitica.ui.views.DragLinearLayout.setOnViewSwapListener] - * to listen for draggable view swaps. - */ - interface OnViewSwapListener { - /** - * Invoked right before the two items are swapped due to a drag event. - * After the swap, the firstView will be in the secondPosition, and vice versa. - * - * - * No guarantee is made as to which of the two has a lesser/greater position. - */ - fun onSwap( - firstView: View?, - firstPosition: Int, - secondView: View, - secondPosition: Int, - ) - } - - private class DraggableChild { - /** - * If non-null, a reference to an on-going position animation. - */ - var swapAnimation: ValueAnimator? = null - - fun endExistingAnimation() { - swapAnimation?.end() - } - - fun cancelExistingAnimation() { - swapAnimation?.cancel() - } - } - - /** - * Holds state information about the currently dragged item. + * Invoked right before the two items are swapped due to a drag event. + * After the swap, the firstView will be in the secondPosition, and vice versa. * * - * Rough lifecycle: - * * #startDetectingOnPossibleDrag - #detecting == true - * * if drag is recognised, #onDragStart - #dragging == true - * * if drag ends, #onDragStop - #dragging == false, #settling == true - * * if gesture ends without drag, or settling finishes, #stopDetecting - #detecting == false + * No guarantee is made as to which of the two has a lesser/greater position. */ - private inner class DragItem { - var view: View? = null - private var startVisibility: Int = 0 - var viewDrawable: BitmapDrawable? = null - var position: Int = 0 - var startTop: Int = 0 - var height: Int = 0 - var totalDragOffset: Int = 0 - var targetTopOffset: Int = 0 - var settleAnimation: ValueAnimator? = null + fun onSwap( + firstView: View?, + firstPosition: Int, + secondView: View, + secondPosition: Int + ) + } - var detecting: Boolean = false - var dragging: Boolean = false + private class DraggableChild { + /** + * If non-null, a reference to an on-going position animation. + */ + var swapAnimation: ValueAnimator? = null - init { - stopDetecting() - } - - fun startDetectingOnPossibleDrag( - view: View, - position: Int, - ) { - this.view = view - this.startVisibility = view.visibility - this.viewDrawable = getDragDrawable(view) - this.position = position - this.startTop = view.top - this.height = view.height - this.totalDragOffset = 0 - this.targetTopOffset = 0 - this.settleAnimation = null - - this.detecting = true - } - - fun onDragStart() { - view?.visibility = View.INVISIBLE - this.dragging = true - } - - fun setTotalOffset(offset: Int) { - totalDragOffset = offset - updateTargetTop() - } - - fun updateTargetTop() { - targetTopOffset = startTop - (view?.top ?: 0) + totalDragOffset - } - - fun onDragStop() { - this.dragging = false - } - - fun settling(): Boolean { - return null != settleAnimation - } - - fun stopDetecting() { - this.detecting = false - if (null != view) view?.visibility = startVisibility - view = null - startVisibility = -1 - viewDrawable = null - position = -1 - startTop = -1 - height = -1 - totalDragOffset = 0 - targetTopOffset = 0 - if (null != settleAnimation) settleAnimation?.end() - settleAnimation = null - } + fun endExistingAnimation() { + swapAnimation?.end() } + fun cancelExistingAnimation() { + swapAnimation?.cancel() + } + } + + /** + * Holds state information about the currently dragged item. + * + * + * Rough lifecycle: + * * #startDetectingOnPossibleDrag - #detecting == true + * * if drag is recognised, #onDragStart - #dragging == true + * * if drag ends, #onDragStop - #dragging == false, #settling == true + * * if gesture ends without drag, or settling finishes, #stopDetecting - #detecting == false + */ + private inner class DragItem { + var view: View? = null + private var startVisibility: Int = 0 + var viewDrawable: BitmapDrawable? = null + var position: Int = 0 + var startTop: Int = 0 + var height: Int = 0 + var totalDragOffset: Int = 0 + var targetTopOffset: Int = 0 + var settleAnimation: ValueAnimator? = null + + var detecting: Boolean = false + var dragging: Boolean = false + init { - - orientation = VERTICAL - - draggableChildren = SparseArray() - - draggedItem = DragItem() - val vc = ViewConfiguration.get(context) - slop = vc.scaledTouchSlop - - val resources = resources - dragTopShadowDrawable = - ContextCompat.getDrawable(context, R.drawable.ab_solid_shadow_holo_flipped) - dragBottomShadowDrawable = - ContextCompat.getDrawable(context, R.drawable.ab_solid_shadow_holo) - dragShadowHeight = resources.getDimensionPixelSize(R.dimen.downwards_drop_shadow_height) - - scrollSensitiveHeight = - (DEFAULT_SCROLL_SENSITIVE_AREA_HEIGHT_DP * resources.displayMetrics.density + 0.5f).toInt() - - nominalDistanceScaled = - (NOMINAL_DISTANCE * resources.displayMetrics.density + 0.5f).toInt().toFloat() + stopDetecting() } - override fun setOrientation(orientation: Int) { - // enforce VERTICAL orientation; remove if HORIZONTAL support is ever added - if (HORIZONTAL == orientation) { - throw IllegalArgumentException("DragLinearLayout must be VERTICAL.") - } - super.setOrientation(orientation) - } - - /** - * Makes the child a candidate for dragging. Must be an existing child of this layout. - */ - fun setViewDraggable( - child: View, - dragHandle: View, + fun startDetectingOnPossibleDrag( + view: View, + position: Int ) { - if (this === child.parent) { - dragHandle.setOnTouchListener(DragHandleOnTouchListener(child)) - draggableChildren.put(indexOfChild(child), DraggableChild()) - } else { - Log.e(LOG_TAG, "$child is not a child, cannot make draggable.") - } + this.view = view + this.startVisibility = view.visibility + this.viewDrawable = getDragDrawable(view) + this.position = position + this.startTop = view.top + this.height = view.height + this.totalDragOffset = 0 + this.targetTopOffset = 0 + this.settleAnimation = null + + this.detecting = true } - /** - * Makes the child a candidate for dragging. Must be an existing child of this layout. - */ - fun removeViewDraggable(child: View) { - if (this === child.parent) { - draggableChildren.remove(indexOfChild(child)) - draggableChildren.put(indexOfChild(child), DraggableChild()) - } + fun onDragStart() { + view?.visibility = View.INVISIBLE + this.dragging = true } - override fun removeAllViews() { - super.removeAllViews() - draggableChildren.clear() + fun setTotalOffset(offset: Int) { + totalDragOffset = offset + updateTargetTop() } - /** - * See [com.habitrpg.android.habitica.ui.views.DragLinearLayout.OnViewSwapListener]. - */ - fun setOnViewSwapListener(swapListener: OnViewSwapListener) { - this.swapListener = swapListener + fun updateTargetTop() { + targetTopOffset = startTop - (view?.top ?: 0) + totalDragOffset } - /** - * A linear relationship b/w distance and duration, bounded. - */ - private fun getTranslateAnimationDuration(distance: Float): Long { - return min( - MAX_SWITCH_DURATION, - max( - MIN_SWITCH_DURATION, - (NOMINAL_SWITCH_DURATION * abs(distance) / nominalDistanceScaled).toLong(), - ), + fun onDragStop() { + this.dragging = false + } + + fun settling(): Boolean { + return null != settleAnimation + } + + fun stopDetecting() { + this.detecting = false + if (null != view) view?.visibility = startVisibility + view = null + startVisibility = -1 + viewDrawable = null + position = -1 + startTop = -1 + height = -1 + totalDragOffset = 0 + targetTopOffset = 0 + if (null != settleAnimation) settleAnimation?.end() + settleAnimation = null + } + } + + init { + + orientation = VERTICAL + + draggableChildren = SparseArray() + + draggedItem = DragItem() + val vc = ViewConfiguration.get(context) + slop = vc.scaledTouchSlop + + val resources = resources + dragTopShadowDrawable = + ContextCompat.getDrawable(context, R.drawable.ab_solid_shadow_holo_flipped) + dragBottomShadowDrawable = + ContextCompat.getDrawable(context, R.drawable.ab_solid_shadow_holo) + dragShadowHeight = resources.getDimensionPixelSize(R.dimen.downwards_drop_shadow_height) + + scrollSensitiveHeight = + (DEFAULT_SCROLL_SENSITIVE_AREA_HEIGHT_DP * resources.displayMetrics.density + 0.5f).toInt() + + nominalDistanceScaled = + (NOMINAL_DISTANCE * resources.displayMetrics.density + 0.5f).toInt().toFloat() + } + + override fun setOrientation(orientation: Int) { + // enforce VERTICAL orientation; remove if HORIZONTAL support is ever added + if (HORIZONTAL == orientation) { + throw IllegalArgumentException("DragLinearLayout must be VERTICAL.") + } + super.setOrientation(orientation) + } + + /** + * Makes the child a candidate for dragging. Must be an existing child of this layout. + */ + fun setViewDraggable( + child: View, + dragHandle: View + ) { + if (this === child.parent) { + dragHandle.setOnTouchListener(DragHandleOnTouchListener(child)) + draggableChildren.put(indexOfChild(child), DraggableChild()) + } else { + Log.e(LOG_TAG, "$child is not a child, cannot make draggable.") + } + } + + /** + * Makes the child a candidate for dragging. Must be an existing child of this layout. + */ + fun removeViewDraggable(child: View) { + if (this === child.parent) { + draggableChildren.remove(indexOfChild(child)) + draggableChildren.put(indexOfChild(child), DraggableChild()) + } + } + + override fun removeAllViews() { + super.removeAllViews() + draggableChildren.clear() + } + + /** + * See [com.habitrpg.android.habitica.ui.views.DragLinearLayout.OnViewSwapListener]. + */ + fun setOnViewSwapListener(swapListener: OnViewSwapListener) { + this.swapListener = swapListener + } + + /** + * A linear relationship b/w distance and duration, bounded. + */ + private fun getTranslateAnimationDuration(distance: Float): Long { + return min( + MAX_SWITCH_DURATION, + max( + MIN_SWITCH_DURATION, + (NOMINAL_SWITCH_DURATION * abs(distance) / nominalDistanceScaled).toLong() ) + ) + } + + /** + * Initiates a new [.draggedItem] unless the current one is still + * [com.habitrpg.android.habitica.ui.views.DragLinearLayout.DragItem.detecting]. + */ + private fun startDetectingDrag(child: View) { + if (draggedItem.detecting) { + return // existing drag in process, only one at a time is allowed } - /** - * Initiates a new [.draggedItem] unless the current one is still - * [com.habitrpg.android.habitica.ui.views.DragLinearLayout.DragItem.detecting]. - */ - private fun startDetectingDrag(child: View) { - if (draggedItem.detecting) { - return // existing drag in process, only one at a time is allowed + val position = indexOfChild(child) + + // complete any existing animations, both for the newly selected child and the previous dragged one + draggableChildren.get(position).endExistingAnimation() + + draggedItem.startDetectingOnPossibleDrag(child, position) + containerScrollView?.requestDisallowInterceptTouchEvent(true) + } + + private fun startDrag() { + // remove layout transition, it conflicts with drag animation + // we will restore it after drag animation end, see onDragStop() + layoutTransition = layoutTransition + if (layoutTransition != null) { + layoutTransition = null + } + + draggedItem.onDragStart() + requestDisallowInterceptTouchEvent(true) + } + + /** + * Animates the dragged item to its final resting position. + */ + private fun onDragStop() { + draggedItem.settleAnimation = + ValueAnimator.ofFloat( + draggedItem.totalDragOffset.toFloat(), + (draggedItem.totalDragOffset - draggedItem.targetTopOffset).toFloat() + ) + .setDuration(getTranslateAnimationDuration(draggedItem.targetTopOffset.toFloat())) + draggedItem.settleAnimation?.addUpdateListener( + ValueAnimator.AnimatorUpdateListener { animation -> + if (!draggedItem.detecting) return@AnimatorUpdateListener // already stopped + + draggedItem.setTotalOffset((animation.animatedValue as? Float)?.toInt() ?: 0) + + val shadowAlpha = ((1 - animation.animatedFraction) * 255).toInt() + if (null != dragTopShadowDrawable) dragTopShadowDrawable.alpha = shadowAlpha + dragBottomShadowDrawable?.alpha = shadowAlpha + invalidate() } + ) + draggedItem.settleAnimation?.addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationStart(animation: Animator) { + draggedItem.onDragStop() + } - val position = indexOfChild(child) + override fun onAnimationEnd(animation: Animator) { + if (!draggedItem.detecting) { + return // already stopped + } - // complete any existing animations, both for the newly selected child and the previous dragged one - draggableChildren.get(position).endExistingAnimation() + draggedItem.settleAnimation = null + draggedItem.stopDetecting() - draggedItem.startDetectingOnPossibleDrag(child, position) - containerScrollView?.requestDisallowInterceptTouchEvent(true) - } + if (null != dragTopShadowDrawable) dragTopShadowDrawable.alpha = 255 + dragBottomShadowDrawable?.alpha = 255 - private fun startDrag() { - // remove layout transition, it conflicts with drag animation - // we will restore it after drag animation end, see onDragStop() - layoutTransition = layoutTransition - if (layoutTransition != null) { - layoutTransition = null + // restore layout transition + if (layoutTransition != null && layoutTransition == null) { + layoutTransition = layoutTransition + } + } } + ) + draggedItem.settleAnimation?.start() + } - draggedItem.onDragStart() - requestDisallowInterceptTouchEvent(true) - } + /** + * Updates the dragged item with the given total offset from its starting position. + * Evaluates and executes draggable view swaps. + */ + private fun onDrag(offset: Int) { + draggedItem.setTotalOffset(offset) + invalidate() - /** - * Animates the dragged item to its final resting position. - */ - private fun onDragStop() { - draggedItem.settleAnimation = - ValueAnimator.ofFloat( - draggedItem.totalDragOffset.toFloat(), - (draggedItem.totalDragOffset - draggedItem.targetTopOffset).toFloat(), + val currentTop = draggedItem.startTop + draggedItem.totalDragOffset + + handleContainerScroll(currentTop) + + val belowPosition = nextDraggablePosition(draggedItem.position) + val abovePosition = previousDraggablePosition(draggedItem.position) + + val belowView = getChildAt(belowPosition) + val aboveView = getChildAt(abovePosition) + + val isBelow = + belowView != null && currentTop + draggedItem.height > belowView.top + belowView.height / 2 + val isAbove = aboveView != null && currentTop < aboveView.top + aboveView.height / 2 + + if (isBelow || isAbove) { + val switchView = if (isBelow) belowView else aboveView + + // swap elements + val originalPosition = draggedItem.position + val switchPosition = if (isBelow) belowPosition else abovePosition + + draggableChildren.get(switchPosition).cancelExistingAnimation() + val switchViewStartY = switchView.y + + if (null != swapListener) { + swapListener?.onSwap( + draggedItem.view, + draggedItem.position, + switchView, + switchPosition ) - .setDuration(getTranslateAnimationDuration(draggedItem.targetTopOffset.toFloat())) - draggedItem.settleAnimation?.addUpdateListener( - ValueAnimator.AnimatorUpdateListener { animation -> - if (!draggedItem.detecting) return@AnimatorUpdateListener // already stopped + } - draggedItem.setTotalOffset((animation.animatedValue as? Float)?.toInt() ?: 0) + if (isBelow) { + removeViewAt(originalPosition) + removeViewAt(switchPosition - 1) - val shadowAlpha = ((1 - animation.animatedFraction) * 255).toInt() - if (null != dragTopShadowDrawable) dragTopShadowDrawable.alpha = shadowAlpha - dragBottomShadowDrawable?.alpha = shadowAlpha - invalidate() - }, - ) - draggedItem.settleAnimation?.addListener( - object : AnimatorListenerAdapter() { - override fun onAnimationStart(animation: Animator) { - draggedItem.onDragStop() - } + addView(belowView, originalPosition) + addView(draggedItem.view, switchPosition) + } else { + removeViewAt(switchPosition) + removeViewAt(originalPosition - 1) - override fun onAnimationEnd(animation: Animator) { - if (!draggedItem.detecting) { - return // already stopped - } + addView(draggedItem.view, switchPosition) + addView(aboveView, originalPosition) + } + draggedItem.position = switchPosition - draggedItem.settleAnimation = null - draggedItem.stopDetecting() + val switchViewObserver = switchView.viewTreeObserver + switchViewObserver.addOnPreDrawListener( + object : OnPreDrawListener { + override fun onPreDraw(): Boolean { + switchViewObserver.removeOnPreDrawListener(this) - if (null != dragTopShadowDrawable) dragTopShadowDrawable.alpha = 255 - dragBottomShadowDrawable?.alpha = 255 - - // restore layout transition - if (layoutTransition != null && layoutTransition == null) { - layoutTransition = layoutTransition - } - } - }, - ) - draggedItem.settleAnimation?.start() - } - - /** - * Updates the dragged item with the given total offset from its starting position. - * Evaluates and executes draggable view swaps. - */ - private fun onDrag(offset: Int) { - draggedItem.setTotalOffset(offset) - invalidate() - - val currentTop = draggedItem.startTop + draggedItem.totalDragOffset - - handleContainerScroll(currentTop) - - val belowPosition = nextDraggablePosition(draggedItem.position) - val abovePosition = previousDraggablePosition(draggedItem.position) - - val belowView = getChildAt(belowPosition) - val aboveView = getChildAt(abovePosition) - - val isBelow = - belowView != null && currentTop + draggedItem.height > belowView.top + belowView.height / 2 - val isAbove = aboveView != null && currentTop < aboveView.top + aboveView.height / 2 - - if (isBelow || isAbove) { - val switchView = if (isBelow) belowView else aboveView - - // swap elements - val originalPosition = draggedItem.position - val switchPosition = if (isBelow) belowPosition else abovePosition - - draggableChildren.get(switchPosition).cancelExistingAnimation() - val switchViewStartY = switchView.y - - if (null != swapListener) { - swapListener?.onSwap( - draggedItem.view, - draggedItem.position, - switchView, - switchPosition, - ) - } - - if (isBelow) { - removeViewAt(originalPosition) - removeViewAt(switchPosition - 1) - - addView(belowView, originalPosition) - addView(draggedItem.view, switchPosition) - } else { - removeViewAt(switchPosition) - removeViewAt(originalPosition - 1) - - addView(draggedItem.view, switchPosition) - addView(aboveView, originalPosition) - } - draggedItem.position = switchPosition - - val switchViewObserver = switchView.viewTreeObserver - switchViewObserver.addOnPreDrawListener( - object : OnPreDrawListener { - override fun onPreDraw(): Boolean { - switchViewObserver.removeOnPreDrawListener(this) - - val switchAnimator = - ObjectAnimator.ofFloat( - switchView, - "y", - switchViewStartY, - switchView.top.toFloat(), - ) - .setDuration(getTranslateAnimationDuration(switchView.top - switchViewStartY)) - switchAnimator.addListener( - object : AnimatorListenerAdapter() { - override fun onAnimationStart(animation: Animator) { - draggableChildren.get(originalPosition).swapAnimation = switchAnimator - } - - override fun onAnimationEnd(animation: Animator) { - draggableChildren.get(originalPosition).swapAnimation = null - } - }, + val switchAnimator = + ObjectAnimator.ofFloat( + switchView, + "y", + switchViewStartY, + switchView.top.toFloat() ) - switchAnimator.start() + .setDuration(getTranslateAnimationDuration(switchView.top - switchViewStartY)) + switchAnimator.addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationStart(animation: Animator) { + draggableChildren.get(originalPosition).swapAnimation = switchAnimator + } - return true - } - }, - ) - - val observer = draggedItem.view!!.viewTreeObserver - observer.addOnPreDrawListener( - object : OnPreDrawListener { - override fun onPreDraw(): Boolean { - observer.removeOnPreDrawListener(this) - draggedItem.updateTargetTop() - - // TODO test if still necessary.. - // because draggedItem#view#getTop() is only up-to-date NOW - // (and not right after the #addView() swaps above) - // we may need to update an ongoing settle animation - if (draggedItem.settling()) { - Log.d(LOG_TAG, "Updating settle animation") - draggedItem.settleAnimation!!.removeAllListeners() - draggedItem.settleAnimation!!.cancel() - onDragStop() + override fun onAnimationEnd(animation: Animator) { + draggableChildren.get(originalPosition).swapAnimation = null + } } - return true + ) + switchAnimator.start() + + return true + } + } + ) + + val observer = draggedItem.view!!.viewTreeObserver + observer.addOnPreDrawListener( + object : OnPreDrawListener { + override fun onPreDraw(): Boolean { + observer.removeOnPreDrawListener(this) + draggedItem.updateTargetTop() + + // TODO test if still necessary.. + // because draggedItem#view#getTop() is only up-to-date NOW + // (and not right after the #addView() swaps above) + // we may need to update an ongoing settle animation + if (draggedItem.settling()) { + Log.d(LOG_TAG, "Updating settle animation") + draggedItem.settleAnimation!!.removeAllListeners() + draggedItem.settleAnimation!!.cancel() + onDragStop() } - }, - ) - } + return true + } + } + ) } + } - private fun previousDraggablePosition(position: Int): Int { - val startIndex = draggableChildren.indexOfKey(position) - return if (startIndex < 1 || startIndex > draggableChildren.size()) { - -1 - } else { - draggableChildren.keyAt( - startIndex - 1, - ) - } + private fun previousDraggablePosition(position: Int): Int { + val startIndex = draggableChildren.indexOfKey(position) + return if (startIndex < 1 || startIndex > draggableChildren.size()) { + -1 + } else { + draggableChildren.keyAt( + startIndex - 1 + ) } + } - private fun nextDraggablePosition(position: Int): Int { - val startIndex = draggableChildren.indexOfKey(position) - return if (startIndex < -1 || startIndex > draggableChildren.size() - 2) { - -1 - } else { - draggableChildren.keyAt( - startIndex + 1, - ) - } + private fun nextDraggablePosition(position: Int): Int { + val startIndex = draggableChildren.indexOfKey(position) + return if (startIndex < -1 || startIndex > draggableChildren.size() - 2) { + -1 + } else { + draggableChildren.keyAt( + startIndex + 1 + ) } + } - private fun handleContainerScroll(currentTop: Int) { - if (null != containerScrollView) { - val startScrollY = containerScrollView!!.scrollY - val absTop = top - startScrollY + currentTop - val height = containerScrollView!!.height + private fun handleContainerScroll(currentTop: Int) { + if (null != containerScrollView) { + val startScrollY = containerScrollView!!.scrollY + val absTop = top - startScrollY + currentTop + val height = containerScrollView!!.height - val delta: Int = - when { - absTop < scrollSensitiveHeight -> { - ( - -MAX_DRAG_SCROLL_SPEED * - smootherStep( - scrollSensitiveHeight.toFloat(), - 0f, - absTop.toFloat(), - ) + val delta: Int = + when { + absTop < scrollSensitiveHeight -> { + ( + -MAX_DRAG_SCROLL_SPEED * + smootherStep( + scrollSensitiveHeight.toFloat(), + 0f, + absTop.toFloat() + ) ).toInt() - } - - absTop > height - scrollSensitiveHeight -> { - ( - MAX_DRAG_SCROLL_SPEED * - smootherStep( - (height - scrollSensitiveHeight).toFloat(), - height.toFloat(), - absTop.toFloat(), - ) - ).toInt() - } - - else -> { - 0 - } } - containerScrollView?.removeCallbacks(dragUpdater) - containerScrollView?.smoothScrollBy(0, delta) - dragUpdater = - Runnable { - if (draggedItem.dragging && startScrollY != containerScrollView!!.scrollY) { - onDrag(draggedItem.totalDragOffset + delta) - } + absTop > height - scrollSensitiveHeight -> { + ( + MAX_DRAG_SCROLL_SPEED * + smootherStep( + (height - scrollSensitiveHeight).toFloat(), + height.toFloat(), + absTop.toFloat() + ) + ).toInt() } - containerScrollView?.post(dragUpdater) - } - } - override fun dispatchDraw(canvas: Canvas) { - super.dispatchDraw(canvas) - - if (draggedItem.detecting && (draggedItem.dragging || draggedItem.settling())) { - canvas.save() - canvas.translate(0f, draggedItem.totalDragOffset.toFloat()) - draggedItem.viewDrawable?.draw(canvas) - - val left = draggedItem.viewDrawable?.bounds?.left ?: 0 - val right = draggedItem.viewDrawable?.bounds?.right ?: 0 - val top = draggedItem.viewDrawable?.bounds?.top ?: 0 - val bottom = draggedItem.viewDrawable?.bounds?.bottom ?: 0 - - dragBottomShadowDrawable?.setBounds(left, bottom, right, bottom + dragShadowHeight) - dragBottomShadowDrawable?.draw(canvas) - - if (null != dragTopShadowDrawable) { - dragTopShadowDrawable.setBounds(left, top - dragShadowHeight, right, top) - dragTopShadowDrawable.draw(canvas) + else -> { + 0 + } } - canvas.restore() - } + containerScrollView?.removeCallbacks(dragUpdater) + containerScrollView?.smoothScrollBy(0, delta) + dragUpdater = + Runnable { + if (draggedItem.dragging && startScrollY != containerScrollView!!.scrollY) { + onDrag(draggedItem.totalDragOffset + delta) + } + } + containerScrollView?.post(dragUpdater) } + } + + override fun dispatchDraw(canvas: Canvas) { + super.dispatchDraw(canvas) + + if (draggedItem.detecting && (draggedItem.dragging || draggedItem.settling())) { + canvas.save() + canvas.translate(0f, draggedItem.totalDragOffset.toFloat()) + draggedItem.viewDrawable?.draw(canvas) + + val left = draggedItem.viewDrawable?.bounds?.left ?: 0 + val right = draggedItem.viewDrawable?.bounds?.right ?: 0 + val top = draggedItem.viewDrawable?.bounds?.top ?: 0 + val bottom = draggedItem.viewDrawable?.bounds?.bottom ?: 0 + + dragBottomShadowDrawable?.setBounds(left, bottom, right, bottom + dragShadowHeight) + dragBottomShadowDrawable?.draw(canvas) + + if (null != dragTopShadowDrawable) { + dragTopShadowDrawable.setBounds(left, top - dragShadowHeight, right, top) + dragTopShadowDrawable.draw(canvas) + } + + canvas.restore() + } + } /* * Note regarding touch handling: @@ -578,95 +578,84 @@ open class DragLinearLayout * triggers #onTouchEnd and the draggedItem, if detecting, is #stopDetecting. */ - override fun onInterceptTouchEvent(event: MotionEvent): Boolean { - when (event.action) { - MotionEvent.ACTION_DOWN -> { - if (draggedItem.detecting) return false // an existing item is (likely) settling - downY = event.y.toInt() - activePointerId = event.getPointerId(0) - } - - MotionEvent.ACTION_MOVE -> { - if (!draggedItem.detecting) return false - if (INVALID_POINTER_ID == activePointerId) return false - val y = event.y - val dy = y - downY - if (abs(dy) > slop) { - startDrag() - return true - } - return false - } - - MotionEvent.ACTION_POINTER_UP -> { - run { - val pointerIndex = event.actionIndex - val pointerId = event.getPointerId(pointerIndex) - - if (pointerId != activePointerId) { - return false // if active pointer, fall through and cancel! - } - } - run { - onTouchEnd() - - if (draggedItem.detecting) draggedItem.stopDetecting() - return false - } - } - - MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { - onTouchEnd() - if (draggedItem.detecting) draggedItem.stopDetecting() - } + override fun onInterceptTouchEvent(event: MotionEvent): Boolean { + when (event.action) { + MotionEvent.ACTION_DOWN -> { + if (draggedItem.detecting) return false // an existing item is (likely) settling + downY = event.y.toInt() + activePointerId = event.getPointerId(0) } - return false - } - - override fun onTouchEvent(event: MotionEvent): Boolean { - when (event.actionMasked) { - MotionEvent.ACTION_DOWN -> { - if (!draggedItem.detecting || draggedItem.settling()) return false + MotionEvent.ACTION_MOVE -> { + if (!draggedItem.detecting) return false + if (INVALID_POINTER_ID == activePointerId) return false + val y = event.y + val dy = y - downY + if (abs(dy) > slop) { startDrag() return true } + return false + } - MotionEvent.ACTION_MOVE -> { - if (!draggedItem.dragging) return false - if (INVALID_POINTER_ID == activePointerId) return false + MotionEvent.ACTION_POINTER_UP -> { + run { + val pointerIndex = event.actionIndex + val pointerId = event.getPointerId(pointerIndex) - val pointerIndex = event.findPointerIndex(activePointerId) - val lastEventY = event.getY(pointerIndex).toInt() - val deltaY = lastEventY - downY - - onDrag(deltaY) - return true - } - - MotionEvent.ACTION_POINTER_UP -> { - run { - val pointerIndex = event.actionIndex - val pointerId = event.getPointerId(pointerIndex) - - if (pointerId != activePointerId) { - return false // if active pointer, fall through and cancel! - } - } - run { - onTouchEnd() - - if (draggedItem.dragging) { - onDragStop() - } else if (draggedItem.detecting) { - draggedItem.stopDetecting() - } - return true + if (pointerId != activePointerId) { + return false // if active pointer, fall through and cancel! } } - - MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { + run { onTouchEnd() + + if (draggedItem.detecting) draggedItem.stopDetecting() + return false + } + } + + MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { + onTouchEnd() + if (draggedItem.detecting) draggedItem.stopDetecting() + } + } + + return false + } + + override fun onTouchEvent(event: MotionEvent): Boolean { + when (event.actionMasked) { + MotionEvent.ACTION_DOWN -> { + if (!draggedItem.detecting || draggedItem.settling()) return false + startDrag() + return true + } + + MotionEvent.ACTION_MOVE -> { + if (!draggedItem.dragging) return false + if (INVALID_POINTER_ID == activePointerId) return false + + val pointerIndex = event.findPointerIndex(activePointerId) + val lastEventY = event.getY(pointerIndex).toInt() + val deltaY = lastEventY - downY + + onDrag(deltaY) + return true + } + + MotionEvent.ACTION_POINTER_UP -> { + run { + val pointerIndex = event.actionIndex + val pointerId = event.getPointerId(pointerIndex) + + if (pointerId != activePointerId) { + return false // if active pointer, fall through and cancel! + } + } + run { + onTouchEnd() + if (draggedItem.dragging) { onDragStop() } else if (draggedItem.detecting) { @@ -675,72 +664,83 @@ open class DragLinearLayout return true } } + + MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { + onTouchEnd() + if (draggedItem.dragging) { + onDragStop() + } else if (draggedItem.detecting) { + draggedItem.stopDetecting() + } + return true + } + } + return false + } + + private fun onTouchEnd() { + downY = -1 + activePointerId = INVALID_POINTER_ID + } + + private inner class DragHandleOnTouchListener(private val view: View) : OnTouchListener { + override fun onTouch( + v: View, + event: MotionEvent + ): Boolean { + view.performClick() + if (MotionEvent.ACTION_DOWN == event.actionMasked) { + startDetectingDrag(view) + } return false } + } - private fun onTouchEnd() { - downY = -1 - activePointerId = INVALID_POINTER_ID + private fun getDragDrawable(view: View): BitmapDrawable { + val top = view.top + val left = view.left + + val bitmap = getBitmapFromView(view) + + val drawable = BitmapDrawable(resources, bitmap) + + drawable.bounds = Rect(left, top, left + view.width, top + view.height) + + return drawable + } + + companion object { + private val LOG_TAG = DragLinearLayout::class.java.simpleName + private const val NOMINAL_SWITCH_DURATION: Long = 150 + private const val MIN_SWITCH_DURATION = NOMINAL_SWITCH_DURATION + private const val MAX_SWITCH_DURATION = NOMINAL_SWITCH_DURATION * 2 + private const val NOMINAL_DISTANCE = 20f + + private const val INVALID_POINTER_ID = -1 + private const val DEFAULT_SCROLL_SENSITIVE_AREA_HEIGHT_DP = 48 + private const val MAX_DRAG_SCROLL_SPEED = 16 + + /** + * By Ken Perlin. See [Smoothstep - Wikipedia](http://en.wikipedia.org/wiki/Smoothstep). + */ + private fun smootherStep( + edge1: Float, + edge2: Float, + `val`: Float + ): Float { + var value = `val` + value = max(0f, min((value - edge1) / (edge2 - edge1), 1f)) + return value * value * value * (value * (value * 6 - 15) + 10) } - private inner class DragHandleOnTouchListener(private val view: View) : OnTouchListener { - override fun onTouch( - v: View, - event: MotionEvent, - ): Boolean { - view.performClick() - if (MotionEvent.ACTION_DOWN == event.actionMasked) { - startDetectingDrag(view) - } - return false - } - } - - private fun getDragDrawable(view: View): BitmapDrawable { - val top = view.top - val left = view.left - - val bitmap = getBitmapFromView(view) - - val drawable = BitmapDrawable(resources, bitmap) - - drawable.bounds = Rect(left, top, left + view.width, top + view.height) - - return drawable - } - - companion object { - private val LOG_TAG = DragLinearLayout::class.java.simpleName - private const val NOMINAL_SWITCH_DURATION: Long = 150 - private const val MIN_SWITCH_DURATION = NOMINAL_SWITCH_DURATION - private const val MAX_SWITCH_DURATION = NOMINAL_SWITCH_DURATION * 2 - private const val NOMINAL_DISTANCE = 20f - - private const val INVALID_POINTER_ID = -1 - private const val DEFAULT_SCROLL_SENSITIVE_AREA_HEIGHT_DP = 48 - private const val MAX_DRAG_SCROLL_SPEED = 16 - - /** - * By Ken Perlin. See [Smoothstep - Wikipedia](http://en.wikipedia.org/wiki/Smoothstep). - */ - private fun smootherStep( - edge1: Float, - edge2: Float, - `val`: Float, - ): Float { - var value = `val` - value = max(0f, min((value - edge1) / (edge2 - edge1), 1f)) - return value * value * value * (value * (value * 6 - 15) + 10) - } - - /** - * @return a bitmap showing a screenshot of the view passed in. - */ - private fun getBitmapFromView(view: View): Bitmap { - val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888) - val canvas = Canvas(bitmap) - view.draw(canvas) - return bitmap - } + /** + * @return a bitmap showing a screenshot of the view passed in. + */ + private fun getBitmapFromView(view: View): Bitmap { + val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888) + val canvas = Canvas(bitmap) + view.draw(canvas) + return bitmap } } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EllipsisTextView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EllipsisTextView.kt index bbb345af2..f40b4bc8d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EllipsisTextView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EllipsisTextView.kt @@ -33,7 +33,7 @@ class EllipsisTextView : AppCompatTextView { constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( context, attrs, - defStyle, + defStyle ) fun addEllipsesListener(listener: EllipsisListener?) { @@ -55,7 +55,7 @@ class EllipsisTextView : AppCompatTextView { l: Int, t: Int, r: Int, - b: Int, + b: Int ) { super.layout(l, t, r, b) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ExtraLabelPreference.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ExtraLabelPreference.kt index c09a0734b..6e007a492 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ExtraLabelPreference.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ExtraLabelPreference.kt @@ -9,7 +9,7 @@ import com.habitrpg.android.habitica.R class ExtraLabelPreference( context: Context, - attrs: AttributeSet?, + attrs: AttributeSet? ) : Preference(context, attrs) { var extraText: String? = null var extraTextColor: Int? = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FlowLayout.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FlowLayout.kt index 8665d051d..5343e17cb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FlowLayout.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FlowLayout.kt @@ -28,7 +28,7 @@ fun flowLayoutMeasurePolicy(spacing: Int = 0) = } placeable.placeRelative( x = xPos, - y = yPos, + y = yPos ) xPos += placeable.width if (maxY < placeable.height) { @@ -42,12 +42,12 @@ fun flowLayoutMeasurePolicy(spacing: Int = 0) = fun FlowLayout( modifier: Modifier = Modifier, spacing: Int = 0, - content: @Composable () -> Unit, + content: @Composable () -> Unit ) { val measurePolicy = flowLayoutMeasurePolicy(spacing) Layout( measurePolicy = measurePolicy, content = content, - modifier = modifier, + modifier = modifier ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/GroupPlanMemberList.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/GroupPlanMemberList.kt index 3cdecc370..b8f66cf85 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/GroupPlanMemberList.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/GroupPlanMemberList.kt @@ -44,7 +44,7 @@ fun GroupPlanMemberList( members: List?, group: Group?, configManager: AppConfigManager, - onMemberClicked: (String) -> Unit, + onMemberClicked: (String) -> Unit ) { LazyColumn { item { @@ -55,9 +55,9 @@ fun GroupPlanMemberList( color = HabiticaTheme.colors.textTertiary, textAlign = TextAlign.Center, modifier = - Modifier - .fillMaxWidth() - .padding(bottom = 20.dp), + Modifier + .fillMaxWidth() + .padding(bottom = 20.dp) ) } for ( @@ -78,7 +78,7 @@ fun GroupPlanMemberList( role, onMemberClicked, configManager = configManager, - modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), + modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp) ) } } @@ -91,7 +91,7 @@ fun MemberItem( role: String, onMemberClicked: (String) -> Unit, modifier: Modifier = Modifier, - configManager: AppConfigManager? = null, + configManager: AppConfigManager? = null ) { Box( modifier @@ -100,56 +100,56 @@ fun MemberItem( .background(HabiticaTheme.colors.windowBackground) .clickable { onMemberClicked(member.id) - }, + } ) { Row( horizontalArrangement = Arrangement.spacedBy(10.dp), - modifier = Modifier.padding(8.dp), + modifier = Modifier.padding(8.dp) ) { ComposableAvatarView( avatar = member, configManager = configManager, modifier = - Modifier - .padding(6.dp) - .size(94.dp, 98.dp), + Modifier + .padding(6.dp) + .size(94.dp, 98.dp) ) Column( verticalArrangement = Arrangement.SpaceBetween, modifier = - Modifier - .height(104.dp) - .padding(end = 6.dp), + Modifier + .height(104.dp) + .padding(end = 6.dp) ) { Text( member.displayName, fontWeight = FontWeight.SemiBold, fontSize = 16.sp, - color = HabiticaTheme.colors.textPrimary, + color = HabiticaTheme.colors.textPrimary ) Row( horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalAlignment = Alignment.CenterVertically, + verticalAlignment = Alignment.CenterVertically ) { Text( member.formattedUsername ?: "", - color = HabiticaTheme.colors.textTertiary, + color = HabiticaTheme.colors.textTertiary ) Spacer( Modifier - .weight(1.0f), + .weight(1.0f) ) ClassIcon( member.stats?.habitClass, member.hasClass, - modifier = Modifier.size(18.dp), + modifier = Modifier.size(18.dp) ) BuffIcon(member.stats?.isBuffed) CurrencyText( currency = "gold", value = (member.stats?.gp) ?: 0.0, decimals = 0, - animated = false, + animated = false ) } LabeledBar( @@ -159,7 +159,7 @@ fun MemberItem( maxValue = (member.stats?.maxHealth ?: 0).toDouble(), displayCompact = true, barHeight = 5.dp, - animated = false, + animated = false ) LabeledBar( color = colorResource(R.color.xpColor), @@ -168,7 +168,7 @@ fun MemberItem( maxValue = (member.stats?.toNextLevel ?: 0).toDouble(), displayCompact = true, barHeight = 5.dp, - animated = false, + animated = false ) if (member.hasClass) { LabeledBar( @@ -178,7 +178,7 @@ fun MemberItem( maxValue = (member.stats?.maxMP ?: 0).toDouble(), displayCompact = true, barHeight = 5.dp, - animated = false, + animated = false ) } Row(horizontalArrangement = Arrangement.SpaceBetween) { @@ -186,14 +186,14 @@ fun MemberItem( stringResource(R.string.level_unabbreviated, member.stats?.lvl ?: 0), fontSize = 14.sp, fontWeight = FontWeight.Normal, - color = HabiticaTheme.colors.textTertiary, + color = HabiticaTheme.colors.textTertiary ) Spacer(Modifier.weight(1f)) Text( role, fontWeight = FontWeight.SemiBold, fontSize = 14.sp, - color = HabiticaTheme.colors.textSecondary, + color = HabiticaTheme.colors.textSecondary ) } } @@ -230,7 +230,7 @@ private class MemberProvider : PreviewParameterProvider { @Composable @Preview private fun Preview( - @PreviewParameter(MemberProvider::class) member: Member, + @PreviewParameter(MemberProvider::class) member: Member ) { MemberItem(member = member, role = "Manager", onMemberClicked = {}) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaButton.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaButton.kt index 8fb1044d8..867b3842b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaButton.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaButton.kt @@ -26,24 +26,24 @@ fun HabiticaButton( modifier: Modifier = Modifier, contentPadding: PaddingValues = PaddingValues(8.dp), fontSize: TextUnit = 16.sp, - content: @Composable () -> Unit, + content: @Composable () -> Unit ) { Box( contentAlignment = Alignment.Center, modifier = - modifier - .background(background, HabiticaTheme.shapes.medium) - .clickable { onClick() } - .fillMaxWidth() - .padding(contentPadding), + modifier + .background(background, HabiticaTheme.shapes.medium) + .clickable { onClick() } + .fillMaxWidth() + .padding(contentPadding) ) { ProvideTextStyle( value = - TextStyle( - fontSize = fontSize, - fontWeight = FontWeight.SemiBold, - color = color, - ), + TextStyle( + fontSize = fontSize, + fontWeight = FontWeight.SemiBold, + color = color + ) ) { content() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaSnackbar.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaSnackbar.kt index c9b2b165e..b6bf6aa59 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaSnackbar.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaSnackbar.kt @@ -18,404 +18,404 @@ import com.plattysoft.leonids.ParticleSystem class HabiticaSnackbar /** - * Constructor for the transient bottom bar. - * - * @param parent The parent for this transient bottom bar. - * @param content The content view for this transient bottom bar. - * @param callback The content view callback for this transient bottom bar. - */ - private constructor(parent: ViewGroup, content: View, callback: ContentViewCallback) : + * Constructor for the transient bottom bar. + * + * @param parent The parent for this transient bottom bar. + * @param content The content view for this transient bottom bar. + * @param callback The content view callback for this transient bottom bar. + */ +private constructor(parent: ViewGroup, content: View, callback: ContentViewCallback) : BaseTransientBottomBar(parent, content, callback) { - val binding: SnackbarViewBinding = SnackbarViewBinding.bind(content) + val binding: SnackbarViewBinding = SnackbarViewBinding.bind(content) - fun setTitle(title: CharSequence?): HabiticaSnackbar { - binding.snackbarTitle.text = title - binding.snackbarTitle.visibility = if (title != null) View.VISIBLE else View.GONE + fun setTitle(title: CharSequence?): HabiticaSnackbar { + binding.snackbarTitle.text = title + binding.snackbarTitle.visibility = if (title != null) View.VISIBLE else View.GONE + return this + } + + fun setText(text: CharSequence?): HabiticaSnackbar { + binding.snackbarText.text = text + binding.snackbarText.visibility = if (text != null) View.VISIBLE else View.GONE + return this + } + + fun setTitleColor(color: Int): HabiticaSnackbar { + binding.snackbarTitle.setTextColor(color) + return this + } + + fun setTextColor(color: Int): HabiticaSnackbar { + binding.snackbarText.setTextColor(color) + return this + } + + fun setRightDiff( + icon: Drawable?, + textColor: Int, + text: String? + ): HabiticaSnackbar { + if (icon == null) { return this } + binding.rightView.visibility = View.VISIBLE + binding.rightIconView.setImageDrawable(icon) + binding.rightTextView.setTextColor(textColor) + binding.rightTextView.text = text + return this + } - fun setText(text: CharSequence?): HabiticaSnackbar { - binding.snackbarText.text = text - binding.snackbarText.visibility = if (text != null) View.VISIBLE else View.GONE - return this + fun setLeftIcon(image: Drawable?): HabiticaSnackbar { + binding.leftImageView.setImageDrawable(image) + binding.leftImageView.visibility = if (image != null) View.VISIBLE else View.GONE + return this + } + + fun setBackgroundColor( + @ColorInt color: Int + ): HabiticaSnackbar { + view.setBackgroundColor(color) + return this + } + + fun setBackgroundResource(resourceId: Int): HabiticaSnackbar { + binding.snackbarView.setBackgroundResource(resourceId) + view.setBackgroundColor(ContextCompat.getColor(context, R.color.transparent)) + return this + } + + private fun setSpecialView(specialView: View?): HabiticaSnackbar { + if (specialView != null) { + binding.contentContainer.addView(specialView) + } + return this + } + + private class ContentViewCallback(private val content: View) : + com.google.android.material.snackbar.ContentViewCallback { + @Suppress("SameParameterValue") + override fun animateContentIn( + delay: Int, + duration: Int + ) { + content.scaleY = 0f + content.scaleX = 0f + ViewCompat.animate(content).scaleY(1f).setDuration(duration.toLong()).startDelay = + delay.toLong() + ViewCompat.animate(content).scaleX(1f).setDuration(duration.toLong()).startDelay = + delay.toLong() + ViewCompat.animate(content).alpha(1f).setDuration(duration.toLong()).startDelay = + delay.toLong() } - fun setTitleColor(color: Int): HabiticaSnackbar { - binding.snackbarTitle.setTextColor(color) - return this - } - - fun setTextColor(color: Int): HabiticaSnackbar { - binding.snackbarText.setTextColor(color) - return this - } - - fun setRightDiff( - icon: Drawable?, - textColor: Int, - text: String?, - ): HabiticaSnackbar { - if (icon == null) { - return this - } - binding.rightView.visibility = View.VISIBLE - binding.rightIconView.setImageDrawable(icon) - binding.rightTextView.setTextColor(textColor) - binding.rightTextView.text = text - return this - } - - fun setLeftIcon(image: Drawable?): HabiticaSnackbar { - binding.leftImageView.setImageDrawable(image) - binding.leftImageView.visibility = if (image != null) View.VISIBLE else View.GONE - return this - } - - fun setBackgroundColor( - @ColorInt color: Int, - ): HabiticaSnackbar { - view.setBackgroundColor(color) - return this - } - - fun setBackgroundResource(resourceId: Int): HabiticaSnackbar { - binding.snackbarView.setBackgroundResource(resourceId) - view.setBackgroundColor(ContextCompat.getColor(context, R.color.transparent)) - return this - } - - private fun setSpecialView(specialView: View?): HabiticaSnackbar { - if (specialView != null) { - binding.contentContainer.addView(specialView) - } - return this - } - - private class ContentViewCallback(private val content: View) : - com.google.android.material.snackbar.ContentViewCallback { - @Suppress("SameParameterValue") - override fun animateContentIn( - delay: Int, - duration: Int, - ) { - content.scaleY = 0f - content.scaleX = 0f - ViewCompat.animate(content).scaleY(1f).setDuration(duration.toLong()).startDelay = - delay.toLong() - ViewCompat.animate(content).scaleX(1f).setDuration(duration.toLong()).startDelay = - delay.toLong() - ViewCompat.animate(content).alpha(1f).setDuration(duration.toLong()).startDelay = - delay.toLong() - } - - override fun animateContentOut( - delay: Int, - duration: Int, - ) { - content.scaleY = 1f - content.scaleX = 1f - ViewCompat.animate(content).scaleY(0f).setDuration(duration.toLong()).startDelay = - delay.toLong() - ViewCompat.animate(content).scaleX(0f).setDuration(duration.toLong()).startDelay = - delay.toLong() - ViewCompat.animate(content).alpha(0f).setDuration(duration.toLong()).startDelay = - delay.toLong() - } - } - - enum class SnackbarDisplayType { - NORMAL, - FAILURE, - FAILURE_BLUE, - DROP, - SUCCESS, - BLUE, - BLACK, - SUBSCRIBER_BENEFIT, - } - - companion object { - const val MIN_LEVEL_FOR_SKILLS = 11 - - private fun make( - parent: ViewGroup, - duration: Int, - ): HabiticaSnackbar { - val inflater = LayoutInflater.from(parent.context) - val content = inflater.inflate(R.layout.snackbar_view, parent, false) - val viewCallback = ContentViewCallback(content) - val customSnackbar = HabiticaSnackbar(parent, content, viewCallback) - customSnackbar.duration = duration - return customSnackbar - } - - fun showSnackbar( - container: ViewGroup, - content: CharSequence?, - displayType: SnackbarDisplayType, - isCelebratory: Boolean = false, - isSubscriberBenefit: Boolean = false, - duration: Int = Snackbar.LENGTH_LONG, - ) { - showSnackbar( - container, - null, - null, - content, - null, - null, - 0, - null, - displayType, - isCelebratory, - isSubscriberBenefit, - duration, - ) - } - - fun showSnackbar( - container: ViewGroup, - leftImage: Drawable, - title: CharSequence?, - content: CharSequence?, - displayType: SnackbarDisplayType, - isCelebratory: Boolean = false, - isSubscriberBenefit: Boolean = false, - duration: Int = Snackbar.LENGTH_LONG, - ) { - showSnackbar( - container, - leftImage, - title, - content, - null, - null, - 0, - null, - displayType, - isCelebratory, - isSubscriberBenefit, - duration, - ) - } - - fun showSnackbar( - container: ViewGroup, - title: CharSequence?, - content: CharSequence?, - rightIcon: Drawable, - rightTextColor: Int?, - rightText: String, - displayType: SnackbarDisplayType, - isCelebratory: Boolean = false, - isSubscriberBenefit: Boolean = false, - duration: Int = Snackbar.LENGTH_LONG, - ) { - showSnackbar( - container, - null, - title, - content, - null, - rightIcon, - rightTextColor, - rightText, - displayType, - isCelebratory, - isSubscriberBenefit, - duration, - ) - } - - fun showSnackbar( - container: ViewGroup, - title: CharSequence?, - content: CharSequence?, - specialView: View?, - displayType: SnackbarDisplayType, - isCelebratory: Boolean = false, - isSubscriberBenefit: Boolean = false, - duration: Int = Snackbar.LENGTH_LONG, - ) { - showSnackbar( - container, - null, - title, - content, - specialView, - null, - 0, - null, - displayType, - isCelebratory, - isSubscriberBenefit, - duration, - ) - } - - fun showSnackbar( - container: ViewGroup, - leftImage: Drawable?, - title: CharSequence?, - content: CharSequence?, - specialView: View?, - rightIcon: Drawable?, - rightTextColor: Int?, - rightText: String?, - displayType: SnackbarDisplayType, - isCelebratory: Boolean = false, - isSubscriberBenefit: Boolean = false, - duration: Int = Snackbar.LENGTH_LONG, - ) { - val snackbar = - make(container, duration) - .setSpecialView(specialView) - .setLeftIcon(leftImage) - if (title?.isNotBlank() == true) { - snackbar.setTitle(title) - } - if (content?.isNotBlank() == true) { - if (title?.isNotBlank() != true) { - snackbar.setTitle(content) - } else { - snackbar.setText(content) - } - } - rightTextColor?.let { - snackbar.setRightDiff(rightIcon, rightTextColor, rightText) - } - - when (displayType) { - SnackbarDisplayType.FAILURE -> snackbar.setBackgroundResource(R.drawable.snackbar_background_red) - SnackbarDisplayType.BLACK -> snackbar.setBackgroundResource(R.drawable.snackbar_background_black) - SnackbarDisplayType.FAILURE_BLUE, SnackbarDisplayType.BLUE -> - snackbar.setBackgroundResource( - R.drawable.snackbar_background_blue, - ) - - SnackbarDisplayType.DROP, SnackbarDisplayType.NORMAL -> - snackbar.setBackgroundResource( - R.drawable.snackbar_background_gray, - ) - - SnackbarDisplayType.SUCCESS -> snackbar.setBackgroundResource(R.drawable.snackbar_background_green) - SnackbarDisplayType.SUBSCRIBER_BENEFIT -> { - snackbar.setBackgroundResource(R.drawable.subscriber_benefit_snackbar_bg) - snackbar.setTitleColor( - ContextCompat.getColor( - container.context, - R.color.green_1, - ), - ) - snackbar.setTextColor( - ContextCompat.getColor( - container.context, - R.color.green_1, - ), - ) - } - } - - if (isCelebratory) { - showConfettiAnimation(container) - } else if (isSubscriberBenefit) { - showSubscriberBenefitAnimation(container, snackbar) - } - - snackbar.show() - if (displayType == SnackbarDisplayType.FAILURE || displayType == SnackbarDisplayType.FAILURE_BLUE) { - container.postDelayed({ - snackbar.getView().startAnimation(Animations.negativeShakeAnimation()) - }, 600L) - } - } - - private fun showSubscriberBenefitAnimation( - container: ViewGroup, - snackbar: HabiticaSnackbar, - ) { - container.postDelayed( - { - ParticleSystem( - container, - 300, - ContextCompat.getDrawable(container.context, R.drawable.confetti_subs), - 800L, - ) - .setFadeOut(200L) - .setSpeedRange(0.05f, 0.2f) - .setScaleRange(0.8f, 1.2f) - .setRotationSpeedRange(134f, 164f) - .emit(snackbar.getView(), 200, 600) - }, - 500L, - ) - } - - private fun showConfettiAnimation(container: ViewGroup) { - container.postDelayed( - { - ParticleSystem( - container, - 30, - ContextCompat.getDrawable(container.context, R.drawable.confetti_blue), - 6000, - ) - .setAcceleration(0.00070f, 90) - .setRotationSpeedRange(134f, 164f) - .setScaleRange(0.8f, 1.2f) - .setSpeedByComponentsRange(-0.15f, 0.15f, -0.15f, -0.45f) - .setFadeOut(200, AccelerateInterpolator()) - .emitWithGravity(container, Gravity.BOTTOM, 7, 1000) - ParticleSystem( - container, - 30, - ContextCompat.getDrawable(container.context, R.drawable.confetti_red), - 6000, - ) - .setAcceleration(0.00060f, 90) - .setRotationSpeedRange(134f, 164f) - .setScaleRange(0.8f, 1.2f) - .setSpeedByComponentsRange(-0.15f, 0.15f, -0.15f, -0.45f) - .setFadeOut(200, AccelerateInterpolator()) - .emitWithGravity(container, Gravity.BOTTOM, 7, 1000) - ParticleSystem( - container, - 30, - ContextCompat.getDrawable( - container.context, - R.drawable.confetti_yellow, - ), - 6000, - ) - .setAcceleration(0.00070f, 90) - .setRotationSpeedRange(134f, 164f) - .setScaleRange(0.8f, 1.2f) - .setSpeedByComponentsRange(-0.15f, 0.15f, -0.15f, -0.45f) - .setFadeOut(200, AccelerateInterpolator()) - .emitWithGravity(container, Gravity.BOTTOM, 7, 1000) - ParticleSystem( - container, - 30, - ContextCompat.getDrawable( - container.context, - R.drawable.confetti_purple, - ), - 6000, - ) - .setAcceleration(0.00090f, 90) - .setRotationSpeedRange(134f, 164f) - .setScaleRange(0.8f, 1.2f) - .setSpeedByComponentsRange(-0.15f, 0.15f, -0.15f, -0.45f) - .setFadeOut(200, AccelerateInterpolator()) - .emitWithGravity(container, Gravity.BOTTOM, 7, 1000) - }, - 500, - ) - } + override fun animateContentOut( + delay: Int, + duration: Int + ) { + content.scaleY = 1f + content.scaleX = 1f + ViewCompat.animate(content).scaleY(0f).setDuration(duration.toLong()).startDelay = + delay.toLong() + ViewCompat.animate(content).scaleX(0f).setDuration(duration.toLong()).startDelay = + delay.toLong() + ViewCompat.animate(content).alpha(0f).setDuration(duration.toLong()).startDelay = + delay.toLong() } } + enum class SnackbarDisplayType { + NORMAL, + FAILURE, + FAILURE_BLUE, + DROP, + SUCCESS, + BLUE, + BLACK, + SUBSCRIBER_BENEFIT + } + + companion object { + const val MIN_LEVEL_FOR_SKILLS = 11 + + private fun make( + parent: ViewGroup, + duration: Int + ): HabiticaSnackbar { + val inflater = LayoutInflater.from(parent.context) + val content = inflater.inflate(R.layout.snackbar_view, parent, false) + val viewCallback = ContentViewCallback(content) + val customSnackbar = HabiticaSnackbar(parent, content, viewCallback) + customSnackbar.duration = duration + return customSnackbar + } + + fun showSnackbar( + container: ViewGroup, + content: CharSequence?, + displayType: SnackbarDisplayType, + isCelebratory: Boolean = false, + isSubscriberBenefit: Boolean = false, + duration: Int = Snackbar.LENGTH_LONG + ) { + showSnackbar( + container, + null, + null, + content, + null, + null, + 0, + null, + displayType, + isCelebratory, + isSubscriberBenefit, + duration + ) + } + + fun showSnackbar( + container: ViewGroup, + leftImage: Drawable, + title: CharSequence?, + content: CharSequence?, + displayType: SnackbarDisplayType, + isCelebratory: Boolean = false, + isSubscriberBenefit: Boolean = false, + duration: Int = Snackbar.LENGTH_LONG + ) { + showSnackbar( + container, + leftImage, + title, + content, + null, + null, + 0, + null, + displayType, + isCelebratory, + isSubscriberBenefit, + duration + ) + } + + fun showSnackbar( + container: ViewGroup, + title: CharSequence?, + content: CharSequence?, + rightIcon: Drawable, + rightTextColor: Int?, + rightText: String, + displayType: SnackbarDisplayType, + isCelebratory: Boolean = false, + isSubscriberBenefit: Boolean = false, + duration: Int = Snackbar.LENGTH_LONG + ) { + showSnackbar( + container, + null, + title, + content, + null, + rightIcon, + rightTextColor, + rightText, + displayType, + isCelebratory, + isSubscriberBenefit, + duration + ) + } + + fun showSnackbar( + container: ViewGroup, + title: CharSequence?, + content: CharSequence?, + specialView: View?, + displayType: SnackbarDisplayType, + isCelebratory: Boolean = false, + isSubscriberBenefit: Boolean = false, + duration: Int = Snackbar.LENGTH_LONG + ) { + showSnackbar( + container, + null, + title, + content, + specialView, + null, + 0, + null, + displayType, + isCelebratory, + isSubscriberBenefit, + duration + ) + } + + fun showSnackbar( + container: ViewGroup, + leftImage: Drawable?, + title: CharSequence?, + content: CharSequence?, + specialView: View?, + rightIcon: Drawable?, + rightTextColor: Int?, + rightText: String?, + displayType: SnackbarDisplayType, + isCelebratory: Boolean = false, + isSubscriberBenefit: Boolean = false, + duration: Int = Snackbar.LENGTH_LONG + ) { + val snackbar = + make(container, duration) + .setSpecialView(specialView) + .setLeftIcon(leftImage) + if (title?.isNotBlank() == true) { + snackbar.setTitle(title) + } + if (content?.isNotBlank() == true) { + if (title?.isNotBlank() != true) { + snackbar.setTitle(content) + } else { + snackbar.setText(content) + } + } + rightTextColor?.let { + snackbar.setRightDiff(rightIcon, rightTextColor, rightText) + } + + when (displayType) { + SnackbarDisplayType.FAILURE -> snackbar.setBackgroundResource(R.drawable.snackbar_background_red) + SnackbarDisplayType.BLACK -> snackbar.setBackgroundResource(R.drawable.snackbar_background_black) + SnackbarDisplayType.FAILURE_BLUE, SnackbarDisplayType.BLUE -> + snackbar.setBackgroundResource( + R.drawable.snackbar_background_blue + ) + + SnackbarDisplayType.DROP, SnackbarDisplayType.NORMAL -> + snackbar.setBackgroundResource( + R.drawable.snackbar_background_gray + ) + + SnackbarDisplayType.SUCCESS -> snackbar.setBackgroundResource(R.drawable.snackbar_background_green) + SnackbarDisplayType.SUBSCRIBER_BENEFIT -> { + snackbar.setBackgroundResource(R.drawable.subscriber_benefit_snackbar_bg) + snackbar.setTitleColor( + ContextCompat.getColor( + container.context, + R.color.green_1 + ) + ) + snackbar.setTextColor( + ContextCompat.getColor( + container.context, + R.color.green_1 + ) + ) + } + } + + if (isCelebratory) { + showConfettiAnimation(container) + } else if (isSubscriberBenefit) { + showSubscriberBenefitAnimation(container, snackbar) + } + + snackbar.show() + if (displayType == SnackbarDisplayType.FAILURE || displayType == SnackbarDisplayType.FAILURE_BLUE) { + container.postDelayed({ + snackbar.getView().startAnimation(Animations.negativeShakeAnimation()) + }, 600L) + } + } + + private fun showSubscriberBenefitAnimation( + container: ViewGroup, + snackbar: HabiticaSnackbar + ) { + container.postDelayed( + { + ParticleSystem( + container, + 300, + ContextCompat.getDrawable(container.context, R.drawable.confetti_subs), + 800L + ) + .setFadeOut(200L) + .setSpeedRange(0.05f, 0.2f) + .setScaleRange(0.8f, 1.2f) + .setRotationSpeedRange(134f, 164f) + .emit(snackbar.getView(), 200, 600) + }, + 500L + ) + } + + private fun showConfettiAnimation(container: ViewGroup) { + container.postDelayed( + { + ParticleSystem( + container, + 30, + ContextCompat.getDrawable(container.context, R.drawable.confetti_blue), + 6000 + ) + .setAcceleration(0.00070f, 90) + .setRotationSpeedRange(134f, 164f) + .setScaleRange(0.8f, 1.2f) + .setSpeedByComponentsRange(-0.15f, 0.15f, -0.15f, -0.45f) + .setFadeOut(200, AccelerateInterpolator()) + .emitWithGravity(container, Gravity.BOTTOM, 7, 1000) + ParticleSystem( + container, + 30, + ContextCompat.getDrawable(container.context, R.drawable.confetti_red), + 6000 + ) + .setAcceleration(0.00060f, 90) + .setRotationSpeedRange(134f, 164f) + .setScaleRange(0.8f, 1.2f) + .setSpeedByComponentsRange(-0.15f, 0.15f, -0.15f, -0.45f) + .setFadeOut(200, AccelerateInterpolator()) + .emitWithGravity(container, Gravity.BOTTOM, 7, 1000) + ParticleSystem( + container, + 30, + ContextCompat.getDrawable( + container.context, + R.drawable.confetti_yellow + ), + 6000 + ) + .setAcceleration(0.00070f, 90) + .setRotationSpeedRange(134f, 164f) + .setScaleRange(0.8f, 1.2f) + .setSpeedByComponentsRange(-0.15f, 0.15f, -0.15f, -0.45f) + .setFadeOut(200, AccelerateInterpolator()) + .emitWithGravity(container, Gravity.BOTTOM, 7, 1000) + ParticleSystem( + container, + 30, + ContextCompat.getDrawable( + container.context, + R.drawable.confetti_purple + ), + 6000 + ) + .setAcceleration(0.00090f, 90) + .setRotationSpeedRange(134f, 164f) + .setScaleRange(0.8f, 1.2f) + .setSpeedByComponentsRange(-0.15f, 0.15f, -0.15f, -0.45f) + .setFadeOut(200, AccelerateInterpolator()) + .emitWithGravity(container, Gravity.BOTTOM, 7, 1000) + }, + 500 + ) + } + } +} + interface SnackbarActivity { fun snackbarContainer(): ViewGroup @@ -428,7 +428,7 @@ interface SnackbarActivity { rightTextColor: Int? = null, rightText: String? = null, displayType: HabiticaSnackbar.SnackbarDisplayType = HabiticaSnackbar.SnackbarDisplayType.NORMAL, - isCelebratory: Boolean = false, + isCelebratory: Boolean = false ) { HabiticaSnackbar.showSnackbar( snackbarContainer(), @@ -440,7 +440,7 @@ interface SnackbarActivity { rightTextColor, rightText, displayType, - isCelebratory, + isCelebratory ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/LabeledBar.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/LabeledBar.kt index 090119059..49fb80963 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/LabeledBar.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/LabeledBar.kt @@ -61,7 +61,7 @@ fun LabeledBar( disabled: Boolean = false, abbreviateValue: Boolean = true, abbreviateMax: Boolean = true, - animated: Boolean = true, + animated: Boolean = true ) { val cleanedMaxValue = java.lang.Double.max(1.0, maxValue) @@ -69,7 +69,7 @@ fun LabeledBar( if (animated) { animateFloatAsState( targetValue = value.toFloat(), - animationSpec = spring(), + animationSpec = spring() ).value } else { value.toFloat() @@ -81,27 +81,27 @@ fun LabeledBar( val animatedPadding = animateDpAsState( targetValue = - if (displayCompact) { - 0.dp - } else { - 24.dp - }, + if (displayCompact) { + 0.dp + } else { + 24.dp + } ) Box( - modifier = modifier.alpha(if (disabled) 0.5f else 1.0f), + modifier = modifier.alpha(if (disabled) 0.5f else 1.0f) ) { icon?.let { AnimatedVisibility( visible = !displayCompact, enter = fadeIn() + slideInHorizontally { -18 }, exit = fadeOut() + slideOutHorizontally { -18 }, - modifier = Modifier.align(Alignment.CenterStart), + modifier = Modifier.align(Alignment.CenterStart) ) { Image( it.asImageBitmap(), null, - modifier = Modifier, + modifier = Modifier ) } } @@ -113,12 +113,12 @@ fun LabeledBar( .clip(CircleShape) .height(barHeight), trackColor = barColor, - color = color, + color = color ) AnimatedVisibility(visible = !displayCompact) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(top = 2.dp), + modifier = Modifier.padding(top = 2.dp) ) { if (!disabled) { val currentValueText = @@ -126,7 +126,7 @@ fun LabeledBar( NumberAbbreviator.abbreviate( LocalContext.current, animatedValue, - 0, + 0 ) } else { formatter.format(animatedValue) @@ -136,7 +136,7 @@ fun LabeledBar( NumberAbbreviator.abbreviate( LocalContext.current, cleanedMaxValue, - 0, + 0 ) } else { formatter.format(cleanedMaxValue) @@ -144,7 +144,7 @@ fun LabeledBar( Text( "$currentValueText / $maxValueText", fontSize = 12.sp, - color = colorResource(R.color.text_ternary), + color = colorResource(R.color.text_ternary) ) } Spacer(Modifier.weight(1f)) @@ -164,12 +164,12 @@ private fun Preview() { Column( verticalArrangement = Arrangement.spacedBy(10.dp), modifier = - Modifier - .width(240.dp) - .padding(8.dp) - .clickable { - compact = !compact - }, + Modifier + .width(240.dp) + .padding(8.dp) + .clickable { + compact = !compact + } ) { LabeledBar( icon = HabiticaIconsHelper.imageOfHeartLightBg(), @@ -177,7 +177,7 @@ private fun Preview() { color = colorResource(R.color.hpColor), value = 10.0, maxValue = 50.0, - displayCompact = compact, + displayCompact = compact ) LabeledBar( icon = HabiticaIconsHelper.imageOfExperience(), @@ -186,7 +186,7 @@ private fun Preview() { value = 100123.0, maxValue = 50000000000000.0, displayCompact = compact, - abbreviateValue = false, + abbreviateValue = false ) LabeledBar( icon = HabiticaIconsHelper.imageOfExperience(), @@ -196,7 +196,7 @@ private fun Preview() { maxValue = 500000000000.0, displayCompact = compact, abbreviateValue = false, - abbreviateMax = false, + abbreviateMax = false ) LabeledBar( icon = HabiticaIconsHelper.imageOfMagic(), @@ -205,7 +205,7 @@ private fun Preview() { value = 10.0, maxValue = 5000.0, displayCompact = compact, - disabled = false, + disabled = false ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/LoadingButton.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/LoadingButton.kt index 605be2322..49399598a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/LoadingButton.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/LoadingButton.kt @@ -61,12 +61,12 @@ enum class LoadingButtonState { DISABLED, LOADING, FAILED, - SUCCESS, + SUCCESS } enum class LoadingButtonType { NORMAL, - DESTRUCTIVE, + DESTRUCTIVE } @OptIn(ExperimentalAnimationApi::class) @@ -83,7 +83,7 @@ fun LoadingButton( contentPadding: PaddingValues = ButtonDefaults.ContentPadding, successContent: (@Composable RowScope.() -> Unit)? = null, failedContent: (@Composable RowScope.() -> Unit)? = null, - content: @Composable RowScope.() -> Unit, + content: @Composable RowScope.() -> Unit ) { val colorStyle = if (type == LoadingButtonType.DESTRUCTIVE) { @@ -91,45 +91,45 @@ fun LoadingButton( containerColor = HabiticaTheme.colors.errorBackground, contentColor = Color.White, disabledContainerColor = HabiticaTheme.colors.offsetBackground, - disabledContentColor = HabiticaTheme.colors.textQuad, + disabledContentColor = HabiticaTheme.colors.textQuad ) } else { ButtonDefaults.buttonColors( containerColor = HabiticaTheme.colors.tintedUiSub, contentColor = Color.White, disabledContainerColor = HabiticaTheme.colors.offsetBackground, - disabledContentColor = HabiticaTheme.colors.textQuad, + disabledContentColor = HabiticaTheme.colors.textQuad ) } val colorSpec = tween(350) val backgroundColor = animateColorAsState( targetValue = - when (state) { - LoadingButtonState.FAILED -> HabiticaTheme.colors.errorBackground - LoadingButtonState.SUCCESS -> Color.Transparent - else -> if (state != LoadingButtonState.DISABLED) colorStyle.containerColor else colorStyle.disabledContainerColor - }, - animationSpec = colorSpec, + when (state) { + LoadingButtonState.FAILED -> HabiticaTheme.colors.errorBackground + LoadingButtonState.SUCCESS -> Color.Transparent + else -> if (state != LoadingButtonState.DISABLED) colorStyle.containerColor else colorStyle.disabledContainerColor + }, + animationSpec = colorSpec ) val contentColor = animateColorAsState( targetValue = - when (state) { - LoadingButtonState.FAILED -> Color.White - LoadingButtonState.SUCCESS -> if (type == LoadingButtonType.DESTRUCTIVE) HabiticaTheme.colors.errorColor else HabiticaTheme.colors.successColor - else -> if (state != LoadingButtonState.DISABLED) colorStyle.contentColor else colorStyle.disabledContentColor - }, - animationSpec = colorSpec, + when (state) { + LoadingButtonState.FAILED -> Color.White + LoadingButtonState.SUCCESS -> if (type == LoadingButtonType.DESTRUCTIVE) HabiticaTheme.colors.errorColor else HabiticaTheme.colors.successColor + else -> if (state != LoadingButtonState.DISABLED) colorStyle.contentColor else colorStyle.disabledContentColor + }, + animationSpec = colorSpec ) val borderWidth = animateDpAsState( targetValue = - if (state == LoadingButtonState.SUCCESS) { - 3.dp - } else { - border?.width ?: 0.dp - }, + if (state == LoadingButtonState.SUCCESS) { + 3.dp + } else { + border?.width ?: 0.dp + } ) val buttonColors = @@ -137,7 +137,7 @@ fun LoadingButton( containerColor = backgroundColor.value, contentColor = contentColor.value, disabledContainerColor = backgroundColor.value, - disabledContentColor = contentColor.value, + disabledContentColor = contentColor.value ) Button( { @@ -152,16 +152,16 @@ fun LoadingButton( elevation = elevation, shape = shape, border = - if (state == LoadingButtonState.SUCCESS) { - BorderStroke( - borderWidth.value, - if (type == LoadingButtonType.DESTRUCTIVE) HabiticaTheme.colors.errorColor else HabiticaTheme.colors.successColor, - ) - } else { - border - }, + if (state == LoadingButtonState.SUCCESS) { + BorderStroke( + borderWidth.value, + if (type == LoadingButtonType.DESTRUCTIVE) HabiticaTheme.colors.errorColor else HabiticaTheme.colors.successColor + ) + } else { + border + }, colors = buttonColors, - contentPadding = PaddingValues(0.dp), + contentPadding = PaddingValues(0.dp) ) { ProvideTextStyle(value = TextStyle(fontSize = 16.sp, fontWeight = FontWeight.SemiBold)) { AnimatedContent( @@ -174,16 +174,16 @@ fun LoadingButton( if (targetState == LoadingButtonState.FAILED) { ( fadeIn( - animationSpec = tween(220, delayMillis = 90), + animationSpec = tween(220, delayMillis = 90) ) + slideInHorizontally( animationSpec = - spring( - dampingRatio = 0.2f, - stiffness = StiffnessMediumLow, - ), + spring( + dampingRatio = 0.2f, + stiffness = StiffnessMediumLow + ) ) - ).togetherWith(fadeOut(animationSpec = tween(90))) + ).togetherWith(fadeOut(animationSpec = tween(90))) } else if (isInitialShowingContent && isTargetShowingContent) { fadeIn() togetherWith fadeOut() } else { @@ -192,23 +192,23 @@ fun LoadingButton( scaleIn( initialScale = 0.92f, animationSpec = - tween( - 220, - delayMillis = 90, - FastOutSlowInEasing, - ), + tween( + 220, + delayMillis = 90, + FastOutSlowInEasing + ) ) - ).togetherWith(fadeOut(animationSpec = tween(90))) + ).togetherWith(fadeOut(animationSpec = tween(90))) } }, contentAlignment = Alignment.Center, - modifier = Modifier.padding(contentPadding), + modifier = Modifier.padding(contentPadding) ) { state -> when (state) { LoadingButtonState.LOADING -> CircularProgressIndicator( color = contentColor.value, - modifier = Modifier.size(16.dp), + modifier = Modifier.size(16.dp) ) LoadingButtonState.SUCCESS -> successContent?.let { it() } ?: content() @@ -216,7 +216,7 @@ fun LoadingButton( failedContent?.let { it() } ?: Image( painterResource(R.drawable.failed_loading), stringResource(R.string.failed), - Modifier.padding(horizontal = 8.dp), + Modifier.padding(horizontal = 8.dp) ) else -> content() @@ -237,7 +237,7 @@ private fun Preview() { modifier = Modifier .width(200.dp) - .padding(8.dp), + .padding(8.dp) ) { LoadingButton(state, { scope.launch { @@ -254,21 +254,21 @@ private fun Preview() { state = LoadingButtonState.CONTENT } }, successContent = { - Text("I did it!") - }, content = { - Text("Do something") - }, modifier = Modifier.fillMaxWidth()) + Text("I did it!") + }, content = { + Text("Do something") + }, modifier = Modifier.fillMaxWidth()) LoadingButton( LoadingButtonState.LOADING, {}, colors = - ButtonDefaults.buttonColors( - containerColor = HabiticaTheme.colors.successBackground, - contentColor = Color.White, - ), + ButtonDefaults.buttonColors( + containerColor = HabiticaTheme.colors.successBackground, + contentColor = Color.White + ), content = { Text("Do something") - }, + } ) LoadingButton(LoadingButtonState.LOADING, {}, content = { Text("Do something") @@ -279,16 +279,16 @@ private fun Preview() { LoadingButton(LoadingButtonState.FAILED, {}, failedContent = { Text("Didn't work :(") }, content = { - Text("Do something") - }) + Text("Do something") + }) LoadingButton(LoadingButtonState.SUCCESS, {}, content = { Text("Do something") }) LoadingButton(LoadingButtonState.SUCCESS, {}, successContent = { Text("Success!") }, content = { - Text("Do something") - }) + Text("Do something") + }) LoadingButton(LoadingButtonState.CONTENT, {}, content = { Text("Do something") }) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/NPCBannerView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/NPCBannerView.kt index a5ac0d5f8..de684fec0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/NPCBannerView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/NPCBannerView.kt @@ -5,7 +5,6 @@ import android.graphics.Bitmap import android.graphics.Shader import android.graphics.drawable.BitmapDrawable import android.util.AttributeSet -import android.widget.FrameLayout import android.widget.ImageView import android.widget.RelativeLayout import androidx.core.graphics.drawable.toBitmap diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt index bb4af6f9b..ba2a34747 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt @@ -12,7 +12,7 @@ import com.habitrpg.common.habitica.views.PixelArtView fun PixelArtView( imageName: String?, modifier: Modifier = Modifier, - imageFormat: String? = null, + imageFormat: String? = null ) { AndroidView( modifier = modifier, // Occupy the max size in the Compose UI tree @@ -25,14 +25,14 @@ fun PixelArtView( } else { view.bitmap = null } - }, + } ) } @Composable fun PixelArtView( bitmap: ImageBitmap, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { AndroidView( modifier = modifier, // Occupy the max size in the Compose UI tree @@ -41,6 +41,6 @@ fun PixelArtView( }, update = { view -> view.bitmap = bitmap.asAndroidBitmap() - }, + } ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SegmentedControl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SegmentedControl.kt index 40794d836..4b4a805a8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SegmentedControl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SegmentedControl.kt @@ -36,115 +36,115 @@ fun SegmentedControl( useFixedWidth: Boolean = false, itemWidth: Dp = 120.dp, cornerRadius: Int = 10, - onItemSelection: (selectedItemIndex: Int) -> Unit, + onItemSelection: (selectedItemIndex: Int) -> Unit ) { val selectedIndex = remember { mutableIntStateOf(defaultSelectedItemIndex) } val color = MaterialTheme.colorScheme.primary Row( - modifier = Modifier, + modifier = Modifier ) { items.forEachIndexed { index, item -> OutlinedButton( modifier = - when (index) { - 0 -> { - if (useFixedWidth) { - Modifier - .width(itemWidth) - .offset(0.dp, 0.dp) - .zIndex(if (selectedIndex.intValue == 0) 1f else 0f) - } else { - Modifier - .wrapContentSize() - .offset(0.dp, 0.dp) - .zIndex(if (selectedIndex.intValue == 0) 1f else 0f) - } + when (index) { + 0 -> { + if (useFixedWidth) { + Modifier + .width(itemWidth) + .offset(0.dp, 0.dp) + .zIndex(if (selectedIndex.intValue == 0) 1f else 0f) + } else { + Modifier + .wrapContentSize() + .offset(0.dp, 0.dp) + .zIndex(if (selectedIndex.intValue == 0) 1f else 0f) } + } - else -> { - if (useFixedWidth) { - Modifier - .width(itemWidth) - .offset((-1 * index).dp, 0.dp) - .zIndex(if (selectedIndex.intValue == index) 1f else 0f) - } else { - Modifier - .wrapContentSize() - .offset((-1 * index).dp, 0.dp) - .zIndex(if (selectedIndex.intValue == index) 1f else 0f) - } + else -> { + if (useFixedWidth) { + Modifier + .width(itemWidth) + .offset((-1 * index).dp, 0.dp) + .zIndex(if (selectedIndex.intValue == index) 1f else 0f) + } else { + Modifier + .wrapContentSize() + .offset((-1 * index).dp, 0.dp) + .zIndex(if (selectedIndex.intValue == index) 1f else 0f) } - }, + } + }, onClick = { selectedIndex.intValue = index onItemSelection(selectedIndex.intValue) }, shape = - when (index) { - /** - * left outer button - */ - 0 -> - RoundedCornerShape( - topStartPercent = cornerRadius, - topEndPercent = 0, - bottomStartPercent = cornerRadius, - bottomEndPercent = 0, - ) - /** - * right outer button - */ - items.size - 1 -> - RoundedCornerShape( - topStartPercent = 0, - topEndPercent = cornerRadius, - bottomStartPercent = 0, - bottomEndPercent = cornerRadius, - ) - /** - * middle button - */ - else -> - RoundedCornerShape( - topStartPercent = 0, - topEndPercent = 0, - bottomStartPercent = 0, - bottomEndPercent = 0, - ) - }, - border = - BorderStroke( - 1.dp, - if (selectedIndex.intValue == index) { - color - } else { - color.copy(alpha = 0.75f) - }, - ), - colors = - if (selectedIndex.intValue == index) { - /** - * selected colors - */ - ButtonDefaults.outlinedButtonColors( - containerColor = color, + when (index) { + /** + * left outer button + */ + 0 -> + RoundedCornerShape( + topStartPercent = cornerRadius, + topEndPercent = 0, + bottomStartPercent = cornerRadius, + bottomEndPercent = 0 ) + /** + * right outer button + */ + items.size - 1 -> + RoundedCornerShape( + topStartPercent = 0, + topEndPercent = cornerRadius, + bottomStartPercent = 0, + bottomEndPercent = cornerRadius + ) + /** + * middle button + */ + else -> + RoundedCornerShape( + topStartPercent = 0, + topEndPercent = 0, + bottomStartPercent = 0, + bottomEndPercent = 0 + ) + }, + border = + BorderStroke( + 1.dp, + if (selectedIndex.intValue == index) { + color } else { - /** - * not selected colors - */ - ButtonDefaults.outlinedButtonColors(containerColor = Color.Transparent) - }, + color.copy(alpha = 0.75f) + } + ), + colors = + if (selectedIndex.intValue == index) { + /** + * selected colors + */ + ButtonDefaults.outlinedButtonColors( + containerColor = color + ) + } else { + /** + * not selected colors + */ + ButtonDefaults.outlinedButtonColors(containerColor = Color.Transparent) + } ) { Text( text = item, fontWeight = FontWeight.Normal, color = - if (selectedIndex.intValue == index) { - Color.White - } else { - color.copy(alpha = 0.9f) - }, + if (selectedIndex.intValue == index) { + Color.White + } else { + color.copy(alpha = 0.9f) + } ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SparkView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SparkView.kt index 368b8fb61..3408201be 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SparkView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SparkView.kt @@ -15,128 +15,128 @@ import com.habitrpg.common.habitica.extensions.dpToPx import kotlin.math.min class SparkView - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - ) : View(context, attrs, defStyleAttr) { - private var spacing: Float = 0f - set(value) { - field = value - invalidate() - } - private var paint: Paint = Paint() +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : View(context, attrs, defStyleAttr) { + private var spacing: Float = 0f + set(value) { + field = value + invalidate() + } + private var paint: Paint = Paint() - var thickness = 3.dpToPx(context) - var length = 6.dpToPx(context) - var maxSpacing = 5.dpToPx(context) - var animationDuration = 2500L - var color: Int - get() { - return paint.color - } - set(value) { - paint.color = value - } - - init { - spacing = maxSpacing.toFloat() - context.theme?.obtainStyledAttributes(attrs, R.styleable.SparkView, 0, 0)?.let { - thickness = it.getDimensionPixelSize(R.styleable.SparkView_thickness, 3.dpToPx(context)) - length = it.getDimensionPixelSize(R.styleable.SparkView_length, 6.dpToPx(context)) - maxSpacing = - it.getDimensionPixelSize(R.styleable.SparkView_maxSpacing, 5.dpToPx(context)) - animationDuration = it.getInt(R.styleable.SparkView_duration, 2500).toLong() - color = - it.getInt( - R.styleable.SparkView_color, - ContextCompat.getColor(context, R.color.white), - ) - } - - paint.style = Paint.Style.FILL + var thickness = 3.dpToPx(context) + var length = 6.dpToPx(context) + var maxSpacing = 5.dpToPx(context) + var animationDuration = 2500L + var color: Int + get() { + return paint.color + } + set(value) { + paint.color = value } - fun startAnimating() { - val anim = ObjectAnimator.ofFloat(thickness.toFloat(), maxSpacing.toFloat()) - anim.addUpdateListener { - spacing = it.animatedValue as Float - } - anim.interpolator = AccelerateDecelerateInterpolator() - anim.repeatCount = Animation.INFINITE - anim.repeatMode = ValueAnimator.REVERSE - anim.duration = animationDuration - anim.start() + init { + spacing = maxSpacing.toFloat() + context.theme?.obtainStyledAttributes(attrs, R.styleable.SparkView, 0, 0)?.let { + thickness = it.getDimensionPixelSize(R.styleable.SparkView_thickness, 3.dpToPx(context)) + length = it.getDimensionPixelSize(R.styleable.SparkView_length, 6.dpToPx(context)) + maxSpacing = + it.getDimensionPixelSize(R.styleable.SparkView_maxSpacing, 5.dpToPx(context)) + animationDuration = it.getInt(R.styleable.SparkView_duration, 2500).toLong() + color = + it.getInt( + R.styleable.SparkView_color, + ContextCompat.getColor(context, R.color.white) + ) } - override fun onMeasure( - widthMeasureSpec: Int, - heightMeasureSpec: Int, - ) { - val widthSize = MeasureSpec.getSize(widthMeasureSpec) - val heightSize = MeasureSpec.getSize(heightMeasureSpec) - val desiredSize = (length * 2 + maxSpacing) - - val width = - when (MeasureSpec.getMode(widthMeasureSpec)) { - MeasureSpec.EXACTLY -> widthSize - MeasureSpec.AT_MOST -> min(desiredSize, widthSize) - else -> desiredSize - } - - val height = - when (MeasureSpec.getMode(heightMeasureSpec)) { - MeasureSpec.EXACTLY -> heightSize - MeasureSpec.AT_MOST -> min(desiredSize, heightSize) - else -> desiredSize - } - - setMeasuredDimension(width, height) - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - val thisCanvas = canvas - val centerHorizontal = width / 2f - val centerVertical = height / 2f - val offset = (maxSpacing - spacing) / 2 - drawHorizontal(thisCanvas, offset, centerVertical) - drawHorizontal(thisCanvas, width - length.toFloat() - offset, centerVertical) - - drawVertical(thisCanvas, centerHorizontal, offset) - drawVertical(thisCanvas, centerVertical, height - length.toFloat() - offset) - } - - private fun drawVertical( - canvas: Canvas, - x: Float, - y: Float, - ) { - canvas.drawRoundRect( - x - (thickness / 2), - y, - x + (thickness / 2), - y + length, - thickness / 2f, - thickness / 2f, - paint, - ) - } - - private fun drawHorizontal( - canvas: Canvas, - x: Float, - y: Float, - ) { - canvas.drawRoundRect( - x, - y - (thickness / 2), - x + length, - y + (thickness / 2), - thickness / 2f, - thickness / 2f, - paint, - ) - } + paint.style = Paint.Style.FILL } + + fun startAnimating() { + val anim = ObjectAnimator.ofFloat(thickness.toFloat(), maxSpacing.toFloat()) + anim.addUpdateListener { + spacing = it.animatedValue as Float + } + anim.interpolator = AccelerateDecelerateInterpolator() + anim.repeatCount = Animation.INFINITE + anim.repeatMode = ValueAnimator.REVERSE + anim.duration = animationDuration + anim.start() + } + + override fun onMeasure( + widthMeasureSpec: Int, + heightMeasureSpec: Int + ) { + val widthSize = MeasureSpec.getSize(widthMeasureSpec) + val heightSize = MeasureSpec.getSize(heightMeasureSpec) + val desiredSize = (length * 2 + maxSpacing) + + val width = + when (MeasureSpec.getMode(widthMeasureSpec)) { + MeasureSpec.EXACTLY -> widthSize + MeasureSpec.AT_MOST -> min(desiredSize, widthSize) + else -> desiredSize + } + + val height = + when (MeasureSpec.getMode(heightMeasureSpec)) { + MeasureSpec.EXACTLY -> heightSize + MeasureSpec.AT_MOST -> min(desiredSize, heightSize) + else -> desiredSize + } + + setMeasuredDimension(width, height) + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + val thisCanvas = canvas + val centerHorizontal = width / 2f + val centerVertical = height / 2f + val offset = (maxSpacing - spacing) / 2 + drawHorizontal(thisCanvas, offset, centerVertical) + drawHorizontal(thisCanvas, width - length.toFloat() - offset, centerVertical) + + drawVertical(thisCanvas, centerHorizontal, offset) + drawVertical(thisCanvas, centerVertical, height - length.toFloat() - offset) + } + + private fun drawVertical( + canvas: Canvas, + x: Float, + y: Float + ) { + canvas.drawRoundRect( + x - (thickness / 2), + y, + x + (thickness / 2), + y + length, + thickness / 2f, + thickness / 2f, + paint + ) + } + + private fun drawHorizontal( + canvas: Canvas, + x: Float, + y: Float + ) { + canvas.drawRoundRect( + x, + y - (thickness / 2), + x + length, + y + (thickness / 2), + thickness / 2f, + thickness / 2f, + paint + ) + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SupportCollapsibleSection.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SupportCollapsibleSection.kt index 4f10c5ba4..7ec2a2dd2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SupportCollapsibleSection.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/SupportCollapsibleSection.kt @@ -24,14 +24,14 @@ class SupportCollapsibleSection : LinearLayout { constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( context, attrs, - defStyle, + defStyle ) { init(attrs, defStyle) } private fun init( attrs: AttributeSet?, - defStyle: Int, + defStyle: Int ) { val binding = SupportCollapsibleSectionBinding.inflate(context.layoutInflater, this) val a = @@ -39,7 +39,7 @@ class SupportCollapsibleSection : LinearLayout { attrs, R.styleable.SupportCollapsibleSection, defStyle, - 0, + 0 ) orientation = VERTICAL @@ -51,8 +51,8 @@ class SupportCollapsibleSection : LinearLayout { binding.titleView.setTextColor( a.getColor( R.styleable.SupportCollapsibleSection_titleColor, - ContextCompat.getColor(context, R.color.text_primary), - ), + ContextCompat.getColor(context, R.color.text_primary) + ) ) background = ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_window) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.kt index 54301fb63..38a2fc041 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.kt @@ -50,7 +50,7 @@ class Typewriter : androidx.appcompat.widget.AppCompatTextView { hiddenSpan, 0, stringBuilder?.length ?: 0, - Spannable.SPAN_INCLUSIVE_EXCLUSIVE, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE ) index = 0 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/UserRow.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/UserRow.kt index 6cd2b18f4..caffba0ca 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/UserRow.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/UserRow.kt @@ -32,19 +32,19 @@ fun UserRow( extraContent: @Composable (() -> Unit)? = null, endContent: @Composable (() -> Unit)? = null, color: Color? = null, - configManager: AppConfigManager, + configManager: AppConfigManager ) { Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier.fillMaxWidth()) { Box( modifier = - Modifier - .padding(end = 12.dp) - .clip(CircleShape) - .size(40.dp) - .padding( - end = 12.dp, - top = if (avatar?.currentMount?.isNotBlank() == true) 24.dp else 12.dp, - ), + Modifier + .padding(end = 12.dp) + .clip(CircleShape) + .size(40.dp) + .padding( + end = 12.dp, + top = if (avatar?.currentMount?.isNotBlank() == true) 24.dp else 12.dp + ) ) { if (avatar != null) { ComposableAvatarView( @@ -52,7 +52,7 @@ fun UserRow( configManager, Modifier .size(96.dp) - .requiredSize(96.dp), + .requiredSize(96.dp) ) } } @@ -62,7 +62,7 @@ fun UserRow( "@$username", fontSize = 16.sp, fontWeight = FontWeight.Medium, - color = color ?: MaterialTheme.colorScheme.primary, + color = color ?: MaterialTheme.colorScheme.primary ) if (extraContent != null) { extraContent() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/UsernameLabel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/UsernameLabel.kt index 332f53e78..f5d5c34e6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/UsernameLabel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/UsernameLabel.kt @@ -31,105 +31,105 @@ import com.habitrpg.common.habitica.R import com.habitrpg.common.habitica.models.PlayerTier class UsernameLabel - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - ) : LinearLayout(context, attrs) { - private val textView = TextView(context) - private val tierIconView = ImageView(context) +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null +) : LinearLayout(context, attrs) { + private val textView = TextView(context) + private val tierIconView = ImageView(context) - var username: String? = "" - set(value) { - field = value - textView.text = value - } - - var isNPC: Boolean = false - set(value) { - field = value - tier = tier - } - - var tier: Int = 0 - set(value) { - field = value - if (isNPC) { - textView.setTextColor(ContextCompat.getColor(context, R.color.contributor_npc)) - } else { - textView.setTextColor(PlayerTier.getColorForTier(context, value)) - } - if (value == 0) { - tierIconView.visibility = View.GONE - } else { - tierIconView.visibility = View.VISIBLE - tierIconView.setImageBitmap( - HabiticaIconsHelper.imageOfContributorBadge( - value.toFloat(), - isNPC, - ), - ) - } - } - - init { - val textViewParams = - LayoutParams( - FrameLayout.LayoutParams.WRAP_CONTENT, - FrameLayout.LayoutParams.WRAP_CONTENT, - ) - textViewParams.gravity = Gravity.CENTER_VERTICAL - textViewParams.weight = 1.0f - addView(textView, textViewParams) - val padding = context.resources.getDimension(R.dimen.spacing_small).toInt() - textView.setPadding(0, 0, padding, 0) - textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - textView.typeface = Typeface.create(null, 600, false) - } - val iconViewParams = - LayoutParams( - FrameLayout.LayoutParams.WRAP_CONTENT, - FrameLayout.LayoutParams.WRAP_CONTENT, - ) - iconViewParams.gravity = Gravity.CENTER_VERTICAL - addView(tierIconView, iconViewParams) + var username: String? = "" + set(value) { + field = value + textView.text = value } + + var isNPC: Boolean = false + set(value) { + field = value + tier = tier + } + + var tier: Int = 0 + set(value) { + field = value + if (isNPC) { + textView.setTextColor(ContextCompat.getColor(context, R.color.contributor_npc)) + } else { + textView.setTextColor(PlayerTier.getColorForTier(context, value)) + } + if (value == 0) { + tierIconView.visibility = View.GONE + } else { + tierIconView.visibility = View.VISIBLE + tierIconView.setImageBitmap( + HabiticaIconsHelper.imageOfContributorBadge( + value.toFloat(), + isNPC + ) + ) + } + } + + init { + val textViewParams = + LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + textViewParams.gravity = Gravity.CENTER_VERTICAL + textViewParams.weight = 1.0f + addView(textView, textViewParams) + val padding = context.resources.getDimension(R.dimen.spacing_small).toInt() + textView.setPadding(0, 0, padding, 0) + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + textView.typeface = Typeface.create(null, 600, false) + } + val iconViewParams = + LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + iconViewParams.gravity = Gravity.CENTER_VERTICAL + addView(tierIconView, iconViewParams) } +} @Composable fun ComposableUsernameLabel( username: String, tier: Int, modifier: Modifier = Modifier, - isNPC: Boolean = false, + isNPC: Boolean = false ) { Row( horizontalArrangement = Arrangement.spacedBy(2.dp), verticalAlignment = Alignment.CenterVertically, - modifier = modifier, + modifier = modifier ) { ProvideTextStyle(value = TextStyle(fontWeight = FontWeight.SemiBold)) { Text( username, color = - if (isNPC) { - colorResource(id = R.color.contributor_npc) - } else { - Color( - PlayerTier.getColorForTier( - LocalContext.current, - tier, - ), + if (isNPC) { + colorResource(id = R.color.contributor_npc) + } else { + Color( + PlayerTier.getColorForTier( + LocalContext.current, + tier ) - }, + ) + } ) if (tier > 0) { Image( bitmap = - HabiticaIconsHelper.imageOfContributorBadge(tier.toFloat(), isNPC) - .asImageBitmap(), - contentDescription = null, + HabiticaIconsHelper.imageOfContributorBadge(tier.toFloat(), isNPC) + .asImageBitmap(), + contentDescription = null ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValidatingEditText.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValidatingEditText.kt index 232b80389..c72bd7371 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValidatingEditText.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValidatingEditText.kt @@ -11,66 +11,66 @@ import com.habitrpg.android.habitica.databinding.ValidatingEditTextBinding import com.habitrpg.common.habitica.extensions.layoutInflater class ValidatingEditText - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - ) : LinearLayout(context, attrs) { - private var binding: ValidatingEditTextBinding = - ValidatingEditTextBinding.inflate(context.layoutInflater, this) +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null +) : LinearLayout(context, attrs) { + private var binding: ValidatingEditTextBinding = + ValidatingEditTextBinding.inflate(context.layoutInflater, this) - var text: String? - get() = binding.editText.text?.toString() - set(value) = binding.editText.setText(value) - var errorText: String? - get() = binding.errorText.text?.toString() - set(value) { - binding.errorText.text = value - } - var hint: CharSequence? - get() = binding.inputLayout.hint - set(value) { - binding.inputLayout.hint = value - } - var validator: ((String?) -> Boolean)? = null + var text: String? + get() = binding.editText.text?.toString() + set(value) = binding.editText.setText(value) + var errorText: String? + get() = binding.errorText.text?.toString() + set(value) { + binding.errorText.text = value + } + var hint: CharSequence? + get() = binding.inputLayout.hint + set(value) { + binding.inputLayout.hint = value + } + var validator: ((String?) -> Boolean)? = null - val isValid: Boolean - get() = validator?.invoke(text) != false + val isValid: Boolean + get() = validator?.invoke(text) != false - init { - orientation = VERTICAL - context.theme?.obtainStyledAttributes( - attrs, - R.styleable.ValidatingEditText, - 0, - 0, - )?.let { attributes -> - binding.inputLayout.hint = attributes.getString(R.styleable.ValidatingEditText_hint) - binding.editText.maxLines = - attributes.getInt(R.styleable.ValidatingEditText_android_maxLines, 20) - binding.editText.inputType = - attributes.getInt( - R.styleable.ValidatingEditText_android_inputType, - InputType.TYPE_CLASS_TEXT, - ) - } - - binding.editText.setOnFocusChangeListener { _, isEditing -> - if (isEditing) return@setOnFocusChangeListener - showErrorIfNecessary() - } - binding.editText.doOnTextChanged { text, _, _, _ -> - if (binding.errorText.visibility == View.VISIBLE) { - showErrorIfNecessary(text.toString()) - } - } + init { + orientation = VERTICAL + context.theme?.obtainStyledAttributes( + attrs, + R.styleable.ValidatingEditText, + 0, + 0 + )?.let { attributes -> + binding.inputLayout.hint = attributes.getString(R.styleable.ValidatingEditText_hint) + binding.editText.maxLines = + attributes.getInt(R.styleable.ValidatingEditText_android_maxLines, 20) + binding.editText.inputType = + attributes.getInt( + R.styleable.ValidatingEditText_android_inputType, + InputType.TYPE_CLASS_TEXT + ) } - fun showErrorIfNecessary(currentText: String? = null) { - if (validator?.invoke(currentText ?: text) == true || errorText?.isNotBlank() != true) { - binding.errorText.visibility = View.GONE - } else { - binding.errorText.visibility = View.VISIBLE + binding.editText.setOnFocusChangeListener { _, isEditing -> + if (isEditing) return@setOnFocusChangeListener + showErrorIfNecessary() + } + binding.editText.doOnTextChanged { text, _, _, _ -> + if (binding.errorText.visibility == View.VISIBLE) { + showErrorIfNecessary(text.toString()) } } } + + fun showErrorIfNecessary(currentText: String? = null) { + if (validator?.invoke(currentText ?: text) == true || errorText?.isNotBlank() != true) { + binding.errorText.visibility = View.GONE + } else { + binding.errorText.visibility = View.VISIBLE + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ads/AdButton.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ads/AdButton.kt index 840e4fd12..4f3bc4e7e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ads/AdButton.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ads/AdButton.kt @@ -23,130 +23,130 @@ import kotlin.time.DurationUnit import kotlin.time.toDuration class AdButton - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - ) : LinearLayout(context, attrs) { - var state: State = State.READY - set(value) { - field = value - updateViews() - } - - enum class State { - EMPTY, - READY, - LOADING, - UNAVAILABLE, +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null +) : LinearLayout(context, attrs) { + var state: State = State.READY + set(value) { + field = value + updateViews() } - private var updateJob: Job? = null - private var nextAdDate: Date? = null - private val binding = AdButtonBinding.inflate(context.layoutInflater, this) + enum class State { + EMPTY, + READY, + LOADING, + UNAVAILABLE + } - private var activeBackgroundRes: Int = R.drawable.ad_button_background + private var updateJob: Job? = null + private var nextAdDate: Date? = null + private val binding = AdButtonBinding.inflate(context.layoutInflater, this) - var text: String = "" - set(value) { - field = value - updateViews() - } + private var activeBackgroundRes: Int = R.drawable.ad_button_background - init { - context.theme?.obtainStyledAttributes( - attrs, - R.styleable.AdButton, - 0, - 0, - )?.let { attributes -> - text = attributes.getString(R.styleable.AdButton_text) ?: "" - binding.currencyView.currency = attributes.getString(R.styleable.AdButton_currency) - activeBackgroundRes = - attributes.getResourceId( - R.styleable.AdButton_activeBackground, - R.drawable.ad_button_background, - ) - binding.textView.setTextColor( - attributes.getColor( - R.styleable.AdButton_textColor, - ContextCompat.getColor(context, R.color.white), - ), + var text: String = "" + set(value) { + field = value + updateViews() + } + + init { + context.theme?.obtainStyledAttributes( + attrs, + R.styleable.AdButton, + 0, + 0 + )?.let { attributes -> + text = attributes.getString(R.styleable.AdButton_text) ?: "" + binding.currencyView.currency = attributes.getString(R.styleable.AdButton_currency) + activeBackgroundRes = + attributes.getResourceId( + R.styleable.AdButton_activeBackground, + R.drawable.ad_button_background ) - } - binding.currencyView.setTextColor(ContextCompat.getColor(context, R.color.white)) - binding.currencyView.value = 0.0 - if (binding.currencyView.currency?.isNotBlank() != true) { - binding.currencyView.visibility = View.GONE - } - gravity = Gravity.CENTER - state = State.READY + binding.textView.setTextColor( + attributes.getColor( + R.styleable.AdButton_textColor, + ContextCompat.getColor(context, R.color.white) + ) + ) } - - private fun updateViews() { - when (state) { - State.READY -> { - binding.loadingIndicator.visibility = GONE - binding.textView.text = text - binding.textView.alpha = 1.0f - binding.textView.visibility = VISIBLE - binding.currencyView.visibility = VISIBLE - setBackgroundResource(activeBackgroundRes) - } - - State.UNAVAILABLE -> { - binding.loadingIndicator.visibility = GONE - binding.textView.text = - context.getString( - R.string.available_in, - nextAdDate?.getShortRemainingString() ?: "", - ) - binding.textView.alpha = 0.75f - binding.textView.visibility = VISIBLE - binding.currencyView.visibility = GONE - setBackgroundResource(R.drawable.ad_button_background_disabled) - } - - State.EMPTY -> { - binding.loadingIndicator.visibility = GONE - binding.textView.visibility = GONE - binding.currencyView.visibility = GONE - } - - State.LOADING -> { - binding.loadingIndicator.visibility = VISIBLE - binding.textView.visibility = GONE - binding.currencyView.visibility = GONE - } - } - isEnabled = state == State.READY + binding.currencyView.setTextColor(ContextCompat.getColor(context, R.color.white)) + binding.currencyView.value = 0.0 + if (binding.currencyView.currency?.isNotBlank() != true) { + binding.currencyView.visibility = View.GONE } + gravity = Gravity.CENTER + state = State.READY + } - fun updateForAdType( - type: AdType, - lifecycleScope: LifecycleCoroutineScope, - ) { - if (updateJob?.isActive == true) { - updateJob?.cancel() + private fun updateViews() { + when (state) { + State.READY -> { + binding.loadingIndicator.visibility = GONE + binding.textView.text = text + binding.textView.alpha = 1.0f + binding.textView.visibility = VISIBLE + binding.currencyView.visibility = VISIBLE + setBackgroundResource(activeBackgroundRes) } - nextAdDate = AdHandler.nextAdAllowedDate(type) - if (nextAdDate?.after(Date()) == true) { - updateJob = - lifecycleScope.launch(Dispatchers.Main) { - while (nextAdDate?.after(Date()) == true) { - val remaining = + + State.UNAVAILABLE -> { + binding.loadingIndicator.visibility = GONE + binding.textView.text = + context.getString( + R.string.available_in, + nextAdDate?.getShortRemainingString() ?: "" + ) + binding.textView.alpha = 0.75f + binding.textView.visibility = VISIBLE + binding.currencyView.visibility = GONE + setBackgroundResource(R.drawable.ad_button_background_disabled) + } + + State.EMPTY -> { + binding.loadingIndicator.visibility = GONE + binding.textView.visibility = GONE + binding.currencyView.visibility = GONE + } + + State.LOADING -> { + binding.loadingIndicator.visibility = VISIBLE + binding.textView.visibility = GONE + binding.currencyView.visibility = GONE + } + } + isEnabled = state == State.READY + } + + fun updateForAdType( + type: AdType, + lifecycleScope: LifecycleCoroutineScope + ) { + if (updateJob?.isActive == true) { + updateJob?.cancel() + } + nextAdDate = AdHandler.nextAdAllowedDate(type) + if (nextAdDate?.after(Date()) == true) { + updateJob = + lifecycleScope.launch(Dispatchers.Main) { + while (nextAdDate?.after(Date()) == true) { + val remaining = + ( ( - ( - nextAdDate?.time - ?: 0L + nextAdDate?.time + ?: 0L ) - Date().time ).toDuration(DurationUnit.MILLISECONDS) - state = if (remaining.isNegative()) State.READY else State.UNAVAILABLE - updateViews() - delay(1.toDuration(remaining.getMinuteOrSeconds())) - } - state = State.READY + state = if (remaining.isNegative()) State.READY else State.UNAVAILABLE + updateViews() + delay(1.toDuration(remaining.getMinuteOrSeconds())) } - } + state = State.READY + } } } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDialog.kt index d495778b4..deb69a01a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDialog.kt @@ -28,84 +28,84 @@ class AchievementDialog(context: Context) : HabiticaAlertDialog(context) { fun setType( type: String, message: String?, - text: String?, + text: String? ) { when (type) { Notification.Type.ACHIEVEMENT_PARTY_UP.type -> configure( R.string.partyUpTitle, R.string.partyUpDescription, - "partyUp", + "partyUp" ) Notification.Type.ACHIEVEMENT_PARTY_ON.type -> configure( R.string.partyOnTitle, R.string.partyOnDescription, - "partyOn", + "partyOn" ) Notification.Type.ACHIEVEMENT_BEAST_MASTER.type -> configure( R.string.beastMasterTitle, R.string.beastMasterDescription, - "rat", + "rat" ) Notification.Type.ACHIEVEMENT_MOUNT_MASTER.type -> configure( R.string.mountMasterTitle, R.string.mountMasterDescription, - "wolf", + "wolf" ) Notification.Type.ACHIEVEMENT_TRIAD_BINGO.type -> configure( R.string.triadBingoTitle, R.string.triadBingoDescription, - "triadbingo", + "triadbingo" ) Notification.Type.ACHIEVEMENT_GUILD_JOINED.type -> configure( R.string.joinedGuildTitle, R.string.joinedGuildDescription, - "guild", + "guild" ) Notification.Type.ACHIEVEMENT_CHALLENGE_JOINED.type -> configure( R.string.joinedChallengeTitle, R.string.joinedChallengeDescription, - "challenge", + "challenge" ) Notification.Type.ACHIEVEMENT_INVITED_FRIEND.type -> configure( R.string.inviteFriendTitle, R.string.inviteFriendDescription, - "friends", + "friends" ) "createdTask" -> configure( R.string.createdTaskTitle, R.string.createdTaskDescription, - type, + type ) "completedTask" -> configure( R.string.completedTaskTitle, R.string.completedTaskDescription, - type, + type ) "hatchedPet" -> configure( R.string.hatchedPetTitle, R.string.hatchedPetDescription, - type, + type ) "fedPet" -> configure(R.string.fedPetTitle, R.string.fedPetDescription, type) @@ -113,14 +113,14 @@ class AchievementDialog(context: Context) : HabiticaAlertDialog(context) { configure( R.string.purchasedEquipmentTitle, R.string.purchasedEquipmentDescription, - type, + type ) Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type -> configure( R.string.onboardingCompleteTitle, R.string.onboardingCompleteDescription, - "onboardingComplete", + "onboardingComplete" ) else -> configure(message ?: "", text ?: "", type) @@ -130,7 +130,7 @@ class AchievementDialog(context: Context) : HabiticaAlertDialog(context) { private fun configure( titleID: Int, descriptionID: Int, - iconName: String, + iconName: String ) { configure(context.getString(titleID), context.getString(descriptionID), iconName) } @@ -138,7 +138,7 @@ class AchievementDialog(context: Context) : HabiticaAlertDialog(context) { private fun configure( title: String, description: String, - iconName: String, + iconName: String ) { binding.titleView.text = title binding.descriptionView.setText(description.fromHtml(), TextView.BufferType.SPANNABLE) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt index 716c39c46..5fc93fb36 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt @@ -26,7 +26,7 @@ class FirstDropDialog(context: Context) : HabiticaAlertDialog(context) { fun configure( egg: String, - hatchingPotion: String, + hatchingPotion: String ) { eggView?.loadImage("Pet_Egg_$egg") hatchingPotionView?.loadImage("Pet_HatchingPotion_$hatchingPotion") diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt index a453f4789..57dc432ee 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt @@ -22,9 +22,9 @@ import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.DialogHabiticaBaseBinding -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.android.habitica.ui.activities.BaseActivity import com.habitrpg.common.habitica.extensions.dpToPx +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.extensions.layoutInflater import com.plattysoft.leonids.ParticleSystem import kotlinx.coroutines.CoroutineScope @@ -192,7 +192,7 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. isPrimary: Boolean, isDestructive: Boolean = false, autoDismiss: Boolean = true, - function: ((HabiticaAlertDialog, Int) -> Unit)? = null, + function: ((HabiticaAlertDialog, Int) -> Unit)? = null ): Button { return addButton(context.getString(stringRes), isPrimary, isDestructive, autoDismiss, function) } @@ -202,7 +202,7 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. isPrimary: Boolean, isDestructive: Boolean = false, autoDismiss: Boolean = true, - function: ((HabiticaAlertDialog, Int) -> Unit)? = null, + function: ((HabiticaAlertDialog, Int) -> Unit)? = null ): Button { val button: Button = if (isPrimary) { @@ -226,7 +226,7 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. fun addButton( buttonView: View, autoDismiss: Boolean = true, - function: ((HabiticaAlertDialog, Int) -> Unit)? = null, + function: ((HabiticaAlertDialog, Int) -> Unit)? = null ): View { val weakThis = WeakReference(this) val buttonIndex = binding.buttonsWrapper.childCount @@ -325,8 +325,8 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. (dialogQueue[0].context as? BaseActivity)?.lifecycleScope?.launch(context = Dispatchers.Main) { delay(500L) if (dialogQueue.size > 0 && ( - (dialogQueue[0].context as? Activity)?.isFinishing == false || - ((dialogQueue[0].context as? ContextThemeWrapper)?.baseContext as? Activity)?.isFinishing == false + (dialogQueue[0].context as? Activity)?.isFinishing == false || + ((dialogQueue[0].context as? ContextThemeWrapper)?.baseContext as? Activity)?.isFinishing == false ) ) { dialogQueue[0].show() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaProgressDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaProgressDialog.kt index 2c7dee600..dcca78ff0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaProgressDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaProgressDialog.kt @@ -16,7 +16,7 @@ class HabiticaProgressDialog(context: Context) : HabiticaAlertDialog(context) { companion object { fun show( context: FragmentActivity, - titleID: Int, + titleID: Int ): HabiticaProgressDialog { return show(context, context.getString(titleID)) } @@ -24,7 +24,7 @@ class HabiticaProgressDialog(context: Context) : HabiticaAlertDialog(context) { fun show( context: FragmentActivity, title: String?, - dialogWidth: Int = 300, + dialogWidth: Int = 300 ): HabiticaProgressDialog { val dialog = HabiticaProgressDialog(context) val composeView = ComposeView(context) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt index af87e524b..b321bbab4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt @@ -54,7 +54,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { val hiltEntryPoint = EntryPointAccessors.fromApplication( context, - PetSuggestHatchDialogEntryPoint::class.java, + PetSuggestHatchDialogEntryPoint::class.java ) hatchPetUseCase = hiltEntryPoint.useCase() userViewModel = hiltEntryPoint.mainUserViewModel() @@ -77,7 +77,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { potionCount: Int, hasUnlockedEgg: Boolean, hasUnlockedPotion: Boolean, - hasMount: Boolean, + hasMount: Boolean ) { binding.eggView.loadImage("Pet_Egg_${pet.animal}") binding.hatchingPotionView.loadImage("Pet_HatchingPotion_${pet.color}") @@ -93,7 +93,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { egg?.text ?: pet.animal.replaceFirstChar { if (it.isLowerCase()) { it.titlecase( - Locale.getDefault(), + Locale.getDefault() ) } else { it.toString() @@ -103,7 +103,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { potion?.text ?: pet.color.replaceFirstChar { if (it.isLowerCase()) { it.titlecase( - Locale.getDefault(), + Locale.getDefault() ) } else { it.toString() @@ -128,7 +128,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { context.getString( R.string.can_hatch_pet, eggName, - potionName, + potionName ) addButton(R.string.hatch, true, false) { _, _ -> val thisPotion = potion ?: return@addButton @@ -149,7 +149,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { context.getString( R.string.suggest_pet_hatch_again_missing_both, eggName, - potionName, + potionName ) } else if (!hasEgg) { binding.descriptionView.text = @@ -158,7 +158,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { binding.descriptionView.text = context.getString( R.string.suggest_pet_hatch_again_missing_potion, - potionName, + potionName ) } } else { @@ -167,7 +167,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { context.getString( R.string.suggest_pet_hatch_missing_both, eggName, - potionName, + potionName ) } else if (!hasEgg) { binding.descriptionView.text = @@ -203,16 +203,16 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { val activity = (getActivity() as? MainActivity) ?: ( HabiticaBaseApplication.getInstance( - context, + context )?.currentActivity?.get() as? MainActivity - ) ?: return@addButton + ) ?: return@addButton if ((userViewModel.user.value?.gemCount ?: hatchPrice) < hatchPrice) { InsufficientGemsDialog(activity, hatchPrice).show() Analytics.sendEvent( "show insufficient gems modal", EventCategory.BEHAVIOUR, HitType.EVENT, - mapOf("reason" to "pet suggest modal"), + mapOf("reason" to "pet suggest modal") ) return@addButton } @@ -226,7 +226,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { activity.inventoryRepository.purchaseItem( "hatchingPotions", thisPotion.key, - 1, + 1 ) } activity.userRepository.retrieveUser(true, forced = true) @@ -253,15 +253,15 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { private fun hatchPet( potion: HatchingPotion, - egg: Egg, + egg: Egg ) { longLivingScope.launchCatching { hatchPetUseCase.callInteractor( HatchPetUseCase.RequestValues( potion, egg, - context, - ), + context + ) ) } } @@ -269,7 +269,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { private fun getItemPrice( pet: Animal, item: Item?, - hasUnlocked: Boolean, + hasUnlocked: Boolean ): Int { if (pet.type == "drop" || (pet.type == "quest" && hasUnlocked)) { return item?.value ?: 0 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialog.kt index f45db300b..8c6b551b5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialog.kt @@ -34,7 +34,7 @@ class QuestCompletedDialog(context: Context) : HabiticaAlertDialog(context) { fun showWithQuest( context: Context, quest: QuestContent, - userRepository: UserRepository, + userRepository: UserRepository ) { if (isShowingDialog) return diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt index 81317c73e..c277d4b79 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt @@ -41,7 +41,7 @@ class QuestCompletedDialogContent : LinearLayout { binding.titleTextView.setText(questContent.text.fromHtml(), TextView.BufferType.SPANNABLE) binding.notesTextView.setText( questContent.completion.fromHtml(), - TextView.BufferType.SPANNABLE, + TextView.BufferType.SPANNABLE ) binding.imageView.loadImage("quest_" + questContent.key) @@ -69,7 +69,7 @@ class QuestCompletedDialogContent : LinearLayout { inflater?.inflate( R.layout.row_quest_reward_imageview, binding.rewardsList, - false, + false ) as? ViewGroup val imageView = view?.findViewById(R.id.imageView) imageView?.scaleType = ImageView.ScaleType.CENTER @@ -85,7 +85,7 @@ class QuestCompletedDialogContent : LinearLayout { inflater?.inflate( R.layout.row_quest_reward_imageview, binding.rewardsList, - false, + false ) as? ViewGroup val imageView = view?.findViewById(R.id.imageView) imageView?.scaleType = ImageView.ScaleType.CENTER @@ -100,7 +100,7 @@ class QuestCompletedDialogContent : LinearLayout { private fun addRewardsRow( inflater: LayoutInflater?, item: QuestDropItem, - containerView: ViewGroup?, + containerView: ViewGroup? ) { val view = inflater?.inflate(R.layout.row_quest_reward, containerView, false) as? ViewGroup val imageView = view?.findViewById(R.id.imageView) as? PixelArtView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewView.kt index 1e8366ab8..a44749ae8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewView.kt @@ -37,27 +37,27 @@ fun OverviewItem( text: String, iconName: String?, modifier: Modifier = Modifier, - isTwoHanded: Boolean = false, + isTwoHanded: Boolean = false ) { val hasIcon = isTwoHanded || ( iconName?.isNotBlank() == true && iconName != "shirt_" && !iconName.endsWith( - "_none", + "_none" ) && !iconName.endsWith("_base_0") && !iconName.endsWith("_") - ) + ) Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = - modifier - .width(76.dp), + modifier + .width(76.dp) ) { Box( Modifier .size(76.dp) .clip(MaterialTheme.shapes.small) .background(HabiticaTheme.colors.pixelArtBackground(hasIcon)), - contentAlignment = Alignment.Center, + contentAlignment = Alignment.Center ) { if (isTwoHanded) { Image(painterResource(R.drawable.equipment_two_handed), null) @@ -65,8 +65,8 @@ fun OverviewItem( PixelArtView( imageName = iconName, modifier = - Modifier - .size(76.dp), + Modifier + .size(76.dp) ) } else { Image(painterResource(R.drawable.empty_slot), null) @@ -77,7 +77,7 @@ fun OverviewItem( style = HabiticaTheme.typography.caption2, color = colorResource(R.color.text_secondary), textAlign = TextAlign.Center, - modifier = Modifier.padding(top = 4.dp), + modifier = Modifier.padding(top = 4.dp) ) } } @@ -87,50 +87,50 @@ fun EquipmentOverviewView( outfit: Outfit?, isUsingTwohanded: Boolean, onEquipmentTap: (String, String?) -> Unit, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { Column( verticalArrangement = Arrangement.spacedBy(18.dp), modifier = - modifier - .fillMaxWidth() - .clip(MaterialTheme.shapes.medium) - .background(colorResource(R.color.equipment_column_background)) - .padding(12.dp), + modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .background(colorResource(R.color.equipment_column_background)) + .padding(12.dp) ) { Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { OverviewItem( stringResource(R.string.outfit_weapon), outfit?.weapon.let { "shop_$it" }, modifier = - Modifier.clickable { - onEquipmentTap("weapon", outfit?.weapon) - }, + Modifier.clickable { + onEquipmentTap("weapon", outfit?.weapon) + } ) OverviewItem( stringResource(R.string.outfit_shield), outfit?.shield.let { "shop_$it" }, modifier = - Modifier.clickable { - onEquipmentTap("shield", outfit?.shield) - }, - isUsingTwohanded, + Modifier.clickable { + onEquipmentTap("shield", outfit?.shield) + }, + isUsingTwohanded ) OverviewItem( stringResource(R.string.outfit_head), outfit?.head.let { "shop_$it" }, modifier = - Modifier.clickable { - onEquipmentTap("head", outfit?.head) - }, + Modifier.clickable { + onEquipmentTap("head", outfit?.head) + } ) OverviewItem( stringResource(R.string.outfit_armor), outfit?.armor.let { "shop_$it" }, modifier = - Modifier.clickable { - onEquipmentTap("armor", outfit?.armor) - }, + Modifier.clickable { + onEquipmentTap("armor", outfit?.armor) + } ) } Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { @@ -138,33 +138,33 @@ fun EquipmentOverviewView( stringResource(R.string.outfit_headAccessory), outfit?.headAccessory.let { "shop_$it" }, modifier = - Modifier.clickable { - onEquipmentTap("headAccessory", outfit?.headAccessory) - }, + Modifier.clickable { + onEquipmentTap("headAccessory", outfit?.headAccessory) + } ) OverviewItem( stringResource(R.string.outfit_body), outfit?.body.let { "shop_$it" }, modifier = - Modifier.clickable { - onEquipmentTap("body", outfit?.body) - }, + Modifier.clickable { + onEquipmentTap("body", outfit?.body) + } ) OverviewItem( stringResource(R.string.outfit_back), outfit?.back.let { "shop_$it" }, modifier = - Modifier.clickable { - onEquipmentTap("back", outfit?.back) - }, + Modifier.clickable { + onEquipmentTap("back", outfit?.back) + } ) OverviewItem( stringResource(R.string.outfit_eyewear), outfit?.eyeWear.let { "shop_$it" }, modifier = - Modifier.clickable { - onEquipmentTap("eyewear", outfit?.eyeWear) - }, + Modifier.clickable { + onEquipmentTap("eyewear", outfit?.eyeWear) + } ) } } @@ -176,49 +176,49 @@ fun AvatarCustomizationOverviewView( outfit: Outfit?, onCustomizationTap: (String, String?) -> Unit, onAvatarEquipmentTap: (String, String?) -> Unit, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { Column( verticalArrangement = Arrangement.spacedBy(18.dp), modifier = - modifier - .fillMaxWidth() - .clip(MaterialTheme.shapes.medium) - .background(colorResource(R.color.equipment_column_background)) - .padding(12.dp), + modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .background(colorResource(R.color.equipment_column_background)) + .padding(12.dp) ) { Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { OverviewItem( stringResource(R.string.avatar_shirt), preferences?.shirt.let { "icon_${preferences?.size}_shirt_$it" }, modifier = - Modifier.clickable { - onCustomizationTap("shirt", null) - }, + Modifier.clickable { + onCustomizationTap("shirt", null) + } ) OverviewItem( stringResource(R.string.avatar_skin), preferences?.skin.let { "icon_skin_$it" }, modifier = - Modifier.clickable { - onCustomizationTap("skin", null) - }, + Modifier.clickable { + onCustomizationTap("skin", null) + } ) OverviewItem( stringResource(R.string.avatar_hair_color), if (preferences?.hair?.color != null && preferences.hair?.color != "") "icon_hair_bangs_1_" + preferences.hair?.color else "", modifier = - Modifier.clickable { - onCustomizationTap("hair", "color") - }, + Modifier.clickable { + onCustomizationTap("hair", "color") + } ) OverviewItem( stringResource(R.string.avatar_hair_bangs), if (preferences?.hair?.bangs != null && preferences.hair?.bangs != 0) "icon_hair_bangs_" + preferences.hair?.bangs + "_" + preferences.hair?.color else "", modifier = - Modifier.clickable { - onCustomizationTap("hair", "bangs") - }, + Modifier.clickable { + onCustomizationTap("hair", "bangs") + } ) } Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { @@ -226,33 +226,33 @@ fun AvatarCustomizationOverviewView( stringResource(R.string.avatar_style), if (preferences?.hair?.base != null && preferences.hair?.base != 0) "icon_hair_base_" + preferences.hair?.base + "_" + preferences.hair?.color else "", modifier = - Modifier.clickable { - onCustomizationTap("hair", "base") - }, + Modifier.clickable { + onCustomizationTap("hair", "base") + } ) OverviewItem( stringResource(R.string.avatar_mustache), if (preferences?.hair?.mustache != null && preferences.hair?.mustache != 0) "icon_hair_mustache_" + preferences.hair?.mustache + "_" + preferences.hair?.color else "", modifier = - Modifier.clickable { - onCustomizationTap("hair", "mustache") - }, + Modifier.clickable { + onCustomizationTap("hair", "mustache") + } ) OverviewItem( stringResource(R.string.avatar_beard), if (preferences?.hair?.beard != null && preferences.hair?.beard != 0) "icon_hair_beard_" + preferences.hair?.beard + "_" + preferences.hair?.color else "", modifier = - Modifier.clickable { - onCustomizationTap("hair", "beard") - }, + Modifier.clickable { + onCustomizationTap("hair", "beard") + } ) OverviewItem( stringResource(R.string.avatar_flower), if (preferences?.hair?.flower != null && preferences.hair?.flower != 0) "icon_hair_flower_" + preferences.hair?.flower else "", modifier = - Modifier.clickable { - onCustomizationTap("hair", "flower") - }, + Modifier.clickable { + onCustomizationTap("hair", "flower") + } ) } Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { @@ -260,33 +260,33 @@ fun AvatarCustomizationOverviewView( stringResource(R.string.avatar_wheelchair), preferences?.chair?.let { if (it.startsWith("handleless")) "icon_chair_$it" else "icon_$it" }, modifier = - Modifier.clickable { - onCustomizationTap("chair", null) - }, + Modifier.clickable { + onCustomizationTap("chair", null) + } ) OverviewItem( stringResource(R.string.avatar_background), preferences?.background.let { "icon_background_$it" }, modifier = - Modifier.clickable { - onCustomizationTap("background", null) - }, + Modifier.clickable { + onCustomizationTap("background", null) + } ) OverviewItem( stringResource(R.string.animal_ears), outfit?.headAccessory.let { "shop_$it" }, modifier = - Modifier.clickable { - onAvatarEquipmentTap("headAccessory", "animal") - }, + Modifier.clickable { + onAvatarEquipmentTap("headAccessory", "animal") + } ) OverviewItem( stringResource(R.string.animal_tail), outfit?.back.let { "shop_$it" }, modifier = - Modifier.clickable { - onAvatarEquipmentTap("back", "animal") - }, + Modifier.clickable { + onAvatarEquipmentTap("back", "animal") + } ) } } @@ -298,7 +298,7 @@ fun EquipmentOverviewItemPreview() { Column(Modifier.width(320.dp)) { Row( modifier = Modifier.background(colorResource(id = R.color.equipment_column_background)), - horizontalArrangement = Arrangement.spacedBy(8.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp) ) { OverviewItem("Main-Hand", "shop_weapon_warrior_1") OverviewItem("Off-Hand", null, isTwoHanded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt index 95b0273d4..6dcfb616f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt @@ -23,7 +23,6 @@ import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext /** @@ -51,7 +50,7 @@ class InsufficientGemsDialog(val parentActivity: Activity, var gemPrice: Int) : val hiltEntryPoint = EntryPointAccessors.fromApplication( parentActivity, - InsufficientGemsDialogEntryPoint::class.java, + InsufficientGemsDialogEntryPoint::class.java ) insufficientGemsUseCase = hiltEntryPoint.insufficientGemsUseCase() configManager = hiltEntryPoint.configManager() @@ -67,11 +66,11 @@ class InsufficientGemsDialog(val parentActivity: Activity, var gemPrice: Int) : textView.setText(R.string.insufficientGems) addButton( R.string.see_other_options, - true, + true ) { _, _ -> MainNavigationController.navigate( R.id.gemPurchaseActivity, - bundleOf(Pair("openSubscription", false)), + bundleOf(Pair("openSubscription", false)) ) } addCloseButton() @@ -103,14 +102,14 @@ class InsufficientGemsDialog(val parentActivity: Activity, var gemPrice: Int) : purchaseButton?.setOnClickListener { FirebaseAnalytics.getInstance(context).logEvent( "purchased_gems_from_insufficient", - bundleOf(Pair("gemPrice", gemPrice), Pair("sku", "")), + bundleOf(Pair("gemPrice", gemPrice), Pair("sku", "")) ) MainScope().launchCatching { insufficientGemsUseCase.callInteractor( InsufficientGemsUseCase.RequestValues( gemPrice, - parentActivity, - ), + parentActivity + ) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientHourglassesDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientHourglassesDialog.kt index 3cab53d00..a81576cef 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientHourglassesDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientHourglassesDialog.kt @@ -16,11 +16,11 @@ class InsufficientHourglassesDialog(context: Context) : InsufficientCurrencyDial addButton( R.string.get_hourglasses, - true, + true ) { _, _ -> MainNavigationController.navigate( R.id.gemPurchaseActivity, - bundleOf(Pair("openSubscription", true)), + bundleOf(Pair("openSubscription", true)) ) } addCloseButton() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LoginBackgroundView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LoginBackgroundView.kt index 4cd9933c2..5ad4a6252 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LoginBackgroundView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LoginBackgroundView.kt @@ -74,7 +74,7 @@ class LoginBackgroundView(context: Context, attrs: AttributeSet?) : RelativeLayo override fun onMeasure( widthMeasureSpec: Int, - heightMeasureSpec: Int, + heightMeasureSpec: Int ) { this.viewWidth = MeasureSpec.getSize(widthMeasureSpec) this.setMeasuredDimension(viewWidth, viewHeight) @@ -89,7 +89,7 @@ class LoginBackgroundView(context: Context, attrs: AttributeSet?) : RelativeLayo l: Int, t: Int, r: Int, - b: Int, + b: Int ) { super.onLayout(changed, l, t, r, b) updateStarLayoutParams() @@ -102,7 +102,7 @@ class LoginBackgroundView(context: Context, attrs: AttributeSet?) : RelativeLayo private fun generateStars( largeCount: Int, mediumCount: Int, - smallCount: Int, + smallCount: Int ) { removeStarViews() repeat((0 until largeCount).count()) { generateStar(2) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.kt index cd2c0f95d..3c524cc68 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.kt @@ -56,7 +56,7 @@ class StarView : AppCompatImageView { blinkIndex++ runBlink() } - }, + } ) try { animator.start() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/BottomNavigationItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/BottomNavigationItem.kt index d0143eece..d61f85587 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/BottomNavigationItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/BottomNavigationItem.kt @@ -15,78 +15,78 @@ import com.habitrpg.common.habitica.extensions.layoutInflater import com.habitrpg.common.habitica.extensions.setTintWith class BottomNavigationItem - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - ) : RelativeLayout(context, attrs, defStyleAttr) { - private var selectedIcon: Drawable? = null - private var icon: Drawable? = null - private val binding = BottomNavigationItemBinding.inflate(context.layoutInflater, this) +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr) { + private var selectedIcon: Drawable? = null + private var icon: Drawable? = null + private val binding = BottomNavigationItemBinding.inflate(context.layoutInflater, this) - private var selectedVisibility = View.VISIBLE - private var deselectedVisibility = View.VISIBLE + private var selectedVisibility = View.VISIBLE + private var deselectedVisibility = View.VISIBLE - var isActive = false - set(value) { - field = value - if (isActive) { - binding.selectedTitleView.visibility = selectedVisibility - binding.titleView.visibility = View.GONE - binding.iconView.setImageDrawable(selectedIcon) - if (context.isUsingNightModeResources()) { - binding.iconView.drawable.setTintWith( - context.getThemeColor(R.attr.colorPrimaryDistinct), - PorterDuff.Mode.SRC_ATOP, - ) - } else { - binding.iconView.drawable.setTintWith( - ContextCompat.getColor( - context, - R.color.white, - ), - PorterDuff.Mode.SRC_ATOP, - ) - } - } else { - binding.selectedTitleView.visibility = View.GONE - binding.iconView.setImageDrawable(icon) - binding.titleView.visibility = deselectedVisibility + var isActive = false + set(value) { + field = value + if (isActive) { + binding.selectedTitleView.visibility = selectedVisibility + binding.titleView.visibility = View.GONE + binding.iconView.setImageDrawable(selectedIcon) + if (context.isUsingNightModeResources()) { binding.iconView.drawable.setTintWith( - context.getThemeColor(R.attr.textColorPrimaryDark), - PorterDuff.Mode.SRC_ATOP, + context.getThemeColor(R.attr.colorPrimaryDistinct), + PorterDuff.Mode.SRC_ATOP + ) + } else { + binding.iconView.drawable.setTintWith( + ContextCompat.getColor( + context, + R.color.white + ), + PorterDuff.Mode.SRC_ATOP ) } - } - - var badgeCount: Int = 0 - set(value) { - field = value - if (value == 0) { - binding.badge.visibility = View.INVISIBLE - } else { - binding.badge.visibility = View.VISIBLE - binding.badge.text = value.toString() - } - } - - init { - val attributes = - context.theme?.obtainStyledAttributes( - attrs, - R.styleable.BottomNavigationItem, - 0, - 0, - ) - if (attributes != null) { - icon = attributes.getDrawable(R.styleable.BottomNavigationItem_iconDrawable) - selectedIcon = - attributes.getDrawable(R.styleable.BottomNavigationItem_selectedIconDrawable) + } else { + binding.selectedTitleView.visibility = View.GONE binding.iconView.setImageDrawable(icon) - binding.titleView.text = attributes.getString(R.styleable.BottomNavigationItem_title) - binding.selectedTitleView.text = - attributes.getString(R.styleable.BottomNavigationItem_title) + binding.titleView.visibility = deselectedVisibility + binding.iconView.drawable.setTintWith( + context.getThemeColor(R.attr.textColorPrimaryDark), + PorterDuff.Mode.SRC_ATOP + ) } } + + var badgeCount: Int = 0 + set(value) { + field = value + if (value == 0) { + binding.badge.visibility = View.INVISIBLE + } else { + binding.badge.visibility = View.VISIBLE + binding.badge.text = value.toString() + } + } + + init { + val attributes = + context.theme?.obtainStyledAttributes( + attrs, + R.styleable.BottomNavigationItem, + 0, + 0 + ) + if (attributes != null) { + icon = attributes.getDrawable(R.styleable.BottomNavigationItem_iconDrawable) + selectedIcon = + attributes.getDrawable(R.styleable.BottomNavigationItem_selectedIconDrawable) + binding.iconView.setImageDrawable(icon) + binding.titleView.text = attributes.getString(R.styleable.BottomNavigationItem_title) + binding.selectedTitleView.text = + attributes.getString(R.styleable.BottomNavigationItem_title) + } } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/BottomNavigationSubmenuItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/BottomNavigationSubmenuItem.kt index 4383636af..5b34e1cf6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/BottomNavigationSubmenuItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/BottomNavigationSubmenuItem.kt @@ -8,41 +8,41 @@ import com.habitrpg.android.habitica.databinding.BottomNavigationSubmenuBinding import com.habitrpg.common.habitica.extensions.layoutInflater class BottomNavigationSubmenuItem - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - ) : RelativeLayout(context, attrs, defStyleAttr) { - private val binding = BottomNavigationSubmenuBinding.inflate(context.layoutInflater, this) +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr) { + private val binding = BottomNavigationSubmenuBinding.inflate(context.layoutInflater, this) - var onAddListener: (() -> Unit)? = null + var onAddListener: (() -> Unit)? = null - val measuredTitleWidth: Int - get() { - binding.titleView.measure(width, height) - return binding.titleView.measuredWidth - } - - var icon: Drawable? = null - set(value) { - field = value - binding.iconView.setImageDrawable(value) - } - var title: String? = null - set(value) { - field = value - binding.titleView.text = title - } - - init { - binding.iconView.setOnClickListener { onAddListener?.invoke() } - binding.titleView.setOnClickListener { onAddListener?.invoke() } + val measuredTitleWidth: Int + get() { + binding.titleView.measure(width, height) + return binding.titleView.measuredWidth } - fun setTitleWidth(width: Int) { - val layoutParams = binding.titleView.layoutParams as? LayoutParams - layoutParams?.width = width - binding.titleView.layoutParams = layoutParams + var icon: Drawable? = null + set(value) { + field = value + binding.iconView.setImageDrawable(value) } + var title: String? = null + set(value) { + field = value + binding.titleView.text = title + } + + init { + binding.iconView.setOnClickListener { onAddListener?.invoke() } + binding.titleView.setOnClickListener { onAddListener?.invoke() } } + + fun setTitleWidth(width: Int) { + val layoutParams = binding.titleView.layoutParams as? LayoutParams + layoutParams?.width = width + binding.titleView.layoutParams = layoutParams + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/HabiticaBottomNavigationView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/HabiticaBottomNavigationView.kt index d4a396b96..51584e438 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/HabiticaBottomNavigationView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/HabiticaBottomNavigationView.kt @@ -23,267 +23,267 @@ import com.habitrpg.shared.habitica.models.tasks.TaskType interface HabiticaBottomNavigationViewListener { fun onTabSelected( taskType: TaskType, - smooth: Boolean, + smooth: Boolean ) fun onAdd(taskType: TaskType) } class HabiticaBottomNavigationView - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - ) : RelativeLayout(context, attrs, defStyleAttr) { - private val binding = MainNavigationViewBinding.inflate(context.layoutInflater, this) +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr) { + private val binding = MainNavigationViewBinding.inflate(context.layoutInflater, this) - private var isShowingSubmenu: Boolean = false - var selectedPosition: Int - get() { - return when (activeTaskType) { - TaskType.DAILY -> 1 - TaskType.REWARD -> 2 - TaskType.TODO -> 3 - else -> 0 - } - } - set(value) { - activeTaskType = - when (value) { - 1 -> TaskType.DAILY - 2 -> TaskType.TODO - 3 -> TaskType.REWARD - else -> TaskType.HABIT - } - } - var listener: HabiticaBottomNavigationViewListener? = null - var activeTaskType: TaskType = TaskType.HABIT - set(value) { - val wasChanged = field != value - field = value - if (wasChanged) { - updateItemSelection() - listener?.onTabSelected(value, true) + private var isShowingSubmenu: Boolean = false + var selectedPosition: Int + get() { + return when (activeTaskType) { + TaskType.DAILY -> 1 + TaskType.REWARD -> 2 + TaskType.TODO -> 3 + else -> 0 + } + } + set(value) { + activeTaskType = + when (value) { + 1 -> TaskType.DAILY + 2 -> TaskType.TODO + 3 -> TaskType.REWARD + else -> TaskType.HABIT } + } + var listener: HabiticaBottomNavigationViewListener? = null + var activeTaskType: TaskType = TaskType.HABIT + set(value) { + val wasChanged = field != value + field = value + if (wasChanged) { + updateItemSelection() + listener?.onTabSelected(value, true) } + } - var canAddTasks = true - set(value) { - if (field == value) return - field = value - binding.addButton.isEnabled = value - val animator = ObjectAnimator.ofFloat(0f, 1.0f) - if (field) { - binding.addButtonBackground.animate() - .translationY(0f) - .alpha(1f) - .setDuration(200) - } else { - binding.addButtonBackground.animate() - .translationY(-binding.addButtonBackground.height.toFloat() / 2) - .alpha(0.0f) - .setDuration(200) - } - animator.duration = 200 - animator.start() + var canAddTasks = true + set(value) { + if (field == value) return + field = value + binding.addButton.isEnabled = value + val animator = ObjectAnimator.ofFloat(0f, 1.0f) + if (field) { + binding.addButtonBackground.animate() + .translationY(0f) + .alpha(1f) + .setDuration(200) + } else { + binding.addButtonBackground.animate() + .translationY(-binding.addButtonBackground.height.toFloat() / 2) + .alpha(0.0f) + .setDuration(200) } + animator.duration = 200 + animator.start() + } - val barHeight: Int - get() = binding.itemWrapper.measuredHeight + val barHeight: Int + get() = binding.itemWrapper.measuredHeight - init { - binding.habitsTab.setOnClickListener { activeTaskType = TaskType.HABIT } - binding.dailiesTab.setOnClickListener { activeTaskType = TaskType.DAILY } - binding.todosTab.setOnClickListener { activeTaskType = TaskType.TODO } - binding.rewardsTab.setOnClickListener { activeTaskType = TaskType.REWARD } - binding.addButton.setOnClickListener { - if (isShowingSubmenu) { - hideSubmenu() - } else { - listener?.onAdd(activeTaskType) - } - animateButtonTap() + init { + binding.habitsTab.setOnClickListener { activeTaskType = TaskType.HABIT } + binding.dailiesTab.setOnClickListener { activeTaskType = TaskType.DAILY } + binding.todosTab.setOnClickListener { activeTaskType = TaskType.TODO } + binding.rewardsTab.setOnClickListener { activeTaskType = TaskType.REWARD } + binding.addButton.setOnClickListener { + if (isShowingSubmenu) { + hideSubmenu() + } else { + listener?.onAdd(activeTaskType) } - binding.addButton.setOnLongClickListener { - showSubmenu() - animateButtonTap() - true + animateButtonTap() + } + binding.addButton.setOnLongClickListener { + showSubmenu() + animateButtonTap() + true + } + binding.addButton.setOnTouchListener { _, event -> + if (event.action == MotionEvent.ACTION_DOWN) { + val animX = ObjectAnimator.ofFloat(binding.addButton, "scaleX", 1f, 1.1f) + animX.duration = 100 + animX.interpolator = LinearInterpolator() + animX.start() + val animY = ObjectAnimator.ofFloat(binding.addButton, "scaleY", 1f, 1.1f) + animY.duration = 100 + animY.interpolator = LinearInterpolator() + animY.start() + val animXBackground = + ObjectAnimator.ofFloat(binding.addButtonBackground, "scaleX", 1f, 0.9f) + animXBackground.duration = 100 + animXBackground.interpolator = LinearInterpolator() + animXBackground.start() + val animYBackground = + ObjectAnimator.ofFloat(binding.addButtonBackground, "scaleY", 1f, 0.9f) + animYBackground.duration = 100 + animYBackground.interpolator = LinearInterpolator() + animYBackground.start() } - binding.addButton.setOnTouchListener { _, event -> - if (event.action == MotionEvent.ACTION_DOWN) { - val animX = ObjectAnimator.ofFloat(binding.addButton, "scaleX", 1f, 1.1f) - animX.duration = 100 - animX.interpolator = LinearInterpolator() - animX.start() - val animY = ObjectAnimator.ofFloat(binding.addButton, "scaleY", 1f, 1.1f) - animY.duration = 100 - animY.interpolator = LinearInterpolator() - animY.start() - val animXBackground = - ObjectAnimator.ofFloat(binding.addButtonBackground, "scaleX", 1f, 0.9f) - animXBackground.duration = 100 - animXBackground.interpolator = LinearInterpolator() - animXBackground.start() - val animYBackground = - ObjectAnimator.ofFloat(binding.addButtonBackground, "scaleY", 1f, 0.9f) - animYBackground.duration = 100 - animYBackground.interpolator = LinearInterpolator() - animYBackground.start() - } - false - } - binding.submenuWrapper.setOnClickListener { hideSubmenu() } - updateItemSelection() + false + } + binding.submenuWrapper.setOnClickListener { hideSubmenu() } + updateItemSelection() - val cutout = ContextCompat.getDrawable(context, R.drawable.bottom_navigation_inset) - cutout?.setTintWith(context.getThemeColor(R.attr.barColor), PorterDuff.Mode.MULTIPLY) - binding.cutoutBackground.setImageDrawable(cutout) - val fabBackground = ContextCompat.getDrawable(context, R.drawable.fab_background) - fabBackground?.setTintWith( - context.getThemeColor(R.attr.colorAccent), - PorterDuff.Mode.MULTIPLY, + val cutout = ContextCompat.getDrawable(context, R.drawable.bottom_navigation_inset) + cutout?.setTintWith(context.getThemeColor(R.attr.barColor), PorterDuff.Mode.MULTIPLY) + binding.cutoutBackground.setImageDrawable(cutout) + val fabBackground = ContextCompat.getDrawable(context, R.drawable.fab_background) + fabBackground?.setTintWith( + context.getThemeColor(R.attr.colorAccent), + PorterDuff.Mode.MULTIPLY + ) + binding.addButtonBackground.background = fabBackground + } + + private fun animateButtonTap() { + val animX = ObjectAnimator.ofFloat(binding.addButton, "scaleX", 1.3f, 1f) + animX.duration = 400 + animX.interpolator = BounceInterpolator() + animX.start() + val animY = ObjectAnimator.ofFloat(binding.addButton, "scaleY", 1.3f, 1f) + animY.duration = 400 + animY.interpolator = BounceInterpolator() + animY.start() + val animXBackground = + ObjectAnimator.ofFloat(binding.addButtonBackground, "scaleX", 0.9f, 1f) + animXBackground.duration = 600 + animXBackground.interpolator = BounceInterpolator() + animXBackground.start() + val animYBackground = + ObjectAnimator.ofFloat(binding.addButtonBackground, "scaleY", 0.9f, 1f) + animYBackground.duration = 600 + animYBackground.interpolator = BounceInterpolator() + animYBackground.start() + } + + private fun showSubmenu() { + if (isShowingSubmenu) return + isShowingSubmenu = true + + val rotate = + RotateAnimation( + 0f, + 135f, + Animation.RELATIVE_TO_SELF, + 0.5f, + Animation.RELATIVE_TO_SELF, + 0.5f ) - binding.addButtonBackground.background = fabBackground - } + rotate.duration = 250 + rotate.interpolator = LinearInterpolator() + rotate.fillAfter = true + binding.addButton.startAnimation(rotate) - private fun animateButtonTap() { - val animX = ObjectAnimator.ofFloat(binding.addButton, "scaleX", 1.3f, 1f) - animX.duration = 400 - animX.interpolator = BounceInterpolator() - animX.start() - val animY = ObjectAnimator.ofFloat(binding.addButton, "scaleY", 1.3f, 1f) - animY.duration = 400 - animY.interpolator = BounceInterpolator() - animY.start() - val animXBackground = - ObjectAnimator.ofFloat(binding.addButtonBackground, "scaleX", 0.9f, 1f) - animXBackground.duration = 600 - animXBackground.interpolator = BounceInterpolator() - animXBackground.start() - val animYBackground = - ObjectAnimator.ofFloat(binding.addButtonBackground, "scaleY", 0.9f, 1f) - animYBackground.duration = 600 - animYBackground.interpolator = BounceInterpolator() - animYBackground.start() - } - - private fun showSubmenu() { - if (isShowingSubmenu) return - isShowingSubmenu = true - - val rotate = - RotateAnimation( - 0f, - 135f, - Animation.RELATIVE_TO_SELF, - 0.5f, - Animation.RELATIVE_TO_SELF, - 0.5f, - ) - rotate.duration = 250 - rotate.interpolator = LinearInterpolator() - rotate.fillAfter = true - binding.addButton.startAnimation(rotate) - - var pos = 4 - binding.submenuWrapper.removeAllViews() - for (taskType in listOf(TaskType.HABIT, TaskType.DAILY, TaskType.TODO, TaskType.REWARD)) { - val view = BottomNavigationSubmenuItem(context) - when (taskType) { - TaskType.HABIT -> { - view.icon = ContextCompat.getDrawable(context, R.drawable.add_habit) - view.title = context.getString(R.string.habit) - } - - TaskType.DAILY -> { - view.icon = ContextCompat.getDrawable(context, R.drawable.add_daily) - view.title = context.getString(R.string.daily) - } - - TaskType.TODO -> { - view.icon = ContextCompat.getDrawable(context, R.drawable.add_todo) - view.title = context.getString(R.string.todo) - } - - TaskType.REWARD -> { - view.icon = ContextCompat.getDrawable(context, R.drawable.add_rewards) - view.title = context.getString(R.string.reward) - } + var pos = 4 + binding.submenuWrapper.removeAllViews() + for (taskType in listOf(TaskType.HABIT, TaskType.DAILY, TaskType.TODO, TaskType.REWARD)) { + val view = BottomNavigationSubmenuItem(context) + when (taskType) { + TaskType.HABIT -> { + view.icon = ContextCompat.getDrawable(context, R.drawable.add_habit) + view.title = context.getString(R.string.habit) } - view.onAddListener = { - listener?.onAdd(taskType) - hideSubmenu() + + TaskType.DAILY -> { + view.icon = ContextCompat.getDrawable(context, R.drawable.add_daily) + view.title = context.getString(R.string.daily) } - binding.submenuWrapper.addView(view) - view.alpha = 0f - view.scaleY = 0.7f - ViewCompat.animate(view).alpha(1f).setDuration(250.toLong()).startDelay = - (100 * pos).toLong() - ViewCompat.animate(view).scaleY(1f).setDuration(250.toLong()).startDelay = - (100 * pos).toLong() - pos -= 1 - } - var widestWidth = 0 - for (view in binding.submenuWrapper.children) { - if (view is BottomNavigationSubmenuItem) { - val width = view.measuredTitleWidth - if (widestWidth < width) { - widestWidth = width - } + + TaskType.TODO -> { + view.icon = ContextCompat.getDrawable(context, R.drawable.add_todo) + view.title = context.getString(R.string.todo) + } + + TaskType.REWARD -> { + view.icon = ContextCompat.getDrawable(context, R.drawable.add_rewards) + view.title = context.getString(R.string.reward) } } - for (view in binding.submenuWrapper.children) { - if (view is BottomNavigationSubmenuItem) { - view.setTitleWidth(widestWidth) + view.onAddListener = { + listener?.onAdd(taskType) + hideSubmenu() + } + binding.submenuWrapper.addView(view) + view.alpha = 0f + view.scaleY = 0.7f + ViewCompat.animate(view).alpha(1f).setDuration(250.toLong()).startDelay = + (100 * pos).toLong() + ViewCompat.animate(view).scaleY(1f).setDuration(250.toLong()).startDelay = + (100 * pos).toLong() + pos -= 1 + } + var widestWidth = 0 + for (view in binding.submenuWrapper.children) { + if (view is BottomNavigationSubmenuItem) { + val width = view.measuredTitleWidth + if (widestWidth < width) { + widestWidth = width } } } - - private fun hideSubmenu() { - isShowingSubmenu = false - var pos = 0 - - val rotate = - RotateAnimation( - 135f, - 0f, - Animation.RELATIVE_TO_SELF, - 0.5f, - Animation.RELATIVE_TO_SELF, - 0.5f, - ) - rotate.duration = 250 - rotate.interpolator = LinearInterpolator() - rotate.fillAfter = true - binding.addButton.startAnimation(rotate) - - for (view in binding.submenuWrapper.children) { - view.alpha = 1f - view.scaleY = 1f - ViewCompat.animate(view).alpha(0f).setDuration(200.toLong()).startDelay = - (150 * pos).toLong() - ViewCompat.animate(view).scaleY(0.7f).setDuration(250.toLong()) - .setStartDelay((100 * pos).toLong()) - .withEndAction { binding.submenuWrapper.removeView(view) } - pos += 1 + for (view in binding.submenuWrapper.children) { + if (view is BottomNavigationSubmenuItem) { + view.setTitleWidth(widestWidth) } } - - fun tabWithId(id: Int): BottomNavigationItem? { - return when (id) { - R.id.habits_tab -> binding.habitsTab - R.id.dailies_tab -> binding.dailiesTab - R.id.todos_tab -> binding.todosTab - R.id.rewards_tab -> binding.rewardsTab - else -> null - } - } - - private fun updateItemSelection() { - binding.habitsTab.isActive = activeTaskType == TaskType.HABIT - binding.dailiesTab.isActive = activeTaskType == TaskType.DAILY - binding.todosTab.isActive = activeTaskType == TaskType.TODO - binding.rewardsTab.isActive = activeTaskType == TaskType.REWARD - } } + + private fun hideSubmenu() { + isShowingSubmenu = false + var pos = 0 + + val rotate = + RotateAnimation( + 135f, + 0f, + Animation.RELATIVE_TO_SELF, + 0.5f, + Animation.RELATIVE_TO_SELF, + 0.5f + ) + rotate.duration = 250 + rotate.interpolator = LinearInterpolator() + rotate.fillAfter = true + binding.addButton.startAnimation(rotate) + + for (view in binding.submenuWrapper.children) { + view.alpha = 1f + view.scaleY = 1f + ViewCompat.animate(view).alpha(0f).setDuration(200.toLong()).startDelay = + (150 * pos).toLong() + ViewCompat.animate(view).scaleY(0.7f).setDuration(250.toLong()) + .setStartDelay((100 * pos).toLong()) + .withEndAction { binding.submenuWrapper.removeView(view) } + pos += 1 + } + } + + fun tabWithId(id: Int): BottomNavigationItem? { + return when (id) { + R.id.habits_tab -> binding.habitsTab + R.id.dailies_tab -> binding.dailiesTab + R.id.todos_tab -> binding.todosTab + R.id.rewards_tab -> binding.rewardsTab + else -> null + } + } + + private fun updateItemSelection() { + binding.habitsTab.isActive = activeTaskType == TaskType.HABIT + binding.dailiesTab.isActive = activeTaskType == TaskType.DAILY + binding.todosTab.isActive = activeTaskType == TaskType.TODO + binding.rewardsTab.isActive = activeTaskType == TaskType.REWARD + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/preferences/PauseResumeDamageView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/preferences/PauseResumeDamageView.kt index 4c582236e..b1f2f7afe 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/preferences/PauseResumeDamageView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/preferences/PauseResumeDamageView.kt @@ -22,14 +22,14 @@ import com.habitrpg.common.habitica.theme.HabiticaTheme fun PauseResumeDamageView( isPaused: Boolean, onClick: () -> Unit, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { Column( horizontalAlignment = Alignment.Start, modifier = - modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), + modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) ) { if (isPaused) { Text( @@ -38,47 +38,47 @@ fun PauseResumeDamageView( fontSize = 16.sp, textAlign = TextAlign.Center, modifier = - Modifier - .padding(bottom = 18.dp) - .fillMaxWidth(), + Modifier + .padding(bottom = 18.dp) + .fillMaxWidth() ) Text( stringResource(R.string.resume_damage_1_title), color = HabiticaTheme.colors.textPrimary, - fontSize = 16.sp, + fontSize = 16.sp ) Text( stringResource(R.string.resume_damage_1_description), color = HabiticaTheme.colors.textSecondary, fontSize = 14.sp, - modifier = Modifier.padding(bottom = 12.dp), + modifier = Modifier.padding(bottom = 12.dp) ) Text( stringResource(R.string.resume_damage_2_title), color = HabiticaTheme.colors.textPrimary, - fontSize = 16.sp, + fontSize = 16.sp ) Text( stringResource(R.string.resume_damage_2_description), color = HabiticaTheme.colors.textSecondary, fontSize = 14.sp, - modifier = Modifier.padding(bottom = 12.dp), + modifier = Modifier.padding(bottom = 12.dp) ) Text( stringResource(R.string.resume_damage_3_title), color = HabiticaTheme.colors.textPrimary, - fontSize = 16.sp, + fontSize = 16.sp ) Text( stringResource(R.string.resume_damage_3_description), color = HabiticaTheme.colors.textSecondary, fontSize = 14.sp, - modifier = Modifier.padding(bottom = 18.dp), + modifier = Modifier.padding(bottom = 18.dp) ) HabiticaButton( background = colorResource(R.color.yellow_100), color = colorResource(R.color.yellow_1), - onClick = { onClick() }, + onClick = { onClick() } ) { Text(stringResource(R.string.resume_damage)) } @@ -89,53 +89,53 @@ fun PauseResumeDamageView( fontSize = 16.sp, textAlign = TextAlign.Center, modifier = - Modifier - .padding(bottom = 18.dp) - .fillMaxWidth(), + Modifier + .padding(bottom = 18.dp) + .fillMaxWidth() ) Text( stringResource(R.string.pause_damage_1_title), color = HabiticaTheme.colors.textPrimary, fontWeight = FontWeight.Normal, - fontSize = 16.sp, + fontSize = 16.sp ) Text( stringResource(R.string.pause_damage_1_description), color = HabiticaTheme.colors.textSecondary, fontSize = 14.sp, fontWeight = FontWeight.Normal, - modifier = Modifier.padding(bottom = 12.dp), + modifier = Modifier.padding(bottom = 12.dp) ) Text( stringResource(R.string.pause_damage_2_title), color = HabiticaTheme.colors.textPrimary, fontWeight = FontWeight.Normal, - fontSize = 16.sp, + fontSize = 16.sp ) Text( stringResource(R.string.pause_damage_2_description), color = HabiticaTheme.colors.textSecondary, fontSize = 14.sp, fontWeight = FontWeight.Normal, - modifier = Modifier.padding(bottom = 12.dp), + modifier = Modifier.padding(bottom = 12.dp) ) Text( stringResource(R.string.pause_damage_3_title), color = HabiticaTheme.colors.textPrimary, fontWeight = FontWeight.Normal, - fontSize = 16.sp, + fontSize = 16.sp ) Text( stringResource(R.string.pause_damage_3_description), color = HabiticaTheme.colors.textSecondary, fontSize = 14.sp, fontWeight = FontWeight.Normal, - modifier = Modifier.padding(bottom = 18.dp), + modifier = Modifier.padding(bottom = 18.dp) ) HabiticaButton( background = colorResource(R.color.yellow_100), color = colorResource(R.color.yellow_1), - onClick = { onClick() }, + onClick = { onClick() } ) { Text(stringResource(R.string.pause_damage)) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/progress/HabiticaPullRefreshIndicator.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/progress/HabiticaPullRefreshIndicator.kt index 9ee0720a0..0a501518a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/progress/HabiticaPullRefreshIndicator.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/progress/HabiticaPullRefreshIndicator.kt @@ -33,12 +33,12 @@ fun HabiticaPullRefreshIndicator( state: PullToRefreshState, modifier: Modifier = Modifier, backgroundColor: Color = MaterialTheme.colorScheme.surface, - scale: Boolean = true, + scale: Boolean = true ) { AnimatedVisibility( visible = isInitial && isRefreshing, enter = fadeIn(), - exit = fadeOut(), + exit = fadeOut() ) { Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) { HabiticaCircularProgressView(Modifier) @@ -47,14 +47,14 @@ fun HabiticaPullRefreshIndicator( if (!isInitial) { Surface( modifier = - modifier, + modifier, shape = CircleShape, - color = backgroundColor, + color = backgroundColor ) { AnimatedVisibility( visible = isRefreshing || state.progress > 0f, enter = fadeIn(), - exit = fadeOut(), + exit = fadeOut() ) { HabiticaCircularProgressView( partialDisplay = if (isRefreshing) 1f else state.progress, @@ -62,10 +62,10 @@ fun HabiticaPullRefreshIndicator( indicatorSize = 40.dp, strokeWidth = 6.dp, modifier = - Modifier - .border(1.dp, HabiticaTheme.colors.windowBackground, CircleShape) - .padding(4.dp) - .background(MaterialTheme.colorScheme.surface, CircleShape), + Modifier + .border(1.dp, HabiticaTheme.colors.windowBackground, CircleShape) + .padding(4.dp) + .background(MaterialTheme.colorScheme.surface, CircleShape) ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/BirthdayMenuView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/BirthdayMenuView.kt index 88eea422b..531bcef1a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/BirthdayMenuView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/BirthdayMenuView.kt @@ -46,86 +46,86 @@ import kotlin.time.Duration.Companion.seconds @Composable fun BirthdayBanner( endDate: Date, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { Column( modifier .fillMaxWidth() .clickable { MainNavigationController.navigate(R.id.birthdayActivity) - }, + } ) { Column(Modifier.fillMaxWidth()) { Box( contentAlignment = Alignment.CenterStart, modifier = - Modifier - .height(67.dp) - .fillMaxWidth() - .background(colorResource(R.color.brand_100)), + Modifier + .height(67.dp) + .fillMaxWidth() + .background(colorResource(R.color.brand_100)) ) { Row( - Modifier.align(Alignment.CenterEnd), + Modifier.align(Alignment.CenterEnd) ) { Image( painterResource(R.drawable.birthday_menu_gems), null, modifier = - Modifier - .align(Alignment.Top) - .offset((40).dp), + Modifier + .align(Alignment.Top) + .offset((40).dp) ) PixelArtView( imageName = "stable_Pet-Gryphatrice-Jubilant", Modifier .requiredSize(104.dp) .scale(-1f, 1f) - .offset((-30).dp), + .offset((-30).dp) ) } Column( verticalArrangement = - Arrangement.spacedBy( - 2.dp, - Alignment.CenterVertically, - ), - modifier = Modifier.padding(start = 8.dp), + Arrangement.spacedBy( + 2.dp, + Alignment.CenterVertically + ), + modifier = Modifier.padding(start = 8.dp) ) { Image( painterResource(R.drawable.birthday_menu_text), - null, + null ) Text( stringResource(R.string.exclusive_items_await), color = colorResource(R.color.yellow_100), fontSize = 14.sp, fontWeight = FontWeight.SemiBold, - modifier = Modifier.padding(start = 2.dp), + modifier = Modifier.padding(start = 2.dp) ) } } Row( verticalAlignment = Alignment.CenterVertically, modifier = - Modifier - .fillMaxWidth() - .height(33.dp) - .background(colorResource(R.color.brand_300)) - .padding(horizontal = 10.dp), + Modifier + .fillMaxWidth() + .height(33.dp) + .background(colorResource(R.color.brand_300)) + .padding(horizontal = 10.dp) ) { TimeRemainingText( endDate, R.string.ends_in_x, color = colorResource(R.color.yellow_50), fontSize = 12.sp, - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Bold ) Spacer(Modifier.weight(1f)) Text( stringResource(R.string.see_more).uppercase(), color = colorResource(R.color.white), fontSize = 12.sp, - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Bold ) } } @@ -136,11 +136,11 @@ fun BirthdayBanner( private fun buildString( value: Int, endDate: Date, - formatString: Int, + formatString: Int ): String { return stringResource( formatString, - endDate.getShortRemainingString(), + endDate.getShortRemainingString() ).uppercase() } @@ -150,7 +150,7 @@ fun TimeRemainingText( formatString: Int, color: Color, fontSize: TextUnit, - fontWeight: FontWeight, + fontWeight: FontWeight ) { var value by remember { mutableIntStateOf(0) } LaunchedEffect(value) { @@ -168,6 +168,6 @@ fun TimeRemainingText( buildString(value = value, endDate = endDate, formatString = formatString), color = color, fontSize = fontSize, - fontWeight = fontWeight, + fontWeight = fontWeight ) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuView.kt index 880c4419e..ea2423082 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuView.kt @@ -13,71 +13,71 @@ import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.extensions.layoutInflater class PromoMenuView - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - ) : RelativeLayout(context, attrs, defStyleAttr) { - var canClose: Boolean = false - set(value) { - field = value - binding.closeButton.visibility = if (value) View.VISIBLE else View.GONE - } - var binding: PromoMenuBinding = PromoMenuBinding.inflate(context.layoutInflater, this) - - init { - setBackgroundColor(context.getThemeColor(R.attr.colorWindowBackground)) - clipToPadding = false - clipChildren = false - clipToOutline = false +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr) { + var canClose: Boolean = false + set(value) { + field = value + binding.closeButton.visibility = if (value) View.VISIBLE else View.GONE } + var binding: PromoMenuBinding = PromoMenuBinding.inflate(context.layoutInflater, this) - fun setTitleText(title: String?) { - setText(binding.titleTextView, title) - } + init { + setBackgroundColor(context.getThemeColor(R.attr.colorWindowBackground)) + clipToPadding = false + clipChildren = false + clipToOutline = false + } - fun setSubtitleText(subtitle: String?) { - setText(binding.descriptionView, subtitle) - } + fun setTitleText(title: String?) { + setText(binding.titleTextView, title) + } - fun setTitleImage(title: Drawable?) { - setImage(binding.titleImageView, title) - } + fun setSubtitleText(subtitle: String?) { + setText(binding.descriptionView, subtitle) + } - fun setSubtitleImage(subtitle: Drawable?) { - setImage(binding.descriptionImageView, subtitle) - } + fun setTitleImage(title: Drawable?) { + setImage(binding.titleImageView, title) + } - fun setDecoration( - leftDrawable: Drawable?, - rightDrawable: Drawable?, - ) { - binding.leftImageView.setImageDrawable(leftDrawable) - binding.rightImageView.setImageDrawable(rightDrawable) - } + fun setSubtitleImage(subtitle: Drawable?) { + setImage(binding.descriptionImageView, subtitle) + } - private fun setImage( - view: ImageView, - drawable: Drawable?, - ) { - if (drawable != null) { - view.setImageDrawable(drawable) - view.visibility = View.VISIBLE - } else { - view.visibility = View.GONE - } - } + fun setDecoration( + leftDrawable: Drawable?, + rightDrawable: Drawable? + ) { + binding.leftImageView.setImageDrawable(leftDrawable) + binding.rightImageView.setImageDrawable(rightDrawable) + } - private fun setText( - view: TextView, - text: String?, - ) { - if (text != null) { - view.text = text - view.visibility = View.VISIBLE - } else { - view.visibility = View.GONE - } + private fun setImage( + view: ImageView, + drawable: Drawable? + ) { + if (drawable != null) { + view.setImageDrawable(drawable) + view.visibility = View.VISIBLE + } else { + view.visibility = View.GONE } } + + private fun setText( + view: TextView, + text: String? + ) { + if (text != null) { + view.text = text + view.visibility = View.VISIBLE + } else { + view.visibility = View.GONE + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoView.kt index 8f416cff9..06b99bd8e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoView.kt @@ -6,28 +6,28 @@ import android.widget.Button import android.widget.RelativeLayout import androidx.core.os.bundleOf import com.habitrpg.android.habitica.R -import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.extensions.getThemeColor +import com.habitrpg.common.habitica.extensions.inflate import com.habitrpg.common.habitica.helpers.MainNavigationController class SubscriptionBuyGemsPromoView - @JvmOverloads - constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - ) : RelativeLayout(context, attrs, defStyleAttr) { - init { - inflate(R.layout.promo_subscription_buy_gems, true) - setBackgroundColor(context.getThemeColor(R.attr.colorWindowBackground)) - clipToPadding = false - clipChildren = false - clipToOutline = false - findViewById