From e123e4c8affd1c0cc84fa9d7a2071ab1792def08 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 14 Sep 2021 09:54:08 +0200 Subject: [PATCH] Format code according to Ktlint --- Habitica/build.gradle | 30 +- .../habitica/HabiticaBaseApplication.kt | 58 +-- .../habitica/HabiticaPurchaseVerifier.kt | 5 +- .../android/habitica/api/ApiService.kt | 12 +- .../android/habitica/api/HostConfig.kt | 3 - .../habitrpg/android/habitica/api/Server.kt | 2 +- .../android/habitica/data/ApiClient.kt | 11 +- .../habitica/data/ChallengeRepository.kt | 10 +- .../habitica/data/ContentRepository.kt | 1 - .../habitica/data/CustomizationRepository.kt | 1 - .../android/habitica/data/FAQRepository.kt | 1 - .../habitica/data/InventoryRepository.kt | 1 - .../data/SetupCustomizationRepository.kt | 1 - .../android/habitica/data/SocialRepository.kt | 3 - .../android/habitica/data/TagRepository.kt | 2 - .../android/habitica/data/TaskRepository.kt | 4 +- .../habitica/data/TutorialRepository.kt | 1 - .../data/implementation/ApiClientImpl.kt | 126 ++++--- .../data/implementation/BaseRepositoryImpl.kt | 4 +- .../implementation/ChallengeRepositoryImpl.kt | 26 +- .../implementation/ContentRepositoryImpl.kt | 5 +- .../CustomizationRepositoryImpl.kt | 1 - .../data/implementation/FAQRepositoryImpl.kt | 2 - .../implementation/InventoryRepositoryImpl.kt | 128 +++---- .../SetupCustomizationRepositoryImpl.kt | 23 +- .../implementation/SocialRepositoryImpl.kt | 130 +++---- .../data/implementation/TagRepositoryImpl.kt | 37 +- .../data/implementation/TaskRepositoryImpl.kt | 202 +++++------ .../implementation/TutorialRepositoryImpl.kt | 5 +- .../data/implementation/UserRepositoryImpl.kt | 265 +++++++------- .../data/local/BaseLocalRepository.kt | 18 +- .../data/local/ChallengeLocalRepository.kt | 3 - .../local/CustomizationLocalRepository.kt | 1 - .../habitica/data/local/FAQLocalRepository.kt | 1 - .../habitica/data/local/TagLocalRepository.kt | 1 - .../data/local/TaskLocalRepository.kt | 1 - .../RealmBaseLocalRepository.kt | 21 +- .../RealmChallengeLocalRepository.kt | 81 +++-- .../RealmContentLocalRepository.kt | 16 +- .../RealmCustomizationLocalRepository.kt | 33 +- .../implementation/RealmFAQLocalRepository.kt | 14 +- .../RealmInventoryLocalRepository.kt | 213 ++++++----- .../RealmSocialLocalRepository.kt | 113 +++--- .../implementation/RealmTagLocalRepository.kt | 1 - .../RealmTaskLocalRepository.kt | 104 +++--- .../RealmTutorialLocalRepository.kt | 15 +- .../RealmUserLocalRepository.kt | 90 +++-- .../habitica/events/BoughtGemsEvent.kt | 2 +- .../habitica/events/GearPurchasedEvent.kt | 2 +- .../android/habitica/events/ShareEvent.kt | 2 +- .../habitica/events/ShowSnackbarEvent.kt | 2 +- .../habitica/events/UserSubscribedEvent.kt | 2 +- .../habitica/events/commands/FeedCommand.kt | 3 +- .../extensions/AlertDialog-Extensions.kt | 8 +- .../habitica/extensions/Animal-Extensions.kt | 8 +- .../extensions/AttributeSet-Extentions.kt | 2 +- .../habitica/extensions/Base-Extensions.kt | 4 +- .../habitica/extensions/Bitmap-Extensions.kt | 3 +- .../habitica/extensions/Context-Extensions.kt | 9 +- .../habitica/extensions/Date-Extensions.kt | 2 +- .../habitica/extensions/Double-Extensions.kt | 2 +- .../extensions/Drawable-Extendsions.kt | 4 +- .../extensions/Flowable-Extensions.kt | 2 +- .../habitica/extensions/Int-Extensions.kt | 3 +- .../extensions/JsonObject-Extensions.kt | 3 +- .../android/habitica/extensions/Optional.kt | 2 +- .../habitica/extensions/RxJava-Extensions.kt | 27 +- .../extensions/TextView-Extensions.kt | 12 +- .../extensions/TextWatcher-Extensions.kt | 2 +- .../android/habitica/extensions/ViewExt.kt | 6 +- .../extensions/ViewGroup-Extensions.kt | 2 +- .../habitica/helpers/AmplitudeManager.kt | 2 +- .../habitica/helpers/AppConfigManager.kt | 9 +- .../habitica/helpers/AprilFoolsHandler.kt | 2 +- .../android/habitica/helpers/DeviceName.kt | 86 +++-- .../habitica/helpers/HapticFeedbackManager.kt | 3 +- .../habitica/helpers/HealthFormatter.kt | 12 +- .../android/habitica/helpers/Keyhelper.kt | 39 +- .../helpers/MainNavigationController.kt | 7 +- .../helpers/NotificationOpenHandler.kt | 3 +- .../habitica/helpers/NotificationsManager.kt | 111 +++--- .../habitica/helpers/NumberAbbreviator.kt | 2 - .../habitica/helpers/PurchaseHandler.kt | 223 +++++++----- .../habitica/helpers/RxErrorHandler.kt | 14 +- .../habitica/helpers/SignInWebViewClient.kt | 5 +- .../helpers/SignInWebViewDialogFragment.kt | 16 +- .../helpers/SignInWithAppleService.kt | 52 +-- .../android/habitica/helpers/SoundFile.kt | 9 +- .../habitica/helpers/SoundFileLoader.kt | 13 +- .../android/habitica/helpers/SoundManager.kt | 14 +- .../habitica/helpers/TaskAlarmManager.kt | 24 +- .../habitica/helpers/TaskFilterHelper.kt | 10 +- .../habitica/helpers/UserStatComputer.kt | 1 - .../ChangeUsernameLocalNotification.kt | 2 +- .../notifications/ChatMentionNotification.kt | 8 +- .../notifications/GenericLocalNotification.kt | 2 +- .../GiftOneGetOneLocalNotification.kt | 2 +- .../GroupActivityNotification.kt | 34 +- .../GuildInviteLocalNotification.kt | 17 +- .../HabiticaFirebaseMessagingService.kt | 9 +- .../HabiticaLocalNotification.kt | 16 +- .../HabiticaLocalNotificationFactory.kt | 28 +- .../PartyInviteLocalNotification.kt | 17 +- .../notifications/PushNotificationManager.kt | 17 +- .../QuestInviteLocalNotification.kt | 16 +- ...ReceivedPrivateMessageLocalNotification.kt | 25 +- .../postProcessors/InvertPostProcessor.kt | 1 - .../habitica/interactors/BuyRewardUseCase.kt | 8 +- .../interactors/CheckClassSelectionUseCase.kt | 10 +- .../interactors/DisplayItemDropUseCase.kt | 8 +- .../habitica/interactors/LevelUpUseCase.kt | 17 +- .../habitica/interactors/NotifyUserUseCase.kt | 27 +- .../interactors/ScoreTaskLocallyInteractor.kt | 17 +- .../android/habitica/models/Avatar.kt | 2 +- .../habitica/models/AvatarPreferences.kt | 2 +- .../android/habitica/models/BaseObject.kt | 6 +- .../android/habitica/models/ContentGear.kt | 1 - .../android/habitica/models/ContentResult.kt | 1 - .../android/habitica/models/IAPGift.kt | 2 +- .../android/habitica/models/Notification.kt | 24 +- .../models/PurchaseValidationRequest.kt | 1 - .../models/PurchaseValidationResult.kt | 2 +- .../android/habitica/models/PushDevice.kt | 2 +- .../habitica/models/QuestAchievement.kt | 10 +- .../habitica/models/SetupCustomization.kt | 1 - .../habitrpg/android/habitica/models/Skill.kt | 2 - .../models/SubscriptionValidationRequest.kt | 1 - .../habitrpg/android/habitica/models/Tag.kt | 2 - .../android/habitica/models/TeamPlan.kt | 3 +- .../android/habitica/models/TutorialStep.kt | 5 +- .../android/habitica/models/WorldState.kt | 5 +- .../habitica/models/WorldStateEvent.kt | 13 +- .../models/auth/LocalAuthentication.kt | 3 +- .../android/habitica/models/auth/UserAuth.kt | 2 +- .../habitica/models/auth/UserAuthResponse.kt | 4 +- .../habitica/models/auth/UserAuthSocial.kt | 3 +- .../models/auth/UserAuthSocialTokens.kt | 2 +- .../habitica/models/inventory/Animal.kt | 2 +- .../models/inventory/Customization.kt | 14 +- .../models/inventory/CustomizationSet.kt | 2 +- .../android/habitica/models/inventory/Egg.kt | 2 +- .../habitica/models/inventory/Equipment.kt | 1 - .../android/habitica/models/inventory/Food.kt | 2 +- .../models/inventory/HatchingPotion.kt | 2 +- .../android/habitica/models/inventory/Item.kt | 3 +- .../habitica/models/inventory/Mount.kt | 3 +- .../android/habitica/models/inventory/Pet.kt | 22 +- .../habitica/models/inventory/Quest.kt | 25 +- .../habitica/models/inventory/QuestBoss.kt | 9 +- .../habitica/models/inventory/QuestCollect.kt | 2 +- .../habitica/models/inventory/QuestContent.kt | 14 +- .../models/inventory/QuestDropItem.kt | 30 +- .../habitica/models/inventory/QuestDrops.kt | 18 +- .../habitica/models/inventory/QuestMember.kt | 2 +- .../models/inventory/QuestProgress.kt | 1 - .../models/inventory/QuestProgressCollect.kt | 3 +- .../models/inventory/QuestRageStrike.kt | 4 +- .../habitica/models/inventory/SpecialItem.kt | 1 - .../models/inventory/StableSection.kt | 2 +- .../models/invitations/GuildInvite.kt | 1 - .../models/invitations/Invitations.kt | 3 - .../models/invitations/PartyInvite.kt | 1 - .../android/habitica/models/members/Member.kt | 3 +- .../models/members/MemberPreferences.kt | 22 +- .../habitica/models/members/PlayerTier.kt | 20 +- .../models/notifications/FirstDropData.kt | 1 - .../notifications/GuildInvitationData.kt | 1 - .../notifications/LoginIncentiveData.kt | 1 - .../notifications/PartyInvitationData.kt | 1 - .../notifications/QuestInvitationData.kt | 1 - .../habitica/models/notifications/Reward.kt | 2 +- .../FallExtraGemsHabiticaPromotion.kt | 50 +-- .../GiftOneGetOneHabiticaPromotion.kt | 21 +- .../models/promotions/HabiticaPromotion.kt | 3 +- .../SpookyExtraGemsHabiticaPromotion.kt | 35 +- .../models/promotions/Survey2021Promotion.kt | 11 +- .../models/responses/BulkTaskScoringData.kt | 2 +- .../models/responses/ErrorResponse.kt | 2 +- .../habitica/models/responses/FeedResponse.kt | 2 +- .../models/responses/HabitResponse.kt | 2 +- .../models/responses/HabiticaError.kt | 2 +- .../models/responses/SkillResponse.kt | 2 +- .../models/responses/TaskDirectionData.kt | 1 - .../models/responses/TaskDirectionDataTemp.kt | 3 +- .../responses/VerifyUsernameResponse.kt | 1 - .../android/habitica/models/shops/Shop.kt | 1 - .../android/habitica/models/shops/ShopItem.kt | 20 +- .../models/shops/ShopItemUnlockCondition.kt | 6 +- .../habitica/models/social/Challenge.kt | 8 +- .../models/social/ChallengeMembership.kt | 3 +- .../habitica/models/social/ChatMessage.kt | 1 - .../habitica/models/social/ChatMessageLike.kt | 1 - .../android/habitica/models/social/Group.kt | 15 +- .../habitica/models/social/GroupCategory.kt | 1 - .../habitica/models/social/GroupMembership.kt | 1 - .../models/social/InboxConversation.kt | 10 +- .../habitica/models/social/UserParty.kt | 7 +- .../habitica/models/social/UserStyles.kt | 1 - .../android/habitica/models/tasks/Days.kt | 5 +- .../habitica/models/tasks/HabitResetOption.kt | 2 +- .../habitica/models/tasks/RemindersItem.kt | 11 +- .../android/habitica/models/tasks/Task.kt | 17 +- .../habitica/models/tasks/TaskDifficulty.kt | 2 +- .../habitica/models/tasks/TaskGroupPlan.kt | 2 - .../android/habitica/models/tasks/TaskList.kt | 2 +- .../android/habitica/models/tasks/TaskTag.kt | 3 +- .../habitica/models/tasks/TasksOrder.kt | 2 +- .../android/habitica/models/user/ABTest.kt | 5 +- .../habitica/models/user/Authentication.kt | 3 - .../models/user/AuthenticationTimestamps.kt | 1 - .../android/habitica/models/user/Backer.kt | 2 +- .../android/habitica/models/user/Buffs.kt | 4 +- .../habitica/models/user/ContributorInfo.kt | 6 +- .../android/habitica/models/user/Flags.kt | 3 +- .../android/habitica/models/user/Gear.kt | 3 +- .../android/habitica/models/user/Hair.kt | 1 - .../android/habitica/models/user/Inbox.kt | 3 +- .../android/habitica/models/user/Items.kt | 11 +- .../android/habitica/models/user/Outfit.kt | 3 - .../models/user/OwnedCustomization.kt | 1 - .../android/habitica/models/user/OwnedItem.kt | 2 - .../habitica/models/user/OwnedMount.kt | 2 - .../habitica/models/user/OwnedObject.kt | 2 +- .../android/habitica/models/user/OwnedPet.kt | 2 - .../habitica/models/user/Preferences.kt | 21 +- .../android/habitica/models/user/Profile.kt | 1 - .../android/habitica/models/user/Purchases.kt | 3 +- .../habitica/models/user/SpecialItems.kt | 2 - .../android/habitica/models/user/Stats.kt | 9 +- .../habitica/models/user/SubscriptionPlan.kt | 3 +- .../user/SubscriptionPlanConsecutive.kt | 3 +- .../habitica/models/user/SuppressedModals.kt | 3 +- .../android/habitica/models/user/Training.kt | 3 +- .../android/habitica/models/user/User.kt | 4 +- .../habitica/models/user/UserAchievement.kt | 2 - .../android/habitica/modules/AppModule.kt | 3 +- .../habitica/modules/DeveloperModule.kt | 4 +- .../habitica/proxy/AnalyticsManager.kt | 1 - .../implementation/EmptyAnalyticsManager.kt | 9 +- .../LocalNotificationActionReceiver.kt | 9 +- .../receivers/NotificationPublisher.kt | 56 +-- .../receivers/TaskAlarmBootReceiver.kt | 1 - .../habitica/receivers/TaskReceiver.kt | 37 +- .../android/habitica/ui/AvatarView.kt | 55 ++- .../habitica/ui/AvatarWithBarsViewModel.kt | 10 +- .../habitica/ui/GemPurchaseOptionsView.kt | 8 +- .../android/habitica/ui/ItemDetailDialog.kt | 10 +- .../habitica/ui/MaxHeightLinearLayout.kt | 8 +- .../android/habitica/ui/RoundedFrameLayout.kt | 9 +- .../android/habitica/ui/SpeechBubbleView.kt | 8 +- .../ui/activities/AdventureGuideActivity.kt | 36 +- .../habitica/ui/activities/BaseActivity.kt | 49 +-- .../ui/activities/ChallengeFormActivity.kt | 183 +++++----- .../ui/activities/ClassSelectionActivity.kt | 69 ++-- .../activities/FixCharacterValuesActivity.kt | 42 ++- .../ui/activities/FullProfileActivity.kt | 74 ++-- .../ui/activities/GemPurchaseActivity.kt | 7 +- .../ui/activities/GiftGemsActivity.kt | 37 +- .../ui/activities/GiftSubscriptionActivity.kt | 44 ++- .../ui/activities/GroupFormActivity.kt | 4 +- .../ui/activities/GroupInviteActivity.kt | 3 - .../ui/activities/GuidelinesActivity.kt | 5 +- .../activities/HabitButtonWidgetActivity.kt | 8 +- .../habitica/ui/activities/IntroActivity.kt | 3 - .../habitica/ui/activities/LoginActivity.kt | 196 +++++----- .../habitica/ui/activities/MainActivity.kt | 336 ++++++++++-------- .../ui/activities/MaintenanceActivity.kt | 18 +- .../ui/activities/NotificationsActivity.kt | 110 +++--- .../habitica/ui/activities/PrefsActivity.kt | 33 +- .../ui/activities/ReportMessageActivity.kt | 49 +-- .../habitica/ui/activities/SetupActivity.kt | 29 +- .../ui/activities/SkillMemberActivity.kt | 21 +- .../ui/activities/SkillTasksActivity.kt | 2 - .../ui/activities/TaskFormActivity.kt | 268 ++++++++------ .../ui/activities/VerifyUsernameActivity.kt | 101 +++--- .../ui/adapter/AchievementsAdapter.kt | 22 +- .../ui/adapter/BaseRecyclerViewAdapter.kt | 10 +- ...stomizationEquipmentRecyclerViewAdapter.kt | 20 +- .../CustomizationRecyclerViewAdapter.kt | 58 ++- .../ui/adapter/NavigationDrawerAdapter.kt | 26 +- .../ui/adapter/SimpleSpinnerAdapter.kt | 3 +- .../adapter/SkillTasksRecyclerViewAdapter.kt | 3 +- .../ui/adapter/SkillsRecyclerViewAdapter.kt | 9 +- .../inventory/EquipmentRecyclerViewAdapter.kt | 4 +- .../inventory/HabiticaClassArrayAdapter.kt | 7 +- .../adapter/inventory/ItemRecyclerAdapter.kt | 13 +- .../inventory/MountDetailRecyclerAdapter.kt | 10 +- .../inventory/PetDetailRecyclerAdapter.kt | 21 +- .../adapter/inventory/ShopRecyclerAdapter.kt | 87 +++-- .../inventory/StableRecyclerAdapter.kt | 21 +- .../setup/CustomizationSetupAdapter.kt | 1 - .../ui/adapter/setup/TaskSetupAdapter.kt | 7 +- .../social/ChallengesListViewAdapter.kt | 2 +- .../adapter/social/ChatRecyclerViewAdapter.kt | 37 +- .../ui/adapter/social/GuildListAdapter.kt | 24 +- .../ui/adapter/social/InboxAdapter.kt | 39 +- .../ChallengeTasksRecyclerViewAdapter.kt | 12 +- .../ChallengesFilterRecyclerViewAdapter.kt | 5 +- .../tasks/BaseTasksRecyclerViewAdapter.kt | 15 +- .../tasks/DailiesRecyclerViewHolder.kt | 17 +- .../tasks/HabitsRecyclerViewAdapter.kt | 16 +- .../RealmBaseTasksRecyclerViewAdapter.kt | 16 +- .../tasks/RewardsRecyclerViewAdapter.kt | 40 ++- .../adapter/tasks/TodosRecyclerViewAdapter.kt | 18 +- .../habitica/ui/fragments/AboutFragment.kt | 37 +- .../ui/fragments/AchievementsFragment.kt | 119 ++++--- .../ui/fragments/BaseDialogFragment.kt | 37 +- .../habitica/ui/fragments/BaseFragment.kt | 32 +- .../habitica/ui/fragments/BaseMainFragment.kt | 10 +- .../ui/fragments/NavigationDrawerFragment.kt | 149 +++++--- .../habitica/ui/fragments/NewsFragment.kt | 1 - .../ui/fragments/PromoInfoFragment.kt | 2 +- .../habitica/ui/fragments/PromoWebFragment.kt | 1 - .../habitica/ui/fragments/StatsFragment.kt | 131 +++---- .../AvatarCustomizationFragment.kt | 66 ++-- .../customization/AvatarEquipmentFragment.kt | 60 +++- .../customization/AvatarOverviewFragment.kt | 16 +- .../equipment/EquipmentDetailFragment.kt | 27 +- .../equipment/EquipmentOverviewFragment.kt | 26 +- .../inventory/items/ItemDialogFragment.kt | 141 ++++---- .../inventory/items/ItemRecyclerFragment.kt | 76 ++-- .../inventory/items/ItemsFragment.kt | 19 +- .../inventory/shops/MarketFragment.kt | 4 +- .../inventory/shops/QuestShopFragment.kt | 4 +- .../inventory/shops/SeasonalShopFragment.kt | 4 +- .../fragments/inventory/shops/ShopFragment.kt | 142 +++++--- .../shops/TimeTravelersShopFragment.kt | 4 +- .../stable/MountDetailRecyclerFragment.kt | 86 +++-- .../stable/PetDetailRecyclerFragment.kt | 115 +++--- .../inventory/stable/StableFragment.kt | 10 +- .../stable/StableRecyclerFragment.kt | 70 ++-- .../preferences/APIPreferenceFragment.kt | 18 +- .../AuthenticationPreferenceFragment.kt | 66 ++-- .../DayStartPreferenceDialogFragment.kt | 10 +- .../EmailNotificationsPreferencesFragment.kt | 4 +- .../preferences/PreferencesFragment.kt | 50 +-- .../preferences/ProfilePreferencesFragment.kt | 13 +- .../PushNotificationsPreferencesFragment.kt | 4 +- .../TimePreferenceDialogFragment.kt | 10 +- .../purchases/GemsPurchaseFragment.kt | 18 +- .../purchases/GiftBalanceGemsFragment.kt | 23 +- .../purchases/GiftPurchaseGemsFragment.kt | 18 +- .../purchases/SubscriptionFragment.kt | 89 +++-- .../ui/fragments/setup/AvatarSetupFragment.kt | 2 - .../ui/fragments/setup/IntroFragment.kt | 1 - .../ui/fragments/setup/TaskSetupFragment.kt | 17 +- .../ui/fragments/setup/WelcomeFragment.kt | 42 ++- .../skills/SkillTasksRecyclerViewFragment.kt | 24 +- .../ui/fragments/skills/SkillsFragment.kt | 52 +-- .../ui/fragments/social/ChatFragment.kt | 59 +-- .../social/InboxMessageListFragment.kt | 104 +++--- .../fragments/social/InboxOverviewFragment.kt | 52 +-- .../fragments/social/QuestDetailFragment.kt | 104 +++--- .../fragments/social/TavernDetailFragment.kt | 43 ++- .../ui/fragments/social/TavernFragment.kt | 10 +- .../challenges/ChallengeDetailFragment.kt | 103 +++--- .../challenges/ChallengeFilterDialogHolder.kt | 26 +- .../challenges/ChallengeListFragment.kt | 73 ++-- .../challenges/ChallengesOverviewFragment.kt | 9 +- .../social/guilds/GuildDetailFragment.kt | 4 +- .../fragments/social/guilds/GuildFragment.kt | 18 +- .../social/guilds/GuildListFragment.kt | 32 +- .../social/guilds/GuildOverviewFragment.kt | 10 +- .../social/party/NoPartyFragmentFragment.kt | 63 ++-- .../social/party/PartyDetailFragment.kt | 96 +++-- .../fragments/social/party/PartyFragment.kt | 22 +- .../social/party/PartyInviteFragment.kt | 1 - .../ui/fragments/support/BugFixFragment.kt | 38 +- .../ui/fragments/support/FAQDetailFragment.kt | 16 +- .../fragments/support/FAQOverviewFragment.kt | 37 +- .../fragments/support/SupportMainFragment.kt | 18 +- .../tasks/RewardsRecyclerviewFragment.kt | 63 ++-- .../tasks/TaskRecyclerViewFragment.kt | 154 ++++---- .../ui/fragments/tasks/TasksFragment.kt | 124 ++++--- .../ui/fragments/tasks/TeamBoardFragment.kt | 142 +++++--- .../ui/helpers/AutocompleteAdapter.kt | 6 +- .../ui/helpers/AutocompleteTokenizer.kt | 11 +- .../habitica/ui/helpers/DataBindingUtils.kt | 15 +- .../habitica/ui/helpers/EmojiParser.kt | 2 +- .../habitica/ui/helpers/KeyboardUtil.kt | 3 +- .../habitica/ui/helpers/MarkdownParser.kt | 29 +- .../ui/helpers/RecyclerViewEmptySupport.kt | 26 +- .../ui/helpers/SafeDefaultItemAnimator.kt | 170 +++++---- .../habitica/ui/helpers/ToolbarColorHelper.kt | 24 +- .../habitica/ui/menu/HabiticaDrawerItem.kt | 2 +- .../ui/viewHolders/BindableViewHolder.kt | 2 +- .../ui/viewHolders/ChatRecyclerViewHolder.kt | 55 +-- .../ui/viewHolders/MemberViewHolder.kt | 1 - .../ui/viewHolders/MountViewHolder.kt | 3 - .../habitica/ui/viewHolders/PetViewHolder.kt | 23 +- .../ui/viewHolders/SectionViewHolder.kt | 20 +- .../ui/viewHolders/ShopItemViewHolder.kt | 22 +- .../viewHolders/tasks/BaseTaskViewHolder.kt | 51 +-- .../tasks/ChecklistedViewHolder.kt | 59 +-- .../ui/viewHolders/tasks/DailyViewHolder.kt | 2 +- .../ui/viewHolders/tasks/HabitViewHolder.kt | 5 - .../ui/viewHolders/tasks/TodoViewHolder.kt | 2 - .../habitica/ui/viewmodels/BaseViewModel.kt | 2 +- .../habitica/ui/viewmodels/GroupViewModel.kt | 158 +++++--- .../habitica/ui/viewmodels/InboxViewModel.kt | 85 +++-- .../ui/viewmodels/NotificationsViewModel.kt | 220 +++++++----- .../habitica/ui/viewmodels/PartyViewModel.kt | 69 ++-- .../AdventureGuideDrawerArrowDrawable.kt | 3 +- .../ui/views/CollapsibleSectionView.kt | 97 ++--- .../android/habitica/ui/views/CurrencyView.kt | 65 ++-- .../habitica/ui/views/CurrencyViews.kt | 20 +- .../habitica/ui/views/DayNightTextView.kt | 16 +- .../habitica/ui/views/DragLinearLayout.kt | 32 +- .../habitica/ui/views/EllipsisTextView.kt | 3 +- .../habitica/ui/views/EquipmentItemRow.kt | 27 +- .../habitica/ui/views/FadingViewPager.kt | 3 +- .../ui/views/HabiticaAutocompleteTextView.kt | 4 +- .../habitica/ui/views/HabiticaProgressBar.kt | 40 +-- .../habitica/ui/views/HabiticaSnackbar.kt | 27 +- .../habitica/ui/views/NPCBannerView.kt | 21 +- .../ui/views/SupportCollapsibleSection.kt | 7 +- .../android/habitica/ui/views/Typewriter.kt | 5 +- .../android/habitica/ui/views/ValueBar.kt | 26 +- .../AdventureGuideMenuBanner.kt | 6 +- .../views/dialogs/AchievementDetailDialog.kt | 5 +- .../ui/views/dialogs/AchievementDialog.kt | 2 +- .../habitica/ui/views/dialogs/DetailDialog.kt | 18 +- .../ui/views/dialogs/HabiticaAlertDialog.kt | 96 ++--- .../views/dialogs/HabiticaProgressDialog.kt | 2 +- .../views/dialogs/OpenedMysteryitemDialog.kt | 4 +- .../ui/views/dialogs/PetSuggestHatchDialog.kt | 34 +- .../ui/views/dialogs/QuestCompletedDialog.kt | 2 +- .../dialogs/QuestCompletedDialogContent.kt | 5 +- .../views/equipment/EquipmentOverviewItem.kt | 6 +- .../views/equipment/EquipmentOverviewView.kt | 9 +- .../InsufficientHourglassesDialog.kt | 2 +- .../ui/views/login/LockableScrollView.kt | 1 - .../ui/views/login/LoginBackgroundView.kt | 3 +- .../habitica/ui/views/login/StarView.kt | 3 - .../views/navigation/BottomNavigationItem.kt | 60 ++-- .../navigation/BottomNavigationSubmenuItem.kt | 31 +- .../HabiticaBottomNavigationView.kt | 72 ++-- .../habitica/ui/views/promo/PromoMenuView.kt | 14 +- .../ui/views/promo/PromoMenuViewHolder.kt | 2 +- .../promo/SubscriptionBuyGemsPromoView.kt | 6 +- .../SubscriptionBuyGemsPromoViewHolder.kt | 2 +- .../ui/views/setup/AvatarCategoryView.kt | 10 +- .../views/setup/AvatarCustomizationDrawer.kt | 1 - .../habitica/ui/views/shops/PurchaseDialog.kt | 117 +++--- .../ui/views/shops/PurchaseDialogContent.kt | 4 +- .../views/shops/PurchaseDialogQuestContent.kt | 4 +- .../habitica/ui/views/social/ChatBarView.kt | 27 +- .../ui/views/social/InvitationsView.kt | 6 +- .../ui/views/social/OldQuestProgressView.kt | 15 +- .../habitica/ui/views/social/QuestMenuView.kt | 4 +- .../ui/views/social/QuestProgressView.kt | 50 +-- .../habitica/ui/views/social/UsernameLabel.kt | 54 +-- .../ui/views/stats/BulkAllocateStatsDialog.kt | 68 ++-- .../ui/views/stats/StatsSliderView.kt | 38 +- .../habitica/ui/views/stats/StatsView.kt | 9 +- .../subscriptions/SubscriptionDetailsView.kt | 23 +- .../subscriptions/SubscriptionOptionView.kt | 9 +- .../ui/views/tasks/TaskFilterDialog.kt | 42 ++- .../ui/views/tasks/form/ChecklistContainer.kt | 14 +- .../views/tasks/form/ChecklistItemFormView.kt | 89 ++--- .../tasks/form/HabitResetStreakButtons.kt | 21 +- .../tasks/form/HabitScoringButtonsView.kt | 4 +- .../ui/views/tasks/form/ReminderContainer.kt | 20 +- .../views/tasks/form/ReminderItemFormView.kt | 51 +-- .../views/tasks/form/StepperValueFormView.kt | 104 +++--- .../views/tasks/form/TaskDifficultyButtons.kt | 18 +- .../tasks/form/TaskSchedulingControls.kt | 143 ++++---- .../views/yesterdailies/YesterdailyDialog.kt | 111 +++--- .../utils/AchievementListDeserializer.kt | 5 +- .../android/habitica/utils/Action1.kt | 2 +- .../habitica/utils/BooleanAsIntAdapter.kt | 1 - .../habitica/utils/ChallengeDeserializer.kt | 3 - .../utils/ChallengeListDeserializer.kt | 5 +- .../habitica/utils/ChatMessageDeserializer.kt | 2 +- .../habitica/utils/ContentDeserializer.kt | 9 +- .../utils/CustomizationDeserializer.kt | 7 +- .../habitica/utils/DateDeserializer.kt | 3 +- .../utils/FAQArticleListDeserilializer.kt | 1 - .../utils/FeedResponseDeserializer.kt | 1 - .../utils/FindUsernameResultDeserializer.kt | 2 +- .../habitica/utils/GroupSerialization.kt | 8 +- .../habitica/utils/MemberSerialization.kt | 11 +- .../utils/OwnedItemListDeserializer.kt | 4 +- .../utils/OwnedMountListDeserializer.kt | 2 +- .../utils/OwnedPetListDeserializer.kt | 2 +- .../utils/QuestDropItemsListSerialization.kt | 4 +- .../habitica/utils/SkillDeserializer.kt | 11 +- .../habitica/utils/TaskListDeserializer.kt | 19 +- .../android/habitica/utils/TaskSerializer.kt | 27 +- .../habitica/utils/TaskTagDeserializer.kt | 7 +- .../habitica/utils/UserDeserializer.kt | 32 +- .../habitica/utils/WorldStateSerialization.kt | 7 +- .../habitica/widget/AddTaskWidgetProvider.kt | 12 +- .../widget/AvatarStatsWidgetProvider.kt | 1 - .../habitica/widget/BaseWidgetProvider.kt | 16 +- .../habitica/widget/DailiesListFactory.kt | 4 +- .../habitica/widget/DailiesWidgetProvider.kt | 1 - .../habitica/widget/DailiesWidgetService.kt | 2 - .../widget/HabitButtonWidgetProvider.kt | 20 +- .../widget/HabitButtonWidgetService.kt | 8 +- .../habitica/widget/TaskListFactory.kt | 27 +- .../habitica/widget/TaskListWidgetProvider.kt | 25 +- .../habitica/widget/TodoListFactory.kt | 1 - .../habitica/ReleaseDeveloperModule.kt | 10 +- .../habitica/proxy/AnalyticsManagerImpl.kt | 12 +- .../extensions/Date_ExtensionsKtTest.kt | 2 +- .../habitica/helpers/HealthFormatterTest.kt | 2 +- .../habitica/models/inventory/MountTest.kt | 2 +- .../habitica/models/inventory/PetTest.kt | 2 +- build.gradle | 6 +- .../shared/habitica/PlatformLogger.kt | 3 +- .../com/habitrpg/shared/habitica/HLogger.kt | 56 +-- .../shared/habitica/PlatformLogger.kt | 2 +- 513 files changed, 6894 insertions(+), 5752 deletions(-) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 3c1454e31..ddc7ff00f 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -3,7 +3,6 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' -apply plugin: 'com.noveogroup.android.check' apply plugin: 'realm-android' apply plugin: 'androidx.navigation.safeargs' apply plugin: 'com.google.firebase.firebase-perf' @@ -17,11 +16,6 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:4.2.2' - classpath('com.noveogroup.android:check:1.2.5') { - exclude module: 'checkstyle' - exclude module: 'pmd-java' - } - classpath 'com.puppycrawl.tools:checkstyle:7.5' classpath 'net.sourceforge.pmd:pmd-java:5.5.3' } } @@ -52,8 +46,8 @@ dependencies { implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' //Dependency Injection - implementation 'com.google.dagger:dagger:2.36' - kapt 'com.google.dagger:dagger-compiler:2.36' + implementation 'com.google.dagger:dagger:2.38' + kapt 'com.google.dagger:dagger-compiler:2.38' compileOnly 'javax.annotation:javax.annotation-api:1.3.2' compileOnly 'com.github.pengrad:jdk9-deps:1.0' //App Compatibility and Material Design @@ -73,13 +67,13 @@ dependencies { // IAP Handling / Verification implementation 'org.solovyev.android:checkout:1.2.3' //Facebook - implementation('com.facebook.android:facebook-android-sdk:8.1.0') { + implementation('com.facebook.android:facebook-android-sdk:11.3.0') { transitive = true } implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1@aar' //RxJava implementation 'io.reactivex.rxjava3:rxandroid:3.0.0' - implementation 'io.reactivex.rxjava3:rxjava:3.0.13' + implementation 'io.reactivex.rxjava3:rxjava:3.1.1' implementation 'io.reactivex.rxjava3:rxkotlin:3.0.1' implementation 'io.reactivex.rxjava2:rxjava:2.2.21' implementation "com.github.akarnokd:rxjava3-bridge:3.0.0" @@ -94,16 +88,16 @@ dependencies { testImplementation 'androidx.test:core:1.4.0' testImplementation "com.google.truth:truth:1.0.1" testImplementation 'org.assertj:assertj-core:2.6.0' - testImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2' - testImplementation 'org.robolectric:robolectric:4.3' - testImplementation 'org.robolectric:shadows-multidex:3.8' + testImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.7' + testImplementation 'org.robolectric:robolectric:4.6.1' + testImplementation 'org.robolectric:shadows-multidex:4.6.1' testImplementation 'org.mockito:mockito-core:2.25.0' testImplementation 'org.powermock:powermock-api-mockito2:1.7.0' testImplementation 'org.powermock:powermock-module-junit4-rule-agent:1.7.0' testImplementation 'org.powermock:powermock-module-junit4-rule:1.7.0' testImplementation 'org.powermock:powermock-module-junit4:1.7.0' //Leak Detection - debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' //Push Notifications implementation platform('com.google.firebase:firebase-bom:28.3.0') implementation 'com.google.firebase:firebase-crashlytics' @@ -112,7 +106,7 @@ dependencies { implementation 'com.google.firebase:firebase-config' implementation 'com.google.firebase:firebase-perf' implementation 'com.google.android.gms:play-services-auth:19.2.0' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.20" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.30" implementation 'com.nex3z:flow-layout:1.2.2' implementation 'androidx.core:core-ktx:1.6.0' @@ -147,8 +141,8 @@ android { buildConfigField "String", "TESTING_LEVEL", "\"production\"" resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW" - versionCode 3036 - versionName "3.3.1" + versionCode 3044 + versionName "3.4" } buildFeatures { @@ -334,6 +328,4 @@ gradle.projectsEvaluated { } } -check { findbugs { skip true } } - apply plugin: 'com.google.gms.google-services' 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 53bc6df66..216c0d5a2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt @@ -48,7 +48,7 @@ import org.solovyev.android.checkout.Checkout import org.solovyev.android.checkout.PurchaseVerifier import javax.inject.Inject -//contains all HabiticaApplicationLogic except dagger componentInitialisation +// contains all HabiticaApplicationLogic except dagger componentInitialisation abstract class HabiticaBaseApplication : Application() { @Inject internal lateinit var lazyApiHelper: ApiClient @@ -90,12 +90,11 @@ abstract class HabiticaBaseApplication : Application() { try { Amplitude.getInstance().initialize(this, getString(R.string.amplitude_app_id)).enableForegroundTracking(this) val identify = Identify() - .setOnce("androidStore", BuildConfig.STORE) - .set("launch_screen", sharedPrefs.getString("launch_screen", "")) + .setOnce("androidStore", BuildConfig.STORE) + .set("launch_screen", sharedPrefs.getString("launch_screen", "")) Amplitude.getInstance().identify(identify) } catch (ignored: Resources.NotFoundException) { } - } var builder = ImageLoader.Builder(this) .transition(CrossfadeTransition()) @@ -121,9 +120,9 @@ abstract class HabiticaBaseApplication : Application() { protected open fun setupRealm() { Realm.init(this) val builder = RealmConfiguration.Builder() - .schemaVersion(1) - .deleteRealmIfMigrationNeeded() - .allowWritesOnUiThread(true) + .schemaVersion(1) + .deleteRealmIfMigrationNeeded() + .allowWritesOnUiThread(true) .compactOnLaunch { totalBytes, usedBytes -> // Compact if the file is over 100MB in size and less than 50% 'used' @@ -133,9 +132,8 @@ abstract class HabiticaBaseApplication : Application() { try { Realm.setDefaultConfiguration(builder.build()) } catch (ignored: UnsatisfiedLinkError) { - //Catch crash in tests + // Catch crash in tests } - } private fun checkIfNewVersion() { @@ -168,13 +166,20 @@ abstract class HabiticaBaseApplication : Application() { protected abstract fun initDagger(): AppComponent - override fun openOrCreateDatabase(name: String, - mode: Int, factory: SQLiteDatabase.CursorFactory?): SQLiteDatabase { + override fun openOrCreateDatabase( + name: String, + mode: Int, + factory: SQLiteDatabase.CursorFactory? + ): SQLiteDatabase { return super.openOrCreateDatabase(getDatabasePath(name).absolutePath, mode, factory) } - override fun openOrCreateDatabase(name: String, - mode: Int, factory: SQLiteDatabase.CursorFactory?, errorHandler: DatabaseErrorHandler?): SQLiteDatabase { + override fun openOrCreateDatabase( + name: String, + mode: Int, + factory: SQLiteDatabase.CursorFactory?, + errorHandler: DatabaseErrorHandler? + ): SQLiteDatabase { return super.openOrCreateDatabase(getDatabasePath(name).absolutePath, mode, factory, errorHandler) } @@ -192,19 +197,22 @@ abstract class HabiticaBaseApplication : Application() { } private fun createBillingAndCheckout() { - billing = Billing(this, object : Billing.DefaultConfiguration() { - override fun getPublicKey(): String { - return "DONT-NEED-IT" - } + billing = Billing( + this, + object : Billing.DefaultConfiguration() { + override fun getPublicKey(): String { + return "DONT-NEED-IT" + } - override fun getCache(): Cache { - return Billing.newCache() - } + override fun getCache(): Cache { + return Billing.newCache() + } - override fun getPurchaseVerifier(): PurchaseVerifier { - return HabiticaPurchaseVerifier(this@HabiticaBaseApplication, lazyApiHelper) + override fun getPurchaseVerifier(): PurchaseVerifier { + return HabiticaPurchaseVerifier(this@HabiticaBaseApplication, lazyApiHelper) + } } - }) + ) billing?.let { checkout = Checkout.forApplication(it) } } @@ -212,8 +220,8 @@ abstract class HabiticaBaseApplication : Application() { private fun setupRemoteConfig() { val remoteConfig = FirebaseRemoteConfig.getInstance() val configSettings = FirebaseRemoteConfigSettings.Builder() - .setMinimumFetchIntervalInSeconds(if (BuildConfig.DEBUG) 0 else 3600) - .build() + .setMinimumFetchIntervalInSeconds(if (BuildConfig.DEBUG) 0 else 3600) + .build() remoteConfig.setConfigSettingsAsync(configSettings) remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults) remoteConfig.fetchAndActivate() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaPurchaseVerifier.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaPurchaseVerifier.kt index f042a67ee..7ddbb4073 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaPurchaseVerifier.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaPurchaseVerifier.kt @@ -19,7 +19,6 @@ import org.solovyev.android.checkout.ResponseCodes import retrofit2.HttpException import java.util.* - class HabiticaPurchaseVerifier(context: Context, apiClient: ApiClient) : BasePurchaseVerifier() { private val apiClient: ApiClient private val purchasedOrderList: MutableSet = HashSet() @@ -93,7 +92,7 @@ class HabiticaPurchaseVerifier(context: Context, apiClient: ApiClient) : BasePur } private fun handleError(throwable: Throwable, purchase: Purchase, requestListener: RequestListener>, verifiedPurchases: MutableList) { - (throwable as? HttpException)?.let {error -> + (throwable as? HttpException)?.let { error -> if (error.code() == 401) { val res = apiClient.getErrorResponse(throwable) if (res.message != null && res.message == "RECEIPT_ALREADY_USED") { @@ -159,4 +158,4 @@ class HabiticaPurchaseVerifier(context: Context, apiClient: ApiClient) : BasePur pendingGifts = loadPendingGifts() this.apiClient = apiClient } -} \ No newline at end of file +} 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 60ae8026c..795d5463c 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 @@ -30,13 +30,11 @@ interface ApiService { @get:GET("user/") val user: Flowable> - @GET("inbox/messages") fun getInboxMessages(@Query("conversation") uuid: String, @Query("page") page: Int): Flowable>> @GET("inbox/conversations") fun getInboxConversations(): Flowable>> - @get:GET("tasks/user") val tasks: Flowable> @@ -94,7 +92,6 @@ interface ApiService { @GET("tasks/user") fun getTasks(@Query("type") type: String, @Query("dueDate") dueDate: String): Flowable> - @POST("user/unlock") fun unlockPath(@Query("path") path: String): Flowable> @@ -124,7 +121,6 @@ interface ApiService { @DELETE("tasks/{id}") fun deleteTask(@Path("id") id: String): Flowable> - @POST("tags") fun createTag(@Body tag: Tag): Flowable> @@ -170,7 +166,6 @@ interface ApiService { @POST("user/mark-pms-read") fun markPrivateMessagesRead(): Flowable - /* Group API */ @GET("groups") @@ -264,7 +259,7 @@ interface ApiService { @POST("user/custom-day-start") fun changeCustomDayStart(@Body updateObject: Map): Flowable> - //Members URL + // Members URL @GET("members/{mid}") fun getMember(@Path("mid") memberId: String): Flowable> @@ -289,7 +284,7 @@ interface ApiService { @GET("shops/market-gear") fun retrieveMarketGear(): Flowable> - //Push notifications + // Push notifications @POST("user/push-devices") fun addPushDevice(@Body pushDeviceData: Map): Flowable>> @@ -331,8 +326,7 @@ interface ApiService { @DELETE("challenges/{challengeId}") fun deleteChallenge(@Path("challengeId") challengeId: String): Flowable> - - //DEBUG: These calls only work on a local development server + // DEBUG: These calls only work on a local development server @POST("debug/add-ten-gems") fun debugAddTenGems(): Flowable> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/HostConfig.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/api/HostConfig.kt index e35f4f222..c66f85e70 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/HostConfig.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/HostConfig.kt @@ -8,7 +8,6 @@ import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.helpers.KeyHelper - /** * The configuration of the host

* Currently, the Port isn't used at all. @@ -69,6 +68,4 @@ class HostConfig { fun hasAuthentication(): Boolean { return userID.isNotEmpty() && apiKey.isNotEmpty() } - } - diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/Server.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/api/Server.kt index 5a549b83b..c40c2a886 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/Server.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/Server.kt @@ -25,4 +25,4 @@ class Server { override fun toString(): String { return addr } -} \ No newline at end of file +} 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 00acf848c..88586a755 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 @@ -19,7 +19,6 @@ import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.FlowableTransformer import retrofit2.HttpException - interface ApiClient { val hostConfig: HostConfig @@ -32,7 +31,6 @@ interface ApiClient { val user: Flowable - val tasks: Flowable /* challenges api */ @@ -74,7 +72,6 @@ interface ApiClient { fun getTasks(type: String): Flowable fun getTasks(type: String, dueDate: String): Flowable - fun unlockPath(path: String): Flowable fun getTask(id: String): Flowable @@ -94,7 +91,6 @@ interface ApiClient { fun deleteTask(id: String): Flowable - fun createTag(tag: Tag): Flowable fun updateTag(id: String, tag: Tag): Flowable @@ -179,7 +175,7 @@ interface ApiClient { fun changeCustomDayStart(updateObject: Map): Flowable - //Members URL + // Members URL fun getMember(memberId: String): Flowable fun getMemberWithUsername(username: String): Flowable @@ -189,7 +185,7 @@ interface ApiClient { fun retrieveShopIventory(identifier: String): Flowable - //Push notifications + // Push notifications fun addPushDevice(pushDeviceData: Map): Flowable> fun deletePushDevice(regId: String): Flowable> @@ -202,7 +198,6 @@ interface ApiClient { fun leaveChallenge(challengeId: String, body: LeaveChallengeBody): Flowable - fun createChallenge(challenge: Challenge): Flowable fun createChallengeTasks(challengeId: String, tasks: List): Flowable> @@ -210,7 +205,7 @@ interface ApiClient { fun updateChallenge(challenge: Challenge): Flowable fun deleteChallenge(challengeId: String): Flowable - //DEBUG: These calls only work on a local development server + // DEBUG: These calls only work on a local development server fun debugAddTenGems(): Flowable 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 b95c5fb5b..6f5758b2e 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 @@ -26,13 +26,17 @@ interface ChallengeRepository : BaseRepository { * @param removedTaskList tasks that has be to be removed * @return Observable with the updated challenge */ - fun updateChallenge(challenge: Challenge, fullTaskList: List, - addedTaskList: List, updatedTaskList: List, removedTaskList: List): Flowable + fun updateChallenge( + challenge: Challenge, + fullTaskList: List, + addedTaskList: List, + updatedTaskList: List, + removedTaskList: List + ): Flowable fun deleteChallenge(challengeId: String): Flowable fun getUserChallenges(userId: String? = null): Flowable> - fun leaveChallenge(challenge: Challenge, keepTasks: String): Flowable fun joinChallenge(challenge: Challenge): Flowable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt index 201fd838e..1c4d3a7a5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.data import android.content.Context import com.habitrpg.android.habitica.models.ContentResult import com.habitrpg.android.habitica.models.WorldState - import io.reactivex.rxjava3.core.Flowable interface ContentRepository { 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 f1945094c..f65af96df 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 @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.data import com.habitrpg.android.habitica.models.inventory.Customization - import io.reactivex.rxjava3.core.Flowable interface CustomizationRepository : BaseRepository { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.kt index 76d0e6ca5..9ead63c61 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.data import com.habitrpg.android.habitica.models.FAQArticle - import io.reactivex.rxjava3.core.Flowable interface FAQRepository : BaseRepository { 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 16596388c..1a0ce4c77 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 @@ -8,7 +8,6 @@ import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.user.* import io.reactivex.rxjava3.core.Flowable - interface InventoryRepository : BaseRepository { fun getArmoireRemainingCount(): Long 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 75db1abf9..47402ae28 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.data - import com.habitrpg.android.habitica.models.SetupCustomization import com.habitrpg.android.habitica.models.user.User 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 3556496db..61da77a81 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 @@ -41,7 +41,6 @@ interface SocialRepository : BaseRepository { fun retrieveGroups(type: String): Flowable> fun getGroups(type: String): Flowable> - fun getInboxMessages(replyToUserID: String?): Flowable> fun retrieveInboxMessages(uuid: String, page: Int): Flowable> fun retrieveInboxConversations(): Flowable> @@ -49,7 +48,6 @@ interface SocialRepository : BaseRepository { fun postPrivateMessage(recipientId: String, messageObject: HashMap): Flowable> fun postPrivateMessage(recipientId: String, message: String): Flowable> - fun getGroupMembers(id: String): Flowable> fun retrieveGroupMembers(id: String, includeAllPublicFields: Boolean): Flowable> @@ -62,7 +60,6 @@ interface SocialRepository : BaseRepository { fun markPrivateMessagesRead(user: User?): Flowable - fun transferGroupOwnership(groupID: String, userID: String): Flowable fun removeMemberFromGroup(groupID: String, userID: String): Flowable> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TagRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TagRepository.kt index 74fbf2d76..8369c33cd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TagRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TagRepository.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.data import com.habitrpg.android.habitica.models.Tag - import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single @@ -14,7 +13,6 @@ interface TagRepository : BaseRepository { fun updateTag(tag: Tag): Flowable fun deleteTag(id: String): Flowable - fun createTags(tags: Collection): Single> fun updateTags(tags: Collection): Single> fun deleteTags(tagIds: Collection): Single> 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 d5823d215..69feb2468 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 @@ -1,10 +1,8 @@ package com.habitrpg.android.habitica.data import com.habitrpg.android.habitica.models.BaseMainObject -import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.responses.BulkTaskScoringData import com.habitrpg.android.habitica.models.responses.TaskScoringResult -import com.habitrpg.android.habitica.models.tasks.RemindersItem import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.tasks.TaskList import com.habitrpg.android.habitica.models.tasks.TasksOrder @@ -36,7 +34,7 @@ interface TaskRepository : BaseRepository { fun markTaskCompleted(taskId: String, isCompleted: Boolean) - fun modify(obj: T, transaction: (T) -> Unit) + fun modify(obj: T, transaction: (T) -> Unit) fun swapTaskPosition(firstPosition: Int, secondPosition: Int) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TutorialRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TutorialRepository.kt index 83412b1a6..f982b7f3e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TutorialRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TutorialRepository.kt @@ -7,5 +7,4 @@ interface TutorialRepository : BaseRepository { fun getTutorialStep(key: String): Flowable fun getTutorialSteps(keys: List): Flowable> - } 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 f8f4b5f5c..cb3be418e 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 @@ -32,9 +32,9 @@ import com.habitrpg.android.habitica.models.user.Items import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.proxy.AnalyticsManager +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.FlowableTransformer -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.schedulers.Schedulers import okhttp3.Cache @@ -54,12 +54,10 @@ import java.util.* import java.util.concurrent.TimeUnit import javax.net.ssl.SSLException - -class ApiClientImpl//private OnHabitsAPIResult mResultListener; -//private HostConfig mConfig; +class ApiClientImpl // private OnHabitsAPIResult mResultListener; +// private HostConfig mConfig; (private val gsonConverter: GsonConverterFactory, override val hostConfig: HostConfig, private val analyticsManager: AnalyticsManager, private val notificationsManager: NotificationsManager, private val context: Context) : Consumer, ApiClient { - private lateinit var retrofitAdapter: Retrofit // I think we don't need the ApiClientImpl anymore we could just use ApiService @@ -67,17 +65,16 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; private val apiCallTransformer = FlowableTransformer, Any> { observable -> observable - .filter { it.data != null } - .map { habitResponse -> - habitResponse.notifications?.let { - notificationsManager.setNotifications(it) - - } - habitResponse.data + .filter { it.data != null } + .map { habitResponse -> + habitResponse.notifications?.let { + notificationsManager.setNotifications(it) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .doOnError(this) + habitResponse.data + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnError(this) } private var languageCode: String? = null private var lastAPICallURL: String? = null @@ -104,43 +101,43 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; val cacheSize: Long = 10 * 1024 * 1024 // 10 MB - val cache = Cache(getCacheDir(), cacheSize) + val cache = getCacheDir()?.let { Cache(it, cacheSize) } val client = OkHttpClient.Builder() - .cache(cache) - .addInterceptor(logging) - .addNetworkInterceptor { chain -> - val original = chain.request() - var builder: Request.Builder = original.newBuilder() - if (this.hostConfig.hasAuthentication()) { - builder = builder - .header("x-api-key", this.hostConfig.apiKey) - .header("x-api-user", this.hostConfig.userID) - } - builder = builder.header("x-client", "habitica-android") - .header("x-user-timezoneOffset", timezoneOffset.toString()) - if (userAgent != null) { - builder = builder.header("user-agent", userAgent) - } - if (BuildConfig.STAGING_KEY.isNotEmpty()) { - builder = builder.header("Authorization", "Basic " + BuildConfig.STAGING_KEY) - } - val request = builder.method(original.method, original.body) - .build() - lastAPICallURL = original.url.toString() - chain.proceed(request) + .cache(cache) + .addInterceptor(logging) + .addNetworkInterceptor { chain -> + val original = chain.request() + var builder: Request.Builder = original.newBuilder() + if (this.hostConfig.hasAuthentication()) { + builder = builder + .header("x-api-key", this.hostConfig.apiKey) + .header("x-api-user", this.hostConfig.userID) } - .readTimeout(2400, TimeUnit.SECONDS) - .build() + builder = builder.header("x-client", "habitica-android") + .header("x-user-timezoneOffset", timezoneOffset.toString()) + if (userAgent != null) { + builder = builder.header("user-agent", userAgent) + } + if (BuildConfig.STAGING_KEY.isNotEmpty()) { + builder = builder.header("Authorization", "Basic " + BuildConfig.STAGING_KEY) + } + val request = builder.method(original.method, original.body) + .build() + lastAPICallURL = original.url.toString() + chain.proceed(request) + } + .readTimeout(2400, TimeUnit.SECONDS) + .build() val server = Server(this.hostConfig.address) retrofitAdapter = Retrofit.Builder() - .client(client) - .baseUrl(server.toString()) - .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) - .addConverterFactory(gsonConverter) - .build() + .client(client) + .baseUrl(server.toString()) + .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) + .addConverterFactory(gsonConverter) + .build() this.apiService = retrofitAdapter.create(ApiService::class.java) } @@ -199,7 +196,7 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; val status = error.code() if (status == 404 || error.response()?.raw()?.request?.url?.toString()?.endsWith("/user/push-devices") == true) { - //workaround for an error that sometimes displays that the user already has this push device + // workaround for an error that sometimes displays that the user already has this push device return } @@ -224,14 +221,13 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; override fun getErrorResponse(throwable: HttpException): ErrorResponse { val errorResponse = throwable.response()?.errorBody() ?: return ErrorResponse() val errorConverter = gsonConverter - .responseBodyConverter(ErrorResponse::class.java, arrayOfNulls(0), retrofitAdapter) + .responseBodyConverter(ErrorResponse::class.java, arrayOfNulls(0), retrofitAdapter) return try { errorConverter?.convert(errorResponse) as ErrorResponse } catch (e: IOException) { analyticsManager.logError("Json Error: " + lastAPICallURL + ", " + e.message) ErrorResponse() } - } override fun retrieveUser(withTasks: Boolean): Flowable { @@ -241,11 +237,13 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; if (withTasks) { val tasksObservable = this.tasks - userObservable = Flowable.zip(userObservable, tasksObservable, - { habitRPGUser, tasks -> - habitRPGUser.tasks = tasks - habitRPGUser - }) + userObservable = Flowable.zip( + userObservable, tasksObservable, + { habitRPGUser, tasks -> + habitRPGUser.tasks = tasks + habitRPGUser + } + ) } return userObservable } @@ -375,11 +373,11 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; override fun feedPet(petKey: String, foodKey: String): Flowable { return apiService.feedPet(petKey, foodKey) - .map { - it.data?.message = it.message - it - } - .compose(configureApiCallObserver()) + .map { + it.data?.message = it.message + it + } + .compose(configureApiCallObserver()) } override fun hatchPet(eggKey: String, hatchingPotionKey: String): Flowable { @@ -393,12 +391,10 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; return apiService.getTasks(type).compose(configureApiCallObserver()) } - override fun getTasks(type: String, dueDate: String): Flowable { return apiService.getTasks(type, dueDate).compose(configureApiCallObserver()) } - override fun unlockPath(path: String): Flowable { return apiService.unlockPath(path).compose(configureApiCallObserver()) } @@ -480,11 +476,11 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; } override fun markPrivateMessagesRead(): Flowable { - //This is necessary, because the API call returns weird data. + // This is necessary, because the API call returns weird data. return apiService.markPrivateMessagesRead() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .doOnError(this) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnError(this) } override fun listGroups(type: String): Flowable> { @@ -654,7 +650,6 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; return apiService.leaveChallenge(challengeId, body).compose(configureApiCallObserver()) } - override fun createChallenge(challenge: Challenge): Flowable { return apiService.createChallenge(challenge).compose(configureApiCallObserver()) } @@ -702,7 +697,6 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; return apiService.runCron().compose(configureApiCallObserver()) } - override fun reroll(): Flowable { return apiService.reroll().compose(configureApiCallObserver()) } 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 a8283dfe0..052ca84d9 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 @@ -11,14 +11,14 @@ abstract class BaseRepositoryImpl(protected val localRe this.localRepository.close() } - override fun getUnmanagedCopy(list: List): List { + override fun getUnmanagedCopy(list: List): List { return localRepository.getUnmanagedCopy(list) } override val isClosed: Boolean get() = localRepository.isClosed - override fun getUnmanagedCopy(obj: T): T { + override fun getUnmanagedCopy(obj: T): T { return localRepository.getUnmanagedCopy(obj) } } 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 29f505a27..0973b1054 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 @@ -11,7 +11,6 @@ import com.habitrpg.android.habitica.models.tasks.TaskList import com.habitrpg.android.habitica.models.tasks.TasksOrder import io.reactivex.rxjava3.core.Flowable - class ChallengeRepositoryImpl(localRepository: ChallengeLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl(localRepository, apiClient, userID), ChallengeRepository { override fun isChallengeMember(challengeID: String): Flowable { @@ -85,16 +84,21 @@ class ChallengeRepositoryImpl(localRepository: ChallengeLocalRepository, apiClie } } - override fun updateChallenge(challenge: Challenge, fullTaskList: List, - addedTaskList: List, updatedTaskList: List, removedTaskList: List): Flowable { + override fun updateChallenge( + challenge: Challenge, + fullTaskList: List, + addedTaskList: List, + updatedTaskList: List, + removedTaskList: List + ): Flowable { var flowable: Flowable<*> = Flowable.just("") updatedTaskList - .map { localRepository.getUnmanagedCopy(it) } - .forEach { task -> - flowable = flowable.flatMap { apiClient.updateTask(task.id ?: "", task) } - } + .map { localRepository.getUnmanagedCopy(it) } + .forEach { task -> + flowable = flowable.flatMap { apiClient.updateTask(task.id ?: "", task) } + } removedTaskList.forEach { task -> flowable = flowable.flatMap { apiClient.deleteTask(task) } @@ -106,7 +110,7 @@ class ChallengeRepositoryImpl(localRepository: ChallengeLocalRepository, apiClie challenge.tasksOrder = getTaskOrders(fullTaskList) return flowable.flatMap { apiClient.updateChallenge(challenge) } - .doOnNext { localRepository.save(challenge) } + .doOnNext { localRepository.save(challenge) } } override fun deleteChallenge(challengeId: String): Flowable { @@ -123,16 +127,16 @@ class ChallengeRepositoryImpl(localRepository: ChallengeLocalRepository, apiClie override fun retrieveChallenges(page: Int, memberOnly: Boolean): Flowable> { return apiClient.getUserChallenges(page, memberOnly) - .doOnNext { localRepository.saveChallenges(it, page == 0, memberOnly, userID) } + .doOnNext { localRepository.saveChallenges(it, page == 0, memberOnly, userID) } } override fun leaveChallenge(challenge: Challenge, keepTasks: String): Flowable { return apiClient.leaveChallenge(challenge.id ?: "", LeaveChallengeBody(keepTasks)) - .doOnNext { localRepository.setParticipating(userID, challenge.id ?: "", false) } + .doOnNext { localRepository.setParticipating(userID, challenge.id ?: "", false) } } override fun joinChallenge(challenge: Challenge): Flowable { return apiClient.joinChallenge(challenge.id ?: "") - .doOnNext { localRepository.setParticipating(userID, challenge.id ?: "", true) } + .doOnNext { localRepository.setParticipating(userID, challenge.id ?: "", true) } } } 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 5ace602b4..81440854f 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 @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.data.implementation import android.content.Context -import androidx.preference.PreferenceManager import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.data.local.ContentLocalRepository @@ -19,7 +18,7 @@ abstract class ContentRepositoryImpl(localRepository private var lastWorldStateSync = 0L override fun retrieveContent(context: Context?): Flowable { - return retrieveContent(context,false) + return retrieveContent(context, false) } override fun retrieveContent(context: Context?, forced: Boolean): Flowable { @@ -27,7 +26,7 @@ abstract class ContentRepositoryImpl(localRepository return if (forced || now - this.lastContentSync > 300000) { lastContentSync = now apiClient.content.doOnNext { - context?.let {context -> + context?.let { context -> it.special = RealmList() it.special.add(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 f908b7987..a8a515f03 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 @@ -4,7 +4,6 @@ import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.CustomizationRepository import com.habitrpg.android.habitica.data.local.CustomizationLocalRepository import com.habitrpg.android.habitica.models.inventory.Customization - import io.reactivex.rxjava3.core.Flowable class CustomizationRepositoryImpl(localRepository: CustomizationLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl(localRepository, apiClient, userID), CustomizationRepository { 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 608f74550..eb7ef1dc9 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 @@ -4,10 +4,8 @@ import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.FAQRepository import com.habitrpg.android.habitica.data.local.FAQLocalRepository import com.habitrpg.android.habitica.models.FAQArticle - import io.reactivex.rxjava3.core.Flowable - class FAQRepositoryImpl(localRepository: FAQLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl(localRepository, apiClient, userID), FAQRepository { override fun getArticle(position: Int): Flowable { return localRepository.getArticle(position) 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 ddf194163..16d7590fb 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 @@ -71,14 +71,14 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie override fun openMysteryItem(user: User?): Flowable { return apiClient.openMysteryItem() - .flatMap { localRepository.getEquipment(it.key ?: "").firstElement().toFlowable() } - .doOnNext { itemData -> - val liveEquipment = localRepository.getLiveObject(itemData) - localRepository.executeTransaction { - liveEquipment?.owned = true - } - localRepository.decrementMysteryItemCount(user) - } + .flatMap { localRepository.getEquipment(it.key ?: "").firstElement().toFlowable() } + .doOnNext { itemData -> + val liveEquipment = localRepository.getLiveObject(itemData) + localRepository.executeTransaction { + liveEquipment?.owned = true + } + localRepository.decrementMysteryItemCount(user) + } } override fun saveEquipment(equipment: Equipment) { @@ -119,12 +119,12 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie override fun sellItem(type: String, key: String): Flowable { return localRepository.getOwnedItem(userID, type, key, true) - .flatMap { item -> sellItem(item) } + .flatMap { item -> sellItem(item) } } override fun sellItem(item: OwnedItem): Flowable { return localRepository.getItem(item.itemType ?: "", item.key ?: "") - .flatMap { newItem -> sellItem(newItem, item) } + .flatMap { newItem -> sellItem(newItem, item) } } override fun getLatestMysteryItem(): Flowable { @@ -141,9 +141,9 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie liveItem?.numberOwned = (liveItem?.numberOwned ?: 0) - 1 } return apiClient.sellItem(item.type, item.key) - .map { user -> - localRepository.soldItem(userID, user) - } + .map { user -> + localRepository.soldItem(userID, user) + } } override fun equipGear(user: User?, equipment: String, asCostume: Boolean): Flowable { @@ -176,29 +176,29 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie } } return apiClient.equipItem(type, key) - .doOnNext { items -> - if (user == null) { - return@doOnNext - } - localRepository.modify(user) { liveUser -> - val newEquipped = items.gear?.equipped - val oldEquipped = liveUser.items?.gear?.equipped - val newCostume = items.gear?.costume - val oldCostume = liveUser.items?.gear?.costume - newEquipped?.let { equipped -> oldEquipped?.updateWith(equipped) } - newCostume?.let { costume -> oldCostume?.updateWith(costume) } - liveUser.items?.currentMount = items.currentMount - liveUser.items?.currentPet = items.currentPet - liveUser.balance = liveUser.balance - } + .doOnNext { items -> + if (user == null) { + return@doOnNext } + localRepository.modify(user) { liveUser -> + val newEquipped = items.gear?.equipped + val oldEquipped = liveUser.items?.gear?.equipped + val newCostume = items.gear?.costume + val oldCostume = liveUser.items?.gear?.costume + newEquipped?.let { equipped -> oldEquipped?.updateWith(equipped) } + newCostume?.let { costume -> oldCostume?.updateWith(costume) } + liveUser.items?.currentMount = items.currentMount + liveUser.items?.currentPet = items.currentPet + liveUser.balance = liveUser.balance + } + } } override fun feedPet(pet: Pet, food: Food): Flowable { return apiClient.feedPet(pet.key ?: "", food.key) - .doOnNext { feedResponse -> - localRepository.feedPet(food.key, pet.key ?: "", feedResponse.value ?: 0, userID) - } + .doOnNext { feedResponse -> + localRepository.feedPet(food.key, pet.key ?: "", feedResponse.value ?: 0, userID) + } } override fun hatchPet(egg: Egg, hatchingPotion: HatchingPotion, successFunction: () -> Unit): Flowable { @@ -207,48 +207,48 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie successFunction() } return apiClient.hatchPet(egg.key, hatchingPotion.key) - .doOnNext { - localRepository.save(it, userID) - if (!appConfigManager.enableLocalChanges()) { - successFunction() - } + .doOnNext { + localRepository.save(it, userID) + if (!appConfigManager.enableLocalChanges()) { + successFunction() } + } } override fun inviteToQuest(quest: QuestContent): Flowable { return apiClient.inviteToQuest("party", quest.key) - .doOnNext { localRepository.changeOwnedCount("quests", quest.key, userID, -1) } + .doOnNext { localRepository.changeOwnedCount("quests", quest.key, userID, -1) } } override fun buyItem(user: User?, id: String, value: Double, purchaseQuantity: Int): Flowable { return apiClient.buyItem(id, purchaseQuantity) - .doOnNext { buyResponse -> - if (user == null) { - return@doOnNext - } - val copiedUser = localRepository.getUnmanagedCopy(user) - if (buyResponse.items != null) { - copiedUser.items = buyResponse.items - } - if (buyResponse.hp != null) { - copiedUser.stats?.hp = buyResponse.hp - } - if (buyResponse.exp != null) { - copiedUser.stats?.exp = buyResponse.exp - } - if (buyResponse.mp != null) { - copiedUser.stats?.mp = buyResponse.mp - } - if (buyResponse.gp != null) { - copiedUser.stats?.gp = buyResponse.gp - } else { - copiedUser.stats?.gp = copiedUser.stats?.gp ?: 0 - (value * purchaseQuantity) - } - if (buyResponse.lvl != null) { - copiedUser.stats?.lvl = buyResponse.lvl - } - localRepository.save(copiedUser) + .doOnNext { buyResponse -> + if (user == null) { + return@doOnNext } + val copiedUser = localRepository.getUnmanagedCopy(user) + if (buyResponse.items != null) { + copiedUser.items = buyResponse.items + } + if (buyResponse.hp != null) { + copiedUser.stats?.hp = buyResponse.hp + } + if (buyResponse.exp != null) { + copiedUser.stats?.exp = buyResponse.exp + } + if (buyResponse.mp != null) { + copiedUser.stats?.mp = buyResponse.mp + } + if (buyResponse.gp != null) { + copiedUser.stats?.gp = buyResponse.gp + } else { + copiedUser.stats?.gp = copiedUser.stats?.gp ?: 0 - (value * purchaseQuantity) + } + if (buyResponse.lvl != null) { + copiedUser.stats?.lvl = buyResponse.lvl + } + localRepository.save(copiedUser) + } } override fun getAvailableLimitedItems(): Flowable> { @@ -287,6 +287,6 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie return if (!item.isValid) { Flowable.empty() } else apiClient.togglePinnedItem(item.pinType ?: "", item.path ?: "") - .flatMap { retrieveInAppRewards() } + .flatMap { retrieveInAppRewards() } } } 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 1c111fec4..cd4598f91 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 @@ -36,20 +36,20 @@ constructor(private val context: Context) : SetupCustomizationRepository { 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() - } + 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() - } + 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) { @@ -86,6 +86,5 @@ constructor(private val context: Context) : SetupCustomizationRepository { e.printStackTrace() -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 b8299ff5b..c58fabf92 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 @@ -19,21 +19,21 @@ import kotlin.collections.HashMap class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl(localRepository, apiClient, userID), SocialRepository { override fun transferGroupOwnership(groupID: String, userID: String): Flowable { return localRepository.getGroup(groupID) - .map { - val group = localRepository.getUnmanagedCopy(it) - group.leaderID = userID - group - } - .flatMap { - apiClient.updateGroup(it.id, it) - } + .map { + val group = localRepository.getUnmanagedCopy(it) + group.leaderID = userID + group + } + .flatMap { + apiClient.updateGroup(it.id, it) + } } override fun removeMemberFromGroup(groupID: String, userID: String): Flowable> { return apiClient.removeMemberFromGroup(groupID, userID) - .flatMap { - retrieveGroupMembers(groupID, true) - } + .flatMap { + retrieveGroupMembers(groupID, true) + } } override fun getChatmessage(messageID: String): Flowable { @@ -54,13 +54,13 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap override fun retrieveGroupChat(groupId: String): Single> { return apiClient.listGroupChat(groupId) - .flatMap { Flowable.fromIterable(it) } - .map { chatMessage -> - chatMessage.groupId = groupId - chatMessage - } - .toList() - .doOnSuccess { localRepository.saveChatMessages(groupId, it) } + .flatMap { Flowable.fromIterable(it) } + .map { chatMessage -> + chatMessage.groupId = groupId + chatMessage + } + .toList() + .doOnSuccess { localRepository.saveChatMessages(groupId, it) } } override fun getGroupChat(groupId: String): Flowable> { @@ -94,7 +94,7 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap val liked = chatMessage.userLikesMessage(userID) localRepository.likeMessage(chatMessage, userID, !liked) return apiClient.likeMessage(chatMessage.groupId ?: "", chatMessage.id) - .doOnError { localRepository.likeMessage(chatMessage, userID, liked) } + .doOnError { localRepository.likeMessage(chatMessage, userID, liked) } } override fun deleteMessage(chatMessage: ChatMessage): Flowable { @@ -107,15 +107,15 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap override fun postGroupChat(groupId: String, messageObject: HashMap): Flowable { return apiClient.postGroupChat(groupId, messageObject) - .map { postChatMessageResult -> - postChatMessageResult.message.groupId = groupId - postChatMessageResult - } - .doOnNext { postChatMessageResult -> - if (postChatMessageResult != null) { - localRepository.save(postChatMessageResult.message) - } + .map { postChatMessageResult -> + postChatMessageResult.message.groupId = groupId + postChatMessageResult + } + .doOnNext { postChatMessageResult -> + if (postChatMessageResult != null) { + localRepository.save(postChatMessageResult.message) } + } } override fun postGroupChat(groupId: String, message: String): Flowable { @@ -125,11 +125,13 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap } override fun retrieveGroup(id: String): Flowable { - return Flowable.zip(apiClient.getGroup(id).doOnNext { localRepository.saveGroup(it) }, retrieveGroupChat(id) + return Flowable.zip( + apiClient.getGroup(id).doOnNext { localRepository.saveGroup(it) }, + retrieveGroupChat(id) .toFlowable(), - { group, _ -> - group - } + { group, _ -> + group + } ) } @@ -145,8 +147,8 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap return Flowable.empty() } return apiClient.leaveGroup(id, if (keepChallenges) "remain-in-challenges" else "leave-challenges") - .doOnNext { localRepository.updateMembership(userID, id, false) } - .flatMapMaybe { localRepository.getGroup(id).firstElement() } + .doOnNext { localRepository.updateMembership(userID, id, false) } + .flatMapMaybe { localRepository.getGroup(id).firstElement() } } override fun joinGroup(id: String?): Flowable { @@ -154,10 +156,10 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap return Flowable.empty() } return apiClient.joinGroup(id) - .doOnNext { group -> - localRepository.updateMembership(userID, id, true) - localRepository.save(group) - } + .doOnNext { group -> + localRepository.updateMembership(userID, id, true) + localRepository.save(group) + } } override fun createGroup(name: String?, description: String?, leader: String?, type: String?, privacy: String?, leaderCreateChallenge: Boolean?): Flowable { @@ -187,15 +189,15 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap override fun retrieveGroups(type: String): Flowable> { return apiClient.listGroups(type) - .doOnNext { groups -> - if ("guilds" == type) { - val memberships = groups.map { - GroupMembership(userID, it.id) - } - localRepository.saveGroupMemberships(userID, memberships) + .doOnNext { groups -> + if ("guilds" == type) { + val memberships = groups.map { + GroupMembership(userID, it.id) } - localRepository.save(groups) + localRepository.saveGroupMemberships(userID, memberships) } + localRepository.save(groups) + } } override fun getGroups(type: String): Flowable> = localRepository.getGroups(type) @@ -236,7 +238,7 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap override fun retrieveGroupMembers(id: String, includeAllPublicFields: Boolean): Flowable> { return apiClient.getGroupMembers(id, includeAllPublicFields) - .doOnNext { members -> localRepository.saveGroupMembers(id, members) } + .doOnNext { members -> localRepository.saveGroupMembers(id, members) } } override fun inviteToGroup(id: String, inviteData: Map): Flowable = apiClient.inviteToGroup(id, inviteData) @@ -247,7 +249,7 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap } else { try { apiClient.getMember(UUID.fromString(userId).toString()) - } catch(_: IllegalArgumentException) { + } catch (_: IllegalArgumentException) { apiClient.getMemberWithUsername(userId) } } @@ -263,31 +265,31 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap override fun markPrivateMessagesRead(user: User?): Flowable { return apiClient.markPrivateMessagesRead() - .doOnNext { - if (user?.isManaged == true) { - localRepository.modify(user) { it.inbox?.newMessages = 0 } - } + .doOnNext { + if (user?.isManaged == true) { + localRepository.modify(user) { it.inbox?.newMessages = 0 } } + } } override fun getUserGroups(type: String?): Flowable> = localRepository.getUserGroups(userID, type) override fun acceptQuest(user: User?, partyId: String): Flowable { return apiClient.acceptQuest(partyId) - .doOnNext { - user?.let { - localRepository.updateRSVPNeeded(it, false) - } + .doOnNext { + user?.let { + localRepository.updateRSVPNeeded(it, false) } + } } override fun rejectQuest(user: User?, partyId: String): Flowable { return apiClient.rejectQuest(partyId) - .doOnNext { _ -> - user?.let { - localRepository.updateRSVPNeeded(it, false) - } + .doOnNext { _ -> + user?.let { + localRepository.updateRSVPNeeded(it, false) } + } } override fun leaveQuest(partyId: String): Flowable { @@ -296,24 +298,24 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap override fun cancelQuest(partyId: String): Flowable { return apiClient.cancelQuest(partyId) - .doOnNext { localRepository.removeQuest(partyId) } + .doOnNext { localRepository.removeQuest(partyId) } } override fun abortQuest(partyId: String): Flowable { return apiClient.abortQuest(partyId) - .doOnNext { localRepository.removeQuest(partyId) } + .doOnNext { localRepository.removeQuest(partyId) } } override fun rejectGroupInvite(groupId: String): Flowable { return apiClient.rejectGroupInvite(groupId) - .doOnNext { - localRepository.rejectGroupInvitation(userID, groupId) - } + .doOnNext { + localRepository.rejectGroupInvitation(userID, groupId) + } } override fun forceStartQuest(party: Group): Flowable { return apiClient.forceStartQuest(party.id, localRepository.getUnmanagedCopy(party)) - .doOnNext { localRepository.setQuestActivity(party, true) } + .doOnNext { localRepository.setQuestActivity(party, true) } } override fun getMemberAchievements(userId: String?): Flowable> { 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 cff1c71de..e70a7f83c 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 @@ -7,7 +7,6 @@ import com.habitrpg.android.habitica.models.Tag import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single - class TagRepositoryImpl(localRepository: TagLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl(localRepository, apiClient, userID), TagRepository { override fun getTags(): Flowable> { @@ -20,43 +19,43 @@ class TagRepositoryImpl(localRepository: TagLocalRepository, apiClient: ApiClien override fun createTag(tag: Tag): Flowable { return apiClient.createTag(tag) - .doOnNext { - it.userId = userID - localRepository.save(it) - } + .doOnNext { + it.userId = userID + localRepository.save(it) + } } override fun updateTag(tag: Tag): Flowable { return apiClient.updateTag(tag.id, tag) - .doOnNext { - it.userId = userID - localRepository.save(it) - } + .doOnNext { + it.userId = userID + localRepository.save(it) + } } override fun deleteTag(id: String): Flowable { return apiClient.deleteTag(id) - .doOnNext { - localRepository.deleteTag(id) - } + .doOnNext { + localRepository.deleteTag(id) + } } override fun createTags(tags: Collection): Single> { return Flowable.defer { Flowable.fromIterable(tags) } - .filter { tag -> tag.name.isNotEmpty() } - .flatMap { this.createTag(it) } - .toList() + .filter { tag -> tag.name.isNotEmpty() } + .flatMap { this.createTag(it) } + .toList() } override fun updateTags(tags: Collection): Single> { return Flowable.defer { Flowable.fromIterable(tags) } - .flatMap { this.updateTag(it) } - .toList() + .flatMap { this.updateTag(it) } + .toList() } override fun deleteTags(tagIds: Collection): Single> { return Flowable.defer { Flowable.fromIterable(tagIds) } - .flatMap { this.deleteTag(it) } - .toList() + .flatMap { this.deleteTag(it) } + .toList() } } 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 063edc59b..0c686391d 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 @@ -22,12 +22,11 @@ import io.reactivex.rxjava3.core.Single import java.text.SimpleDateFormat import java.util.* - class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiClient, userID: String, val appConfigManager: AppConfigManager, val analyticsManager: AnalyticsManager) : BaseRepositoryImpl(localRepository, apiClient, userID), TaskRepository { private var lastTaskAction: Long = 0 override fun getTasks(taskType: String, userID: String?): Flowable> = - this.localRepository.getTasks(taskType, userID ?: this.userID) + this.localRepository.getTasks(taskType, userID ?: this.userID) override fun saveTasks(userId: String, order: TasksOrder, tasks: TaskList) { localRepository.saveTasks(userId, order, tasks) @@ -35,27 +34,27 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli override fun retrieveTasks(userId: String, tasksOrder: TasksOrder): Flowable { return this.apiClient.tasks - .doOnNext { res -> this.localRepository.saveTasks(userId, tasksOrder, res) } + .doOnNext { res -> this.localRepository.saveTasks(userId, tasksOrder, res) } } override fun retrieveCompletedTodos(userId: String?): Flowable { return this.apiClient.getTasks("completedTodos") - .doOnNext { taskList -> - val tasks = taskList.tasks - this.localRepository.saveCompletedTodos(userId ?: this.userID, tasks.values) - } + .doOnNext { taskList -> + val tasks = taskList.tasks + this.localRepository.saveCompletedTodos(userId ?: this.userID, tasks.values) + } } override fun retrieveTasks(userId: String, tasksOrder: TasksOrder, dueDate: Date): Flowable { val formatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.US) return this.apiClient.getTasks("dailys", formatter.format(dueDate)) - .doOnNext { res -> this.localRepository.saveTasks(userId, tasksOrder, res) } + .doOnNext { res -> this.localRepository.saveTasks(userId, tasksOrder, res) } } @Suppress("ReturnCount") override fun taskChecked(user: User?, task: Task, up: Boolean, force: Boolean, notifyFunc: ((TaskScoringResult) -> Unit)?): Flowable { val localData = if (user != null && appConfigManager.enableLocalTaskScoring()) { - ScoreTaskLocallyInteractor.score(user, task, if (up) TaskDirection.UP else TaskDirection.DOWN) + ScoreTaskLocallyInteractor.score(user, task, if (up) TaskDirection.UP else TaskDirection.DOWN) } else null if (user != null && localData != null) { val stats = user.stats @@ -82,44 +81,47 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli lastTaskAction = now return this.apiClient.postTaskDirection(id, (if (up) TaskDirection.UP else TaskDirection.DOWN).text) - .flatMapMaybe { - // There are cases where the user object is not set correctly. So the app refetches it as a fallback - if (user == null) { - localRepository.getUser(userID).firstElement() - } else { - Maybe.just(user) - }.map { user -> Pair(it, user) } - } - .map { (res, user): Pair -> - // save local task changes + .flatMapMaybe { + // There are cases where the user object is not set correctly. So the app refetches it as a fallback + if (user == null) { + localRepository.getUser(userID).firstElement() + } else { + Maybe.just(user) + }.map { user -> Pair(it, user) } + } + .map { (res, user): Pair -> + // save local task changes - analyticsManager.logEvent("task_scored", bundleOf( - Pair("type", task.type), - Pair("scored_up", up), - Pair("value", task.value) - )) - val result = TaskScoringResult() - if (res.lvl == 0) { - // Team tasks that require approval have weird data that we should just ignore. - return@map result - } - val stats = user.stats - - result.healthDelta = res.hp - (stats?.hp ?: 0.0) - result.experienceDelta = res.exp - (stats?.exp ?: 0.0) - result.manaDelta = res.mp - (stats?.mp ?: 0.0) - result.goldDelta = res.gp - (stats?.gp ?: 0.0) - result.hasLeveledUp = res.lvl > stats?.lvl ?: 0 - result.level = res.lvl - result.questDamage = res._tmp?.quest?.progressDelta - result.questItemsFound = res._tmp?.quest?.collection - result.drop = res._tmp?.drop - if (localData == null) { - notifyFunc?.invoke(result) - } - handleTaskResponse(user, res, task, up, localData?.delta ?: 0f) - result + analyticsManager.logEvent( + "task_scored", + bundleOf( + Pair("type", task.type), + Pair("scored_up", up), + Pair("value", task.value) + ) + ) + val result = TaskScoringResult() + if (res.lvl == 0) { + // Team tasks that require approval have weird data that we should just ignore. + return@map result } + val stats = user.stats + + result.healthDelta = res.hp - (stats?.hp ?: 0.0) + result.experienceDelta = res.exp - (stats?.exp ?: 0.0) + result.manaDelta = res.mp - (stats?.mp ?: 0.0) + result.goldDelta = res.gp - (stats?.gp ?: 0.0) + result.hasLeveledUp = res.lvl > stats?.lvl ?: 0 + result.level = res.lvl + result.questDamage = res._tmp?.quest?.progressDelta + result.questItemsFound = res._tmp?.quest?.collection + result.drop = res._tmp?.drop + if (localData == null) { + notifyFunc?.invoke(result) + } + handleTaskResponse(user, res, task, up, localData?.delta ?: 0f) + result + } } override fun bulkScoreTasks(data: List>): Flowable { @@ -146,7 +148,7 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli } } res._tmp?.drop?.key?.let { key -> - val type = when(res._tmp?.drop?.type?.lowercase(Locale.US)) { + val type = when (res._tmp?.drop?.type?.lowercase(Locale.US)) { "hatchingpotion" -> "hatchingPotions" "egg" -> "eggs" else -> res._tmp?.drop?.type?.lowercase(Locale.US) @@ -173,25 +175,27 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli bgUser.stats?.mp = res.mp bgUser.stats?.gp = res.gp bgUser.stats?.lvl = res.lvl - bgUser.party?.quest?.progress?.up = (bgUser.party?.quest?.progress?.up - ?: 0F) + (res._tmp?.quest?.progressDelta?.toFloat() ?: 0F) + bgUser.party?.quest?.progress?.up = ( + bgUser.party?.quest?.progress?.up + ?: 0F + ) + (res._tmp?.quest?.progressDelta?.toFloat() ?: 0F) } } override fun taskChecked(user: User?, taskId: String, up: Boolean, force: Boolean, notifyFunc: ((TaskScoringResult) -> Unit)?): Maybe { return localRepository.getTask(taskId).firstElement() - .flatMap { task -> taskChecked(user, task, up, force, notifyFunc).singleElement() } + .flatMap { task -> taskChecked(user, task, up, force, notifyFunc).singleElement() } } override fun scoreChecklistItem(taskId: String, itemId: String): Flowable { return apiClient.scoreChecklistItem(taskId, itemId) - .flatMapMaybe { localRepository.getTask(taskId).firstElement() } - .doOnNext { task -> - val updatedItem: ChecklistItem? = task.checklist?.lastOrNull { itemId == it.id } - if (updatedItem != null) { - localRepository.modify(updatedItem) { liveItem -> liveItem.completed = !liveItem.completed } - } + .flatMapMaybe { localRepository.getTask(taskId).firstElement() } + .doOnNext { task -> + val updatedItem: ChecklistItem? = task.checklist?.lastOrNull { itemId == it.id } + if (updatedItem != null) { + localRepository.modify(updatedItem) { liveItem -> liveItem.completed = !liveItem.completed } } + } } override fun getTask(taskId: String): Flowable = localRepository.getTask(taskId) @@ -200,7 +204,7 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli override fun createTask(task: Task, force: Boolean): Flowable { val now = Date().time - if (lastTaskAction > now - 500 && !force) { + if (lastTaskAction > now - 500 && !force) { return Flowable.empty() } lastTaskAction = now @@ -215,25 +219,25 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli localRepository.saveSyncronous(task) return apiClient.createTask(task) - .map { task1 -> - task1.dateCreated = Date() - task1 - } - .doOnNext { - it.tags = task.tags - localRepository.save(it) - } - .doOnError { - task.hasErrored = true - task.isSaving = false - localRepository.saveSyncronous(task) - } + .map { task1 -> + task1.dateCreated = Date() + task1 + } + .doOnNext { + it.tags = task.tags + localRepository.save(it) + } + .doOnError { + task.hasErrored = true + task.isSaving = false + localRepository.saveSyncronous(task) + } } @Suppress("ReturnCount") override fun updateTask(task: Task, force: Boolean): Maybe { val now = Date().time - if ((lastTaskAction > now - 500 && !force)|| !task.isValid ) { + if ((lastTaskAction > now - 500 && !force) || !task.isValid) { return Maybe.just(task) } lastTaskAction = now @@ -243,25 +247,25 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli unmanagedTask.hasErrored = false localRepository.saveSyncronous(unmanagedTask) return apiClient.updateTask(id, unmanagedTask).singleElement() - .map { task1 -> - task1.position = task.position - task1.id = task.id - task1 - } - .doOnSuccess { - it.tags = task.tags - localRepository.save(it) - } - .doOnError { - unmanagedTask.hasErrored = true - unmanagedTask.isSaving = false - localRepository.saveSyncronous(unmanagedTask) - } + .map { task1 -> + task1.position = task.position + task1.id = task.id + task1 + } + .doOnSuccess { + it.tags = task.tags + localRepository.save(it) + } + .doOnError { + unmanagedTask.hasErrored = true + unmanagedTask.isSaving = false + localRepository.saveSyncronous(unmanagedTask) + } } override fun deleteTask(taskId: String): Flowable { return apiClient.deleteTask(taskId) - .doOnNext { localRepository.deleteTask(taskId) } + .doOnNext { localRepository.deleteTask(taskId) } } override fun saveTask(task: Task) { @@ -274,7 +278,7 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli localRepository.markTaskCompleted(taskId, isCompleted) } - override fun modify(obj: T, transaction: (T) -> Unit) { + override fun modify(obj: T, transaction: (T) -> Unit) { localRepository.modify(obj, transaction) } @@ -284,11 +288,11 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli override fun updateTaskPosition(taskType: String, taskID: String, newPosition: Int): Maybe> { return apiClient.postTaskNewPosition(taskID, newPosition).firstElement() - .doOnSuccess { localRepository.updateTaskPositions(it) } + .doOnSuccess { localRepository.updateTaskPositions(it) } } override fun getUnmanagedTask(taskid: String): Flowable = - getTask(taskid).map { localRepository.getUnmanagedCopy(it) } + getTask(taskid).map { localRepository.getUnmanagedCopy(it) } override fun updateTaskInBackground(task: Task) { updateTask(task).subscribe({ }, RxErrorHandler.handleEmptyError()) @@ -299,10 +303,10 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli } override fun getTaskCopies(userId: String): Flowable> = - localRepository.getTasks(userId).map { localRepository.getUnmanagedCopy(it) } + localRepository.getTasks(userId).map { localRepository.getUnmanagedCopy(it) } override fun getTaskCopies(tasks: List): Flowable> = - Flowable.just(localRepository.getUnmanagedCopy(tasks)) + Flowable.just(localRepository.getUnmanagedCopy(tasks)) override fun retrieveDailiesFromDate(date: Date): Flowable { val formatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.US) @@ -311,15 +315,15 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli override fun syncErroredTasks(): Single> { return localRepository.getErroredTasks(userID).firstElement() - .flatMapPublisher { Flowable.fromIterable(it) } - .map { localRepository.getUnmanagedCopy(it) } - .flatMap { - return@flatMap if (it.isCreating) { - createTask(it, true) - } else { - updateTask(it, true).toFlowable() - } - }.toList() + .flatMapPublisher { Flowable.fromIterable(it) } + .map { localRepository.getUnmanagedCopy(it) } + .flatMap { + return@flatMap if (it.isCreating) { + createTask(it, true) + } else { + updateTask(it, true).toFlowable() + } + }.toList() } override fun unlinkAllTasks(challengeID: String?, keepOption: String): Flowable { 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 283fc70e8..2dacfeab9 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 @@ -6,12 +6,11 @@ import com.habitrpg.android.habitica.data.local.TutorialLocalRepository import com.habitrpg.android.habitica.models.TutorialStep import io.reactivex.rxjava3.core.Flowable - class TutorialRepositoryImpl(localRepository: TutorialLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl(localRepository, apiClient, userID), TutorialRepository { override fun getTutorialStep(key: String): Flowable = - localRepository.getTutorialStep(key) + localRepository.getTutorialStep(key) override fun getTutorialSteps(keys: List): Flowable> = - localRepository.getTutorialSteps(keys) + localRepository.getTutorialSteps(keys) } 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 dea0f0430..246df5538 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 @@ -34,13 +34,14 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli override fun getUser(): Flowable = getUser(userID) - override fun getUser(userID: String): Flowable = localRepository.getUser(userID) private fun updateUser(userID: String, updateData: Map): Flowable { - return Flowable.zip(apiClient.updateUser(updateData), - localRepository.getUser(userID).firstElement().toFlowable(), - { newUser, user -> mergeUser(user, newUser) }) + return Flowable.zip( + apiClient.updateUser(updateData), + localRepository.getUser(userID).firstElement().toFlowable(), + { newUser, user -> mergeUser(user, newUser) } + ) } private fun updateUser(userID: String, key: String, value: Any): Flowable { @@ -58,7 +59,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } override fun retrieveUser(withTasks: Boolean): Flowable = - retrieveUser(withTasks, false) + retrieveUser(withTasks, false) @Suppress("ReturnCount") override fun retrieveUser(withTasks: Boolean, forced: Boolean, overrideExisting: Boolean): Flowable { @@ -66,48 +67,48 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli if (forced || this.lastSync == null || Date().time - (this.lastSync?.time ?: 0) > 180000) { lastSync = Date() return apiClient.retrieveUser(withTasks) - .doOnNext { localRepository.saveUser(it, overrideExisting) } - .doOnNext { user -> - if (withTasks) { - val id = user.id - val tasksOrder = user.tasksOrder - val tasks = user.tasks - if (id != null && tasksOrder != null && tasks != null) { - taskRepository.saveTasks(id, tasksOrder, tasks) - } + .doOnNext { localRepository.saveUser(it, overrideExisting) } + .doOnNext { user -> + if (withTasks) { + val id = user.id + val tasksOrder = user.tasksOrder + val tasks = user.tasks + if (id != null && tasksOrder != null && tasks != null) { + taskRepository.saveTasks(id, tasksOrder, tasks) } } - .flatMap { user -> - val calendar = GregorianCalendar() - val timeZone = calendar.timeZone - val offset = -TimeUnit.MINUTES.convert(timeZone.getOffset(calendar.timeInMillis).toLong(), TimeUnit.MILLISECONDS) - if (offset.toInt() != user.preferences?.timezoneOffset ?: 0) { - return@flatMap updateUser(user.id ?: "", "preferences.timezoneOffset", offset.toString()) - } else { - return@flatMap Flowable.just(user) - } + } + .flatMap { user -> + val calendar = GregorianCalendar() + val timeZone = calendar.timeZone + val offset = -TimeUnit.MINUTES.convert(timeZone.getOffset(calendar.timeInMillis).toLong(), TimeUnit.MILLISECONDS) + if (offset.toInt() != user.preferences?.timezoneOffset ?: 0) { + return@flatMap updateUser(user.id ?: "", "preferences.timezoneOffset", offset.toString()) + } else { + return@flatMap Flowable.just(user) } + } } else { return getUser().take(1) } } override fun revive(user: User): Flowable = - apiClient.revive().map { newUser -> mergeUser(user, newUser) } - .flatMap { retrieveUser(false, true) } + apiClient.revive().map { newUser -> mergeUser(user, newUser) } + .flatMap { retrieveUser(false, true) } override fun resetTutorial() { localRepository.getTutorialSteps() - .firstElement() - .map> { tutorialSteps -> - val updateData = HashMap() - for (step in tutorialSteps) { - updateData["flags.tutorial." + step.tutorialGroup + "." + step.identifier] = false - } - updateData + .firstElement() + .map> { tutorialSteps -> + val updateData = HashMap() + for (step in tutorialSteps) { + updateData["flags.tutorial." + step.tutorialGroup + "." + step.identifier] = false } - .flatMap { updateData -> updateUser(updateData).firstElement() } - .subscribe({ }, RxErrorHandler.handleEmptyError()) + updateData + } + .flatMap { updateData -> updateUser(updateData).firstElement() } + .subscribe({ }, RxErrorHandler.handleEmptyError()) } override fun sleep(user: User): Flowable { @@ -116,10 +117,10 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } override fun getSkills(user: User): Flowable> = - localRepository.getSkills(user) + localRepository.getSkills(user) override fun getSpecialItems(user: User): Flowable> = - localRepository.getSpecialItems(user) + localRepository.getSpecialItems(user) override fun useSkill(key: String, target: String?, taskId: String): Flowable { return zipWithLiveUser(apiClient.useSkill(key, target ?: "", taskId)) { response, user -> @@ -174,16 +175,20 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli return Flowable.just(null) } path = path.substring(1) - return Flowable.zip(apiClient.unlockPath(path), localRepository.getUser(userID).firstElement().toFlowable() + return Flowable.zip( + apiClient.unlockPath(path), + localRepository.getUser(userID).firstElement().toFlowable() .map { localRepository.getUnmanagedCopy(it) } - .skipNull(), { unlockResponse, copiedUser -> - copiedUser.preferences = unlockResponse.preferences - copiedUser.purchased = unlockResponse.purchased - copiedUser.items = unlockResponse.items - copiedUser.balance = copiedUser.balance - set.price / 4.0 - localRepository.saveUser(copiedUser, false) - unlockResponse - }) + .skipNull(), + { unlockResponse, copiedUser -> + copiedUser.preferences = unlockResponse.preferences + copiedUser.purchased = unlockResponse.purchased + copiedUser.items = unlockResponse.items + copiedUser.balance = copiedUser.balance - set.price / 4.0 + localRepository.saveUser(copiedUser, false) + unlockResponse + } + ) } override fun runCron() { @@ -197,14 +202,14 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli override fun reroll(): Flowable { return apiClient.reroll() - .flatMap { retrieveUser(true, true, true) } + .flatMap { retrieveUser(true, true, true) } } override fun readNotifications(notificationIds: Map>): Flowable> = - apiClient.readNotifications(notificationIds) + apiClient.readNotifications(notificationIds) override fun seeNotifications(notificationIds: Map>): Flowable> = - apiClient.seeNotifications(notificationIds) + apiClient.seeNotifications(notificationIds) override fun changeCustomDayStart(dayStartTime: Int): Flowable { val updateObject = HashMap() @@ -214,7 +219,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli override fun updateLanguage(languageCode: String): Flowable { return updateUser("preferences.language", languageCode) - .doOnNext { apiClient.setLanguageCode(languageCode) } + .doOnNext { apiClient.setLanguageCode(languageCode) } } override fun resetAccount(): Flowable { @@ -222,46 +227,51 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } override fun deleteAccount(password: String): Flowable = - apiClient.deleteAccount(password) + apiClient.deleteAccount(password) override fun sendPasswordResetEmail(email: String): Flowable = - apiClient.sendPasswordResetEmail(email) + apiClient.sendPasswordResetEmail(email) override fun updateLoginName(newLoginName: String, password: String?): Maybe { - return (if (password != null && password.isNotEmpty()) { - apiClient.updateLoginName(newLoginName.trim(), password.trim()) - } else { - apiClient.updateUsername(newLoginName.trim()) - }).flatMapMaybe { localRepository.getUser(userID).firstElement() } - .doOnNext { user -> - localRepository.modify(user) { liveUser -> - liveUser.authentication?.localAuthentication?.username = newLoginName - liveUser.flags?.verifiedUsername = true - } + return ( + if (password != null && password.isNotEmpty()) { + apiClient.updateLoginName(newLoginName.trim(), password.trim()) + } else { + apiClient.updateUsername(newLoginName.trim()) + } + ).flatMapMaybe { localRepository.getUser(userID).firstElement() } + .doOnNext { user -> + localRepository.modify(user) { liveUser -> + liveUser.authentication?.localAuthentication?.username = newLoginName + liveUser.flags?.verifiedUsername = true } - .firstElement() + } + .firstElement() } override fun verifyUsername(username: String): Flowable = apiClient.verifyUsername(username.trim()) override fun updateEmail(newEmail: String, password: String): Flowable = - apiClient.updateEmail(newEmail.trim(), password) + apiClient.updateEmail(newEmail.trim(), password) override fun updatePassword(oldPassword: String, newPassword: String, newPasswordConfirmation: String): Flowable = - apiClient.updatePassword(oldPassword.trim(), newPassword.trim(), newPasswordConfirmation.trim()) + apiClient.updatePassword(oldPassword.trim(), newPassword.trim(), newPasswordConfirmation.trim()) override fun allocatePoint(stat: String): Flowable { - getLiveUser().firstElement().subscribe( { liveUser -> - localRepository.executeTransaction { - when (stat) { - Stats.STRENGTH -> liveUser.stats?.strength = liveUser.stats?.strength?.inc() - Stats.INTELLIGENCE -> liveUser.stats?.intelligence = liveUser.stats?.intelligence?.inc() - Stats.CONSTITUTION -> liveUser.stats?.constitution= liveUser.stats?.constitution?.inc() - Stats.PERCEPTION -> liveUser.stats?.per = liveUser.stats?.per?.inc() + getLiveUser().firstElement().subscribe( + { liveUser -> + localRepository.executeTransaction { + when (stat) { + Stats.STRENGTH -> liveUser.stats?.strength = liveUser.stats?.strength?.inc() + Stats.INTELLIGENCE -> liveUser.stats?.intelligence = liveUser.stats?.intelligence?.inc() + Stats.CONSTITUTION -> liveUser.stats?.constitution = liveUser.stats?.constitution?.inc() + Stats.PERCEPTION -> liveUser.stats?.per = liveUser.stats?.per?.inc() + } + liveUser.stats?.points = liveUser.stats?.points?.dec() } - liveUser.stats?.points = liveUser.stats?.points?.dec() - } - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) return zipWithLiveUser(apiClient.allocatePoint(stat)) { stats, user -> localRepository.modify(user) { liveUser -> liveUser.stats?.strength = stats.strength @@ -276,28 +286,28 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } override fun bulkAllocatePoints(strength: Int, intelligence: Int, constitution: Int, perception: Int): Flowable = - zipWithLiveUser(apiClient.bulkAllocatePoints(strength, intelligence, constitution, perception)) { stats, user -> - localRepository.modify(user) { liveUser -> - liveUser.stats?.strength = stats.strength - liveUser.stats?.constitution = stats.constitution - liveUser.stats?.per = stats.per - liveUser.stats?.intelligence = stats.intelligence - liveUser.stats?.points = stats.points - liveUser.stats?.mp = stats.mp - } - stats + zipWithLiveUser(apiClient.bulkAllocatePoints(strength, intelligence, constitution, perception)) { stats, user -> + localRepository.modify(user) { liveUser -> + liveUser.stats?.strength = stats.strength + liveUser.stats?.constitution = stats.constitution + liveUser.stats?.per = stats.per + liveUser.stats?.intelligence = stats.intelligence + liveUser.stats?.points = stats.points + liveUser.stats?.mp = stats.mp } + stats + } override fun runCron(tasks: MutableList) { var observable: Maybe = localRepository.getUser(userID).firstElement() - .filter { it.needsCron } - .map { user -> - localRepository.modify(user) { liveUser -> - liveUser.needsCron = false - liveUser.lastCron = Date() - } - user + .filter { it.needsCron } + .map { user -> + localRepository.modify(user) { liveUser -> + liveUser.needsCron = false + liveUser.lastCron = Date() } + user + } if (tasks.isNotEmpty()) { val scoringList = mutableListOf>() for (task in tasks) { @@ -309,32 +319,35 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli observable = observable.flatMap { taskRepository.bulkScoreTasks(scoringList).firstElement() } } observable.flatMap { apiClient.runCron().firstElement() } - .flatMap { this.retrieveUser(withTasks = true, forced = true).firstElement() } - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .flatMap { this.retrieveUser(withTasks = true, forced = true).firstElement() } + .subscribe({ }, RxErrorHandler.handleEmptyError()) } override fun useCustomization(type: String, category: String?, identifier: String): Flowable { if (appConfigManager.enableLocalChanges()) { - localRepository.getUser(userID).firstElement().subscribe( { liveUser -> - localRepository.modify(liveUser) { liveUser -> - when (type) { - "skin" -> liveUser.preferences?.skin = identifier - "shirt" -> liveUser.preferences?.shirt = identifier - "hair" -> { - when (category) { - "color" -> liveUser.preferences?.hair?.color = identifier - "flower" -> liveUser.preferences?.hair?.flower = identifier.toInt() - "mustache" -> liveUser.preferences?.hair?.mustache = identifier.toInt() - "beard" -> liveUser.preferences?.hair?.beard = identifier.toInt() - "bangs" -> liveUser.preferences?.hair?.bangs = identifier.toInt() - "base" -> liveUser.preferences?.hair?.base = identifier.toInt() + localRepository.getUser(userID).firstElement().subscribe( + { liveUser -> + localRepository.modify(liveUser) { liveUser -> + when (type) { + "skin" -> liveUser.preferences?.skin = identifier + "shirt" -> liveUser.preferences?.shirt = identifier + "hair" -> { + when (category) { + "color" -> liveUser.preferences?.hair?.color = identifier + "flower" -> liveUser.preferences?.hair?.flower = identifier.toInt() + "mustache" -> liveUser.preferences?.hair?.mustache = identifier.toInt() + "beard" -> liveUser.preferences?.hair?.beard = identifier.toInt() + "bangs" -> liveUser.preferences?.hair?.bangs = identifier.toInt() + "base" -> liveUser.preferences?.hair?.base = identifier.toInt() + } } + "background" -> liveUser.preferences?.background = identifier + "chair" -> liveUser.preferences?.chair = identifier } - "background" -> liveUser.preferences?.background = identifier - "chair" -> liveUser.preferences?.chair = identifier } - } - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } var updatePath = "preferences.$type" if (category != null) { @@ -369,20 +382,22 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } override fun retrieveTeamPlan(teamID: String): Flowable { - return Flowable.zip(apiClient.getGroup(teamID), apiClient.getTeamPlanTasks(teamID), - { team, tasks -> - team.tasks = tasks - team - }) - .doOnNext { localRepository.save(it) } - .doOnNext { team -> - val id = team.id - val tasksOrder = team.tasksOrder - val tasks = team.tasks - if (id.isNotBlank() && tasksOrder != null && tasks != null) { - taskRepository.saveTasks(id, tasksOrder, tasks) - } + return Flowable.zip( + apiClient.getGroup(teamID), apiClient.getTeamPlanTasks(teamID), + { team, tasks -> + team.tasks = tasks + team + } + ) + .doOnNext { localRepository.save(it) } + .doOnNext { team -> + val id = team.id + val tasksOrder = team.tasksOrder + val tasks = team.tasks + if (id.isNotBlank() && tasksOrder != null && tasks != null) { + taskRepository.saveTasks(id, tasksOrder, tasks) } + } } override fun getTeamPlan(teamID: String): Flowable { @@ -391,8 +406,8 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli private fun getLiveUser(): Flowable { return localRepository.getUser(userID) - .map { localRepository.getLiveObject(it) } - .skipNull() + .map { localRepository.getLiveObject(it) } + .skipNull() } private fun zipWithLiveUser(flowable: Flowable, mergeFunc: BiFunction): Flowable { 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 ed1b4dbb3..1a1440056 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 @@ -2,9 +2,7 @@ package com.habitrpg.android.habitica.data.local import com.habitrpg.android.habitica.models.BaseMainObject import com.habitrpg.android.habitica.models.BaseObject -import com.habitrpg.android.habitica.models.user.OwnedObject import io.realm.Realm -import io.realm.RealmModel interface BaseLocalRepository { @@ -17,14 +15,14 @@ interface BaseLocalRepository { fun executeTransaction(transaction: Realm.Transaction) fun executeTransactionAsync(transaction: (Realm) -> Unit) fun executeTransactionAsync(transaction: Realm.Transaction) - fun modify(obj: T, transaction: (T) -> Unit) - fun modifyWithRealm(obj: T, transaction: (Realm, T) -> Unit) - fun getLiveObject(obj: T): T? + fun modify(obj: T, transaction: (T) -> Unit) + fun modifyWithRealm(obj: T, transaction: (Realm, T) -> Unit) + fun getLiveObject(obj: T): T? - fun getUnmanagedCopy(managedObject: T): T - fun getUnmanagedCopy(list: List): List + fun getUnmanagedCopy(managedObject: T): T + fun getUnmanagedCopy(list: List): List - fun save(objects: List) - fun save(`object`: T) - fun saveSyncronous(`object`: T) + fun save(objects: List) + fun save(`object`: T) + fun saveSyncronous(`object`: 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 271dc6ec6..8952ef761 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 @@ -1,10 +1,8 @@ package com.habitrpg.android.habitica.data.local - import com.habitrpg.android.habitica.models.social.Challenge import com.habitrpg.android.habitica.models.social.ChallengeMembership import com.habitrpg.android.habitica.models.tasks.Task - import io.reactivex.rxjava3.core.Flowable interface ChallengeLocalRepository : BaseLocalRepository { @@ -21,5 +19,4 @@ interface ChallengeLocalRepository : BaseLocalRepository { fun getChallengeMembership(userId: String, id: String): Flowable fun getChallengeMemberships(userId: String): Flowable> fun isChallengeMember(userID: String, challengeID: String): Flowable - } 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 511d3518a..2b21bae96 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 @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.data.local import com.habitrpg.android.habitica.models.inventory.Customization - import io.reactivex.rxjava3.core.Flowable interface CustomizationLocalRepository : ContentLocalRepository { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/FAQLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/FAQLocalRepository.kt index 28404a0ad..43bb04245 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/FAQLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/FAQLocalRepository.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.data.local import com.habitrpg.android.habitica.models.FAQArticle - import io.reactivex.rxjava3.core.Flowable interface FAQLocalRepository : ContentLocalRepository { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TagLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TagLocalRepository.kt index 6876b7db7..fff81f926 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TagLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TagLocalRepository.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.data.local import com.habitrpg.android.habitica.models.Tag - import io.reactivex.rxjava3.core.Flowable interface TagLocalRepository : BaseLocalRepository { 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 c44039f42..0a7b7ee8e 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.data.local -import com.habitrpg.android.habitica.models.tasks.RemindersItem import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.tasks.TaskList import com.habitrpg.android.habitica.models.tasks.TasksOrder 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 b8dc3bd0a..de38ed084 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 @@ -1,13 +1,11 @@ package com.habitrpg.android.habitica.data.local.implementation -import android.renderscript.BaseObj import com.habitrpg.android.habitica.data.local.BaseLocalRepository import com.habitrpg.android.habitica.models.BaseMainObject import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.user.User import hu.akarnokd.rxjava3.bridge.RxJavaBridge import io.reactivex.rxjava3.core.Flowable - import io.realm.Realm import io.realm.RealmObject @@ -72,15 +70,15 @@ abstract class RealmBaseLocalRepository internal constructor(override var realm: realm.executeTransaction { realm1 -> realm1.insertOrUpdate(`object`) } } - override fun modify(obj: T, transaction: (T) -> Unit) { + override fun modify(obj: T, transaction: (T) -> Unit) { if (isClosed) { return } - val liveObject = getLiveObject(obj) ?: return + val liveObject = getLiveObject(obj) ?: return realm.executeTransaction { transaction(liveObject) } } - override fun modifyWithRealm(obj: T, transaction: (Realm, T) -> Unit) { + override fun modifyWithRealm(obj: T, transaction: (Realm, T) -> Unit) { if (isClosed) { return } val liveObject = getLiveObject(obj) ?: return realm.executeTransaction { @@ -88,19 +86,20 @@ abstract class RealmBaseLocalRepository internal constructor(override var realm: } } - override fun getLiveObject(obj: T): T? { + 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 return realm.where(baseObject.realmClass).equalTo(baseObject.primaryIdentifierName, baseObject.primaryIdentifier).findFirst() as? T } - fun queryUser(userID: String): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(User::class.java) - .equalTo("id", userID) - .findAll() - .asFlowable()) + return RxJavaBridge.toV3Flowable( + realm.where(User::class.java) + .equalTo("id", userID) + .findAll() + .asFlowable() + ) .filter { it.isLoaded && it.isValid && !it.isEmpty() } .map { it.first() } } 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 797b520de..06a60cd75 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 @@ -13,73 +13,87 @@ import java.util.* class RealmChallengeLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), ChallengeLocalRepository { - override fun isChallengeMember(userID: String, challengeID: String): Flowable = RxJavaBridge.toV3Flowable(realm.where(ChallengeMembership::class.java) + override fun isChallengeMember(userID: String, challengeID: String): Flowable = RxJavaBridge.toV3Flowable( + realm.where(ChallengeMembership::class.java) .equalTo("userID", userID) .equalTo("challengeID", challengeID) .findAll() .asFlowable() - .filter { it.isLoaded }).map { it.count() > 0 } + .filter { it.isLoaded } + ).map { it.count() > 0 } - override fun getChallengeMembership(userId: String, id: String): Flowable = RxJavaBridge.toV3Flowable(realm.where(ChallengeMembership::class.java) + override fun getChallengeMembership(userId: String, id: String): Flowable = RxJavaBridge.toV3Flowable( + realm.where(ChallengeMembership::class.java) .equalTo("userID", userId) .equalTo("challengeID", id) .findAll() .asFlowable() - .filter { it.isLoaded }).map { it.first() } + .filter { it.isLoaded } + ).map { it.first() } - override fun getChallengeMemberships(userId: String): Flowable> = RxJavaBridge.toV3Flowable(realm.where(ChallengeMembership::class.java) + override fun getChallengeMemberships(userId: String): Flowable> = RxJavaBridge.toV3Flowable( + realm.where(ChallengeMembership::class.java) .equalTo("userID", userId) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) override fun getChallenge(id: String): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(Challenge::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Challenge::class.java) .equalTo("id", id) .findAll() .asFlowable() .filter { realmObject -> realmObject.isLoaded && realmObject.isNotEmpty() } - .map { it.first() }) + .map { it.first() } + ) } override fun getTasks(challengeID: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Task::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Task::class.java) .equalTo("userId", challengeID) .findAll() .asFlowable() - .filter { realmObject -> realmObject.isLoaded }) + .filter { realmObject -> realmObject.isLoaded } + ) } override val challenges: Flowable> - get() = RxJavaBridge.toV3Flowable(realm.where(Challenge::class.java) + get() = RxJavaBridge.toV3Flowable( + realm.where(Challenge::class.java) .isNotNull("name") .sort("official", Sort.DESCENDING, "createdAt", Sort.DESCENDING) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) override fun getUserChallenges(userId: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(ChallengeMembership::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(ChallengeMembership::class.java) .equalTo("userID", userId) .findAll() .asFlowable() - .filter { it.isLoaded }) -.flatMap { it -> - val ids = it.map { - return@map it.challengeID - }.toTypedArray() - realm.where(Challenge::class.java) - .isNotNull("name") - .beginGroup() - .`in`("id", ids) - .or() - .equalTo("leaderId", userId) - .endGroup() - .sort("official", Sort.DESCENDING, "createdAt", Sort.DESCENDING) - .findAll() - .asFlowable() - .filter { it.isLoaded } -} + .filter { it.isLoaded } + ) + .flatMap { it -> + val ids = it.map { + return@map it.challengeID + }.toTypedArray() + realm.where(Challenge::class.java) + .isNotNull("name") + .beginGroup() + .`in`("id", ids) + .or() + .equalTo("leaderId", userId) + .endGroup() + .sort("official", Sort.DESCENDING, "createdAt", Sort.DESCENDING) + .findAll() + .asFlowable() + .filter { it.isLoaded } + } } override fun setParticipating(userID: String, challengeID: String, isParticipating: Boolean) { @@ -100,9 +114,10 @@ class RealmChallengeLocalRepository(realm: Realm) : RealmBaseLocalRepository(rea val memberships = realm.where(ChallengeMembership::class.java).findAll() val challengesToDelete = ArrayList() for (localTask in localChallenges) { - if (!challenges.contains(localTask) - && memberships.find { it.challengeID == localTask.id } == null - && localTask.leaderId != userID) { + if (!challenges.contains(localTask) && + memberships.find { it.challengeID == localTask.id } == null && + localTask.leaderId != userID + ) { challengesToDelete.add(localTask) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmContentLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmContentLocalRepository.kt index 5c89ffe95..da558dc96 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmContentLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmContentLocalRepository.kt @@ -8,10 +8,8 @@ import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.social.Group import hu.akarnokd.rxjava3.bridge.RxJavaBridge import io.reactivex.rxjava3.core.Flowable - import io.realm.Realm - open class RealmContentLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), ContentLocalRepository { override fun saveContent(contentResult: ContentResult) { @@ -37,18 +35,22 @@ open class RealmContentLocalRepository(realm: Realm) : RealmBaseLocalRepository( } override fun getWorldState(): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(WorldState::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(WorldState::class.java) .findAll() .asFlowable() .filter { it.isLoaded && it.size > 0 } - .map { it.first() }) - .skipNull() + .map { it.first() } + ) + .skipNull() } override fun saveWorldState(worldState: WorldState) { - val tavern = getUnmanagedCopy(realm.where(Group::class.java) + val tavern = getUnmanagedCopy( + realm.where(Group::class.java) .equalTo("id", Group.TAVERN_ID) - .findFirst() ?: Group()) + .findFirst() ?: Group() + ) if (!tavern.isManaged) { tavern.id = Group.TAVERN_ID } 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 f7c621cb3..6f603db28 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 @@ -7,33 +7,34 @@ import io.reactivex.rxjava3.core.Flowable import io.realm.Realm import java.util.* - class RealmCustomizationLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), CustomizationLocalRepository { override fun getCustomizations(type: String, category: String?, onlyAvailable: Boolean): Flowable> { var query = realm.where(Customization::class.java) - .equalTo("type", type) - .equalTo("category", category) + .equalTo("type", type) + .equalTo("category", category) if (onlyAvailable) { val today = Date() query = query - .beginGroup() - .beginGroup() - .lessThanOrEqualTo("availableFrom", today) - .greaterThanOrEqualTo("availableUntil", today) - .endGroup() - .or() - .beginGroup() - .isNull("availableFrom") - .isNull("availableUntil") - .endGroup() - .endGroup() + .beginGroup() + .beginGroup() + .lessThanOrEqualTo("availableFrom", today) + .greaterThanOrEqualTo("availableUntil", today) + .endGroup() + .or() + .beginGroup() + .isNull("availableFrom") + .isNull("availableUntil") + .endGroup() + .endGroup() } - return RxJavaBridge.toV3Flowable(query + return RxJavaBridge.toV3Flowable( + query .sort("customizationSetName") .findAll() .asFlowable() .filter { it.isLoaded } - .map { it }) + .map { it } + ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmFAQLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmFAQLocalRepository.kt index eb42bb9b1..5a704138f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmFAQLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmFAQLocalRepository.kt @@ -8,17 +8,21 @@ import io.realm.Realm class RealmFAQLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), FAQLocalRepository { override fun getArticle(position: Int): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(FAQArticle::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(FAQArticle::class.java) .equalTo("position", position) .findAll() .asFlowable() - .filter{ it.isLoaded && it.count() > 0 } - .map { it.first() }) + .filter { it.isLoaded && it.count() > 0 } + .map { it.first() } + ) } override val articles: Flowable> - get() = RxJavaBridge.toV3Flowable(realm.where(FAQArticle::class.java) + get() = RxJavaBridge.toV3Flowable( + realm.where(FAQArticle::class.java) .findAll() .asFlowable() - .filter{ it.isLoaded }) + .filter { it.isLoaded } + ) } 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 59da36133..9375752f6 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 @@ -2,14 +2,12 @@ package com.habitrpg.android.habitica.data.local.implementation import com.habitrpg.android.habitica.data.local.InventoryLocalRepository import com.habitrpg.android.habitica.helpers.RxErrorHandler -import com.habitrpg.android.habitica.models.BaseMainObject import com.habitrpg.android.habitica.models.inventory.* import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.user.* import hu.akarnokd.rxjava3.bridge.RxJavaBridge import io.reactivex.rxjava3.core.Flowable import io.realm.Realm -import io.realm.RealmList import io.realm.RealmObject import io.realm.Sort import io.realm.kotlin.isManaged @@ -17,67 +15,78 @@ import java.text.SimpleDateFormat import java.util.* import kotlin.collections.HashMap - class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), InventoryLocalRepository { override fun getQuestContent(keys: List): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(QuestContent::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(QuestContent::class.java) .`in`("key", keys.toTypedArray()) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getQuestContent(key: String): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(QuestContent::class.java).equalTo("key", key) + return RxJavaBridge.toV3Flowable( + realm.where(QuestContent::class.java).equalTo("key", key) .findAll() .asFlowable() .filter { content -> content.isLoaded && content.isValid && !content.isEmpty() } - .map { content -> content.first() }) + .map { content -> content.first() } + ) } override fun getEquipment(searchedKeys: List): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Equipment::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Equipment::class.java) .`in`("key", searchedKeys.toTypedArray()) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getArmoireRemainingCount(): Long { return realm.where(Equipment::class.java) - .equalTo("klass", "armoire") - .beginGroup() - .equalTo("owned", false) - .or() - .isNull("owned") - .endGroup() - .count() + .equalTo("klass", "armoire") + .beginGroup() + .equalTo("owned", false) + .or() + .isNull("owned") + .endGroup() + .count() } override fun getOwnedEquipment(type: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Equipment::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Equipment::class.java) .equalTo("type", type) .equalTo("owned", true) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getOwnedEquipment(): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Equipment::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Equipment::class.java) .equalTo("owned", true) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getEquipmentType(type: String, set: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Equipment::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Equipment::class.java) .equalTo("type", type) .equalTo("gearSet", set) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getOwnedItems(itemType: String, userID: String, includeZero: Boolean): Flowable> { @@ -99,13 +108,17 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( } override fun getItems(itemClass: Class, keys: Array): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(itemClass).`in`("key", keys).findAll().asFlowable() - .filter { it.isLoaded }) + return RxJavaBridge.toV3Flowable( + realm.where(itemClass).`in`("key", keys).findAll().asFlowable() + .filter { it.isLoaded } + ) } override fun getItems(itemClass: Class): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(itemClass).findAll().asFlowable() - .filter { it.isLoaded }) + return RxJavaBridge.toV3Flowable( + realm.where(itemClass).findAll().asFlowable() + .filter { it.isLoaded } + ) } override fun getOwnedItems(userID: String, includeZero: Boolean): Flowable> { @@ -124,25 +137,29 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( } override fun getEquipment(key: String): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(Equipment::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Equipment::class.java) .equalTo("key", key) .findFirstAsync() .asFlowable() .filter { realmObject -> realmObject.isLoaded } - .cast(Equipment::class.java)) + .cast(Equipment::class.java) + ) } override fun getMounts(): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Mount::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Mount::class.java) .sort("type", Sort.ASCENDING, "animal", Sort.ASCENDING) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getMounts(type: String?, group: String?, color: String?): Flowable> { var query = realm.where(Mount::class.java) - .sort("type", Sort.ASCENDING, if (color == null) "color" else "animal", Sort.ASCENDING) + .sort("type", Sort.ASCENDING, if (color == null) "color" else "animal", Sort.ASCENDING) if (type != null) { query = query.equalTo("animal", type) } @@ -152,30 +169,35 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( if (color != null) { query = query.equalTo("color", color) } - return RxJavaBridge.toV3Flowable(query.findAll() + return RxJavaBridge.toV3Flowable( + query.findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getOwnedMounts(userID: String): Flowable> { return queryUser(userID) - .map { it.items?.mounts?.filter { - it.owned == true - } ?: emptyList() } + .map { + it.items?.mounts?.filter { + it.owned == true + } ?: emptyList() + } } - override fun getPets(): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Pet::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Pet::class.java) .sort("type", Sort.ASCENDING, "animal", Sort.ASCENDING) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getPets(type: String?, group: String?, color: String?): Flowable> { var query = realm.where(Pet::class.java) - .sort("type", Sort.ASCENDING, if (color == null) "color" else "animal", Sort.ASCENDING) + .sort("type", Sort.ASCENDING, if (color == null) "color" else "animal", Sort.ASCENDING) if (type != null) { query = query.equalTo("animal", type) } @@ -185,28 +207,33 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( if (color != null) { query = query.equalTo("color", color) } - return RxJavaBridge.toV3Flowable(query.findAll() + return RxJavaBridge.toV3Flowable( + query.findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getOwnedPets(userID: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(User::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(User::class.java) .equalTo("id", userID) .findAll() - .asFlowable()) + .asFlowable() + ) .filter { it.isLoaded && it.isValid && !it.isEmpty() } - .map { it.first()?.items?.pets?.filter { - it.trained > 0 - } ?: emptyList() } + .map { + it.first()?.items?.pets?.filter { + it.trained > 0 + } ?: emptyList() + } } override fun updateOwnedEquipment(user: User) { - } override fun changeOwnedCount(type: String, key: String, userID: String, amountToAdd: Int) { - getOwnedItem(userID, type, key, true).firstElement().subscribe({ changeOwnedCount(it, amountToAdd)}, RxErrorHandler.handleEmptyError()) + getOwnedItem(userID, type, key, true).firstElement().subscribe({ changeOwnedCount(it, amountToAdd) }, RxErrorHandler.handleEmptyError()) } override fun changeOwnedCount(item: OwnedItem, amountToAdd: Int?) { @@ -218,13 +245,15 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( override fun getOwnedItem(userID: String, type: String, key: String, includeZero: Boolean): Flowable { return queryUser(userID).map { - var items = (when (type) { - "eggs" -> it.items?.eggs - "hatchingPotions" -> it.items?.hatchingPotions - "food" -> it.items?.food - "quests" -> it.items?.quests - else -> emptyList() - } ?: emptyList()) + var items = ( + when (type) { + "eggs" -> it.items?.eggs + "hatchingPotions" -> it.items?.hatchingPotions + "food" -> it.items?.food + "quests" -> it.items?.quests + else -> emptyList() + } ?: emptyList() + ) items = items.filter { it.key == key } if (includeZero) { items @@ -245,9 +274,11 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( "special" -> SpecialItem::class.java else -> Egg::class.java } - return RxJavaBridge.toV3Flowable(realm.where(itemClass).equalTo("key", key).findFirstAsync().asFlowable() + return RxJavaBridge.toV3Flowable( + realm.where(itemClass).equalTo("key", key).findFirstAsync().asFlowable() .filter { realmObject -> realmObject.isLoaded } - .cast(Item::class.java)) + .cast(Item::class.java) + ) } override fun decrementMysteryItemCount(user: User?) { @@ -268,10 +299,12 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( } override fun getInAppRewards(): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(ShopItem::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(ShopItem::class.java) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun saveInAppRewards(onlineItems: List) { @@ -344,24 +377,26 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( } override fun getLatestMysteryItem(): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(Equipment::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Equipment::class.java) .contains("key", "mystery_2") .sort("mystery", Sort.DESCENDING) .findAll() .asFlowable() - .filter { it.isLoaded && it.size > 0} + .filter { it.isLoaded && it.size > 0 } .map { val format = SimpleDateFormat("yyyyMM", Locale.US) it.first { it.key?.contains(format.format(Date())) == true } - }) + } + ) } override fun soldItem(userID: String, updatedUser: User): User { val user = realm.where(User::class.java) - .equalTo("id", userID) - .findFirst() ?: return updatedUser + .equalTo("id", userID) + .findFirst() ?: return updatedUser executeTransaction { val items = updatedUser.items if (items != null) { @@ -377,30 +412,30 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( override fun getAvailableLimitedItems(): Flowable> { return Flowable.combineLatest( - realm.where(Egg::class.java) - .lessThan("event.start", Date()) - .greaterThan("event.end", Date()) - .findAll().asFlowable(), - realm.where(Food::class.java) - .lessThan("event.start", Date()) - .greaterThan("event.end", Date()) - .findAll().asFlowable(), - realm.where(HatchingPotion::class.java) - .lessThan("event.start", Date()) - .greaterThan("event.end", Date()) - .findAll().asFlowable(), - realm.where(QuestContent::class.java) - .lessThan("event.start", Date()) - .greaterThan("event.end", Date()) - .findAll().asFlowable(), - { eggs, food, potions, quests -> - val items = mutableListOf() - items.addAll(eggs) - items.addAll(food) - items.addAll(potions) - items.addAll(quests) - items - } + realm.where(Egg::class.java) + .lessThan("event.start", Date()) + .greaterThan("event.end", Date()) + .findAll().asFlowable(), + realm.where(Food::class.java) + .lessThan("event.start", Date()) + .greaterThan("event.end", Date()) + .findAll().asFlowable(), + realm.where(HatchingPotion::class.java) + .lessThan("event.start", Date()) + .greaterThan("event.end", Date()) + .findAll().asFlowable(), + realm.where(QuestContent::class.java) + .lessThan("event.start", Date()) + .greaterThan("event.end", Date()) + .findAll().asFlowable(), + { eggs, food, potions, quests -> + val items = mutableListOf() + items.addAll(eggs) + items.addAll(food) + items.addAll(potions) + items.addAll(quests) + 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 417a729cb..67640095d 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 @@ -4,7 +4,6 @@ import com.habitrpg.android.habitica.data.local.SocialLocalRepository import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.social.* -import com.habitrpg.android.habitica.models.user.ContributorInfo import com.habitrpg.android.habitica.models.user.User import hu.akarnokd.rxjava3.bridge.RxJavaBridge import io.reactivex.rxjava3.core.Flowable @@ -12,28 +11,33 @@ import io.realm.Realm import io.realm.Sort import java.util.* - class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), SocialLocalRepository { - override fun getChatMessage(messageID: String): Flowable = RxJavaBridge.toV3Flowable(realm.where(ChatMessage::class.java) + override fun getChatMessage(messageID: String): Flowable = RxJavaBridge.toV3Flowable( + realm.where(ChatMessage::class.java) .equalTo("id", messageID) .findAll() .asFlowable() .filter { it.isLoaded && it.isNotEmpty() } - .map { it.first() }) + .map { it.first() } + ) - override fun getGroupMembership(userId: String, id: String): Flowable = RxJavaBridge.toV3Flowable(realm.where(GroupMembership::class.java) + override fun getGroupMembership(userId: String, id: String): Flowable = RxJavaBridge.toV3Flowable( + realm.where(GroupMembership::class.java) .equalTo("userID", userId) .equalTo("groupID", id) .findAll() .asFlowable() .filter { it.isLoaded && it.isNotEmpty() } - .map { it.first() }) + .map { it.first() } + ) - override fun getGroupMemberships(userId: String): Flowable> = RxJavaBridge.toV3Flowable(realm.where(GroupMembership::class.java) + override fun getGroupMemberships(userId: String): Flowable> = RxJavaBridge.toV3Flowable( + realm.where(GroupMembership::class.java) .equalTo("userID", userId) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) override fun updateMembership(userId: String, id: String, isMember: Boolean) { if (isMember) { @@ -108,60 +112,73 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) } } - override fun getPublicGuilds(): Flowable> = RxJavaBridge.toV3Flowable(realm.where(Group::class.java) + override fun getPublicGuilds(): Flowable> = RxJavaBridge.toV3Flowable( + realm.where(Group::class.java) .equalTo("type", "guild") .equalTo("privacy", "public") .notEqualTo("id", Group.TAVERN_ID) .sort("memberCount", Sort.DESCENDING) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) - override fun getUserGroups(userID: String, type: String?): Flowable> = RxJavaBridge.toV3Flowable(realm.where(GroupMembership::class.java) + override fun getUserGroups(userID: String, type: String?): Flowable> = RxJavaBridge.toV3Flowable( + realm.where(GroupMembership::class.java) .equalTo("userID", userID) .findAll() .asFlowable() - .filter { it.isLoaded }) -.flatMap {memberships -> - RxJavaBridge.toV3Flowable(realm.where(Group::class.java) - .equalTo("type", type ?: "guild") - .notEqualTo("id", Group.TAVERN_ID) - .`in`("id", memberships.map { + .filter { it.isLoaded } + ) + .flatMap { memberships -> + RxJavaBridge.toV3Flowable( + realm.where(Group::class.java) + .equalTo("type", type ?: "guild") + .notEqualTo("id", Group.TAVERN_ID) + .`in`( + "id", + memberships.map { return@map it.groupID - }.toTypedArray()) - .sort("memberCount", Sort.DESCENDING) - .findAll() - .asFlowable() - .filter { it.isLoaded }) - } - - + }.toTypedArray() + ) + .sort("memberCount", Sort.DESCENDING) + .findAll() + .asFlowable() + .filter { it.isLoaded } + ) + } override fun getGroups(type: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Group::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Group::class.java) .equalTo("type", type) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getGroup(id: String): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(Group::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Group::class.java) .equalTo("id", id) .findAll() .asFlowable() .filter { group -> group.isLoaded && group.isValid && !group.isEmpty() } - .map { groups -> groups.first() }) + .map { groups -> groups.first() } + ) } override fun getGroupChat(groupId: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(ChatMessage::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(ChatMessage::class.java) .equalTo("groupId", groupId) .sort("timestamp", Sort.DESCENDING) .findAll() .asFlowable() - .filter { it.isLoaded }) -} + .filter { it.isLoaded } + ) + } override fun deleteMessage(id: String) { val chatMessage = realm.where(ChatMessage::class.java).equalTo("id", id).findFirst() @@ -169,12 +186,14 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) } override fun getGroupMembers(partyId: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Member::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Member::class.java) .equalTo("party.id", partyId) .findAll() .asFlowable() - .filter { it.isLoaded }) -} + .filter { it.isLoaded } + ) + } override fun updateRSVPNeeded(user: User?, newValue: Boolean) { executeTransaction { user?.party?.quest?.RSVPNeeded = newValue } @@ -192,9 +211,11 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) } } else { liveMessage?.likes?.filter { userId == it.id }?.forEach { like -> - executeTransaction(Realm.Transaction { - like.deleteFromRealm() - }) + executeTransaction( + Realm.Transaction { + like.deleteFromRealm() + } + ) } executeTransaction { liveMessage?.likeCount = liveMessage?.likes?.size ?: 0 @@ -266,22 +287,26 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) } override fun getInboxMessages(userId: String, replyToUserID: String?): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(ChatMessage::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(ChatMessage::class.java) .equalTo("isInboxMessage", true) .equalTo("uuid", replyToUserID) .equalTo("userID", userId) .sort("timestamp", Sort.DESCENDING) .findAll() .asFlowable() - .filter { it.isLoaded }) -} + .filter { it.isLoaded } + ) + } override fun getInboxConversation(userId: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(InboxConversation::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(InboxConversation::class.java) .equalTo("userID", userId) .sort("timestamp", Sort.DESCENDING) .findAll() .asFlowable() - .filter { it.isLoaded }) -} + .filter { it.isLoaded } + ) + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.kt index e0dc1654e..28e0e317d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.kt @@ -6,7 +6,6 @@ import hu.akarnokd.rxjava3.bridge.RxJavaBridge import io.reactivex.rxjava3.core.Flowable import io.realm.Realm - class RealmTagLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), TagLocalRepository { override fun deleteTag(tagID: String) { val tag = realm.where(Tag::class.java).equalTo("id", tagID).findFirst() 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 12956e7be..01a658ef7 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 @@ -16,25 +16,29 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), if (realm.isClosed) { return Flowable.empty() } - return RxJavaBridge.toV3Flowable(realm.where(Task::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Task::class.java) .equalTo("type", taskType) .equalTo("userId", userID) .sort("position", Sort.ASCENDING, "dateCreated", Sort.DESCENDING) .findAll() .asFlowable() - .filter { it.isLoaded }).retry(1) + .filter { it.isLoaded } + ).retry(1) } override fun getTasks(userId: String): Flowable> { if (realm.isClosed) { return Flowable.empty() } - return RxJavaBridge.toV3Flowable(realm.where(Task::class.java).equalTo("userId", userId) + return RxJavaBridge.toV3Flowable( + realm.where(Task::class.java).equalTo("userId", userId) .sort("position", Sort.ASCENDING, "dateCreated", Sort.DESCENDING) .findAll() .asFlowable() - .filter { it.isLoaded }) -} + .filter { it.isLoaded } + ) + } override fun saveTasks(ownerID: String, tasksOrder: TasksOrder, tasks: TaskList) { val sortedTasks = ArrayList() @@ -105,17 +109,17 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), private fun removeOldTasks(userID: String, onlineTaskList: List) { if (realm.isClosed) return val localTasks = realm.where(Task::class.java) - .equalTo("userId", userID) - .beginGroup() - .beginGroup() - .equalTo("type", Task.TYPE_TODO) - .equalTo("completed", false) - .endGroup() - .or() - .notEqualTo("type", Task.TYPE_TODO) - .endGroup() - .findAll() - .createSnapshot() + .equalTo("userId", userID) + .beginGroup() + .beginGroup() + .equalTo("type", Task.TYPE_TODO) + .equalTo("completed", false) + .endGroup() + .or() + .notEqualTo("type", Task.TYPE_TODO) + .endGroup() + .findAll() + .createSnapshot() val tasksToDelete = localTasks.filterNot { onlineTaskList.contains(it) } executeTransaction { for (localTask in tasksToDelete) { @@ -126,11 +130,11 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), private fun removeCompletedTodos(userID: String, onlineTaskList: MutableCollection) { val localTasks = realm.where(Task::class.java) - .equalTo("userId", userID) - .equalTo("type", Task.TYPE_TODO) - .equalTo("completed", true) - .findAll() - .createSnapshot() + .equalTo("userId", userID) + .equalTo("type", Task.TYPE_TODO) + .equalTo("completed", true) + .findAll() + .createSnapshot() val tasksToDelete = localTasks.filterNot { onlineTaskList.contains(it) } executeTransaction { for (localTask in tasksToDelete) { @@ -152,20 +156,22 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), if (realm.isClosed) { return Flowable.empty() } - return RxJavaBridge.toV3Flowable(realm.where(Task::class.java).equalTo("id", taskId).findFirstAsync().asFlowable() + return RxJavaBridge.toV3Flowable( + realm.where(Task::class.java).equalTo("id", taskId).findFirstAsync().asFlowable() .filter { realmObject -> realmObject.isLoaded } - .cast(Task::class.java)) + .cast(Task::class.java) + ) } override fun getTaskCopy(taskId: String): Flowable { return getTask(taskId) - .map { task -> - return@map if (task.isManaged && task.isValid) { - realm.copyFromRealm(task) - } else { - task - } + .map { task -> + return@map if (task.isManaged && task.isValid) { + realm.copyFromRealm(task) + } else { + task } + } } override fun markTaskCompleted(taskId: String, isCompleted: Boolean) { @@ -185,20 +191,22 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } override fun getTaskAtPosition(taskType: String, position: Int): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(Task::class.java).equalTo("type", taskType).equalTo("position", position).findFirstAsync().asFlowable() + return RxJavaBridge.toV3Flowable( + realm.where(Task::class.java).equalTo("type", taskType).equalTo("position", position).findFirstAsync().asFlowable() .filter { realmObject -> realmObject.isLoaded } - .cast(Task::class.java)) + .cast(Task::class.java) + ) } override fun updateIsdue(daily: TaskList): Maybe { return Flowable.just(realm.where(Task::class.java).equalTo("type", "daily").findAll()) - .firstElement() - .map { tasks -> - realm.beginTransaction() - tasks.filter { daily.tasks.containsKey(it.id) }.forEach { it.isDue = daily.tasks[it.id]?.isDue } - realm.commitTransaction() - daily - } + .firstElement() + .map { tasks -> + realm.beginTransaction() + tasks.filter { daily.tasks.containsKey(it.id) }.forEach { it.isDue = daily.tasks[it.id]?.isDue } + realm.commitTransaction() + daily + } } override fun updateTaskPositions(taskOrder: List) { @@ -211,31 +219,37 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } override fun getErroredTasks(userID: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Task::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Task::class.java) .equalTo("userId", userID) .equalTo("hasErrored", true) .sort("position") .findAll() .asFlowable() - .filter { it.isLoaded }).retry(1) + .filter { it.isLoaded } + ).retry(1) } override fun getUser(userID: String): Flowable { - return RxJavaBridge.toV3Flowable(realm.where(User::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(User::class.java) .equalTo("id", userID) .findAll() .asFlowable() .filter { realmObject -> realmObject.isLoaded && realmObject.isValid && !realmObject.isEmpty() } - .map { users -> users.first() }) + .map { users -> users.first() } + ) } override fun getTasksForChallenge(challengeID: String?, userID: String?): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Task::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Task::class.java) .equalTo("challengeID", challengeID) .equalTo("userId", userID) .findAll() .asFlowable() - .filter { it.isLoaded }) -.retry(1) + .filter { it.isLoaded } + ) + .retry(1) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTutorialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTutorialLocalRepository.kt index 77df61fd6..8ddadb7c8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTutorialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTutorialLocalRepository.kt @@ -6,12 +6,12 @@ import hu.akarnokd.rxjava3.bridge.RxJavaBridge import io.reactivex.rxjava3.core.Flowable import io.realm.Realm - class RealmTutorialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), TutorialLocalRepository { override fun getTutorialStep(key: String): Flowable { if (realm.isClosed) return Flowable.empty() - return RxJavaBridge.toV3Flowable(realm.where(TutorialStep::class.java).equalTo("identifier", key) + return RxJavaBridge.toV3Flowable( + realm.where(TutorialStep::class.java).equalTo("identifier", key) .findAll() .asFlowable() .filter { realmObject -> realmObject.isLoaded && realmObject.isValid && realmObject.isNotEmpty() } @@ -26,15 +26,18 @@ class RealmTutorialLocalRepository(realm: Realm) : RealmBaseLocalRepository(real steps } } - .map { steps -> steps.first() }) + .map { steps -> steps.first() } + ) } override fun getTutorialSteps(keys: List): Flowable> { if (realm.isClosed) return Flowable.empty() - return RxJavaBridge.toV3Flowable(realm.where(TutorialStep::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(TutorialStep::class.java) .`in`("identifier", keys.toTypedArray()) .findAll() .asFlowable() - .filter { it.isLoaded }) -} + .filter { it.isLoaded } + ) + } } 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 205bb7f0f..b7cc3a587 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 @@ -3,11 +3,8 @@ package com.habitrpg.android.habitica.data.local.implementation import com.habitrpg.android.habitica.data.local.UserLocalRepository import com.habitrpg.android.habitica.data.local.UserQuestStatus import com.habitrpg.android.habitica.models.* -import com.habitrpg.android.habitica.models.social.ChallengeMembership import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.social.Group -import com.habitrpg.android.habitica.models.user.OwnedMount -import com.habitrpg.android.habitica.models.user.OwnedPet import com.habitrpg.android.habitica.models.user.User import hu.akarnokd.rxjava3.bridge.RxJavaBridge import io.reactivex.rxjava3.core.Flowable @@ -16,59 +13,71 @@ import io.realm.Realm class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), UserLocalRepository { override fun getUserQuestStatus(userID: String): Flowable { return getUser(userID) - .map { it.party?.id ?: "" } - .filter { it.isNotBlank() } - .flatMap { - RxJavaBridge.toV3Flowable(realm.where(Group::class.java) - .equalTo("id", it) - .findAll() - .asFlowable() - .filter { groups -> groups.size > 0 } - .map { groups -> groups.first() }) - } - .map { when { + .map { it.party?.id ?: "" } + .filter { it.isNotBlank() } + .flatMap { + RxJavaBridge.toV3Flowable( + realm.where(Group::class.java) + .equalTo("id", it) + .findAll() + .asFlowable() + .filter { groups -> groups.size > 0 } + .map { groups -> groups.first() } + ) + } + .map { + when { it?.quest?.members?.find { questMember -> questMember.key == userID } === null -> UserQuestStatus.NO_QUEST it.quest?.progress?.collect?.isNotEmpty() ?: false -> UserQuestStatus.QUEST_COLLECT it.quest?.progress?.hp ?: 0.0 > 0.0 -> UserQuestStatus.QUEST_BOSS else -> UserQuestStatus.QUEST_UNKNOWN - }} + } + } } override fun getAchievements(): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(Achievement::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Achievement::class.java) .sort("index") .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getQuestAchievements(userID: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(User::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(User::class.java) .equalTo("id", userID) .findAll() .asFlowable() .filter { it.isLoaded } - .map { it.first()?.questAchievements ?: emptyList() }) -} + .map { it.first()?.questAchievements ?: emptyList() } + ) + } - override fun getTutorialSteps(): Flowable> = RxJavaBridge.toV3Flowable(realm.where(TutorialStep::class.java).findAll().asFlowable() - .filter { it.isLoaded }.map { it }) + override fun getTutorialSteps(): Flowable> = RxJavaBridge.toV3Flowable( + realm.where(TutorialStep::class.java).findAll().asFlowable() + .filter { it.isLoaded }.map { it } + ) override fun getUser(userID: String): Flowable { if (realm.isClosed) return Flowable.empty() - return RxJavaBridge.toV3Flowable(realm.where(User::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(User::class.java) .equalTo("id", userID) .findAll() .asFlowable() .filter { realmObject -> realmObject.isLoaded && realmObject.isValid && !realmObject.isEmpty() } - .map { users -> users.first() }) + .map { users -> users.first() } + ) } override fun saveUser(user: User, overrideExisting: Boolean) { if (realm.isClosed) return val oldUser = realm.where(User::class.java) - .equalTo("id", user.id) - .findFirst() + .equalTo("id", user.id) + .findFirst() if (oldUser != null && oldUser.isValid) { if (user.needsCron && !oldUser.needsCron) { if (user.lastCron?.before(oldUser.lastCron) == true) { @@ -81,7 +90,6 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } } executeTransaction { realm1 -> realm1.insertOrUpdate(user) } - } override fun saveMessages(messages: List) { @@ -91,32 +99,38 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } override fun getTeamPlans(userID: String): Flowable> { - return RxJavaBridge.toV3Flowable(realm.where(TeamPlan::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(TeamPlan::class.java) .equalTo("userID", userID) .findAll() .asFlowable() - .filter { it.isLoaded }) + .filter { it.isLoaded } + ) } override fun getTeamPlan(teamID: String): Flowable { if (realm.isClosed) return Flowable.empty() - return RxJavaBridge.toV3Flowable(realm.where(Group::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Group::class.java) .equalTo("id", teamID) .findAll() .asFlowable() .filter { realmObject -> realmObject.isLoaded && realmObject.isValid && !realmObject.isEmpty() } - .map { teams -> teams.first() }) + .map { teams -> teams.first() } + ) } override fun getSkills(user: User): Flowable> { val habitClass = if (user.preferences?.disableClasses == true) "none" else user.stats?.habitClass - return RxJavaBridge.toV3Flowable(realm.where(Skill::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Skill::class.java) .equalTo("habitClass", habitClass) .sort("lvl") .findAll() .asFlowable() - .filter { it.isLoaded }) -} + .filter { it.isLoaded } + ) + } override fun getSpecialItems(user: User): Flowable> { val specialItems = user.items?.special @@ -138,10 +152,12 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), if (ownedItems.size == 0) { ownedItems.add("") } - return RxJavaBridge.toV3Flowable(realm.where(Skill::class.java) + return RxJavaBridge.toV3Flowable( + realm.where(Skill::class.java) .`in`("key", ownedItems.toTypedArray()) .findAll() .asFlowable() - .filter { it.isLoaded }) -} + .filter { it.isLoaded } + ) + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/BoughtGemsEvent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/events/BoughtGemsEvent.kt index a0575c151..4b73530fc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/events/BoughtGemsEvent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/BoughtGemsEvent.kt @@ -3,4 +3,4 @@ package com.habitrpg.android.habitica.events /** * Created by Negue on 29.11.2015. */ -class BoughtGemsEvent(var NewGemsToAdd: Int) \ No newline at end of file +class BoughtGemsEvent(var NewGemsToAdd: Int) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/GearPurchasedEvent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/events/GearPurchasedEvent.kt index 32b4ef53c..36dd4fab0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/events/GearPurchasedEvent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/GearPurchasedEvent.kt @@ -2,4 +2,4 @@ package com.habitrpg.android.habitica.events import com.habitrpg.android.habitica.models.shops.ShopItem -class GearPurchasedEvent(val item: ShopItem) \ No newline at end of file +class GearPurchasedEvent(val item: ShopItem) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShareEvent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShareEvent.kt index 5d72c3ac0..6375ecfda 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShareEvent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShareEvent.kt @@ -6,4 +6,4 @@ class ShareEvent { var identifier: String? = null var sharedMessage: String? = null var shareImage: Bitmap? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShowSnackbarEvent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShowSnackbarEvent.kt index 5e3938e54..6f9a15ab7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShowSnackbarEvent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShowSnackbarEvent.kt @@ -23,4 +23,4 @@ class ShowSnackbarEvent { var rightIcon: Drawable? = null var rightTextColor = 0 var rightText: String? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/UserSubscribedEvent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/events/UserSubscribedEvent.kt index b4593dad0..dea67f00e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/events/UserSubscribedEvent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/UserSubscribedEvent.kt @@ -1,3 +1,3 @@ package com.habitrpg.android.habitica.events -class UserSubscribedEvent \ No newline at end of file +class UserSubscribedEvent diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/FeedCommand.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/FeedCommand.kt index 1846d05f6..c210418f4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/FeedCommand.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/FeedCommand.kt @@ -3,5 +3,4 @@ package com.habitrpg.android.habitica.events.commands import com.habitrpg.android.habitica.models.inventory.Food import com.habitrpg.android.habitica.models.inventory.Pet -class FeedCommand(val usingPet: Pet?, val usingFood: Food?) { -} \ No newline at end of file +class FeedCommand(val usingPet: Pet?, val usingFood: Food?) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AlertDialog-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AlertDialog-Extensions.kt index 68e6d9570..8e8b80413 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AlertDialog-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AlertDialog-Extensions.kt @@ -5,13 +5,13 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog fun HabiticaAlertDialog.addOkButton(isPrimary: Boolean = true, listener: ((HabiticaAlertDialog, Int) -> Unit)? = null) { - this.addButton(R.string.ok, isPrimary, false,true, listener) + this.addButton(R.string.ok, isPrimary, false, true, listener) } fun HabiticaAlertDialog.addCloseButton(isPrimary: Boolean = false, listener: ((DialogInterface, Int) -> Unit)? = null) { - this.addButton(R.string.close, isPrimary, false,true, listener) + this.addButton(R.string.close, isPrimary, false, true, listener) } fun HabiticaAlertDialog.addCancelButton(isPrimary: Boolean = false, listener: ((DialogInterface, Int) -> Unit)? = null) { - this.addButton(R.string.cancel, isPrimary, false,true, listener) -} \ No newline at end of file + this.addButton(R.string.cancel, isPrimary, false, true, listener) +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Animal-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Animal-Extensions.kt index ae44e22f9..8523a2e88 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Animal-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Animal-Extensions.kt @@ -10,13 +10,13 @@ fun Animal.getTranslatedType(c: Context?): String? { } return when (type) { - "drop" -> c.getString(R.string.standard) - "quest" -> c.getString(R.string.quest) - "wacky" -> c.getString(R.string.wacky) + "drop" -> c.getString(R.string.standard) + "quest" -> c.getString(R.string.quest) + "wacky" -> c.getString(R.string.wacky) "special" -> c.getString(R.string.special) "premium" -> c.getString(R.string.magic_potion) else -> { type } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AttributeSet-Extentions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AttributeSet-Extentions.kt index 43d18d231..2a93b16c6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AttributeSet-Extentions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/AttributeSet-Extentions.kt @@ -5,4 +5,4 @@ import android.content.res.TypedArray import android.util.AttributeSet fun AttributeSet.styledAttributes(context: Context?, style: IntArray): TypedArray? = - context?.theme?.obtainStyledAttributes(this, style, 0, 0) \ No newline at end of file + context?.theme?.obtainStyledAttributes(this, style, 0, 0) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Base-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Base-Extensions.kt index 317115778..afab812d6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Base-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Base-Extensions.kt @@ -9,5 +9,5 @@ import java.util.concurrent.TimeUnit fun runDelayed(interval: Long, timeUnit: TimeUnit, function: () -> Unit) { Completable.complete().delay(interval, timeUnit) - .subscribe(function) -} \ No newline at end of file + .subscribe(function) +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Bitmap-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Bitmap-Extensions.kt index 54087f50a..b2548d96d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Bitmap-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Bitmap-Extensions.kt @@ -5,7 +5,6 @@ import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable - fun Bitmap.asDrawable(resources: Resources): Drawable { return BitmapDrawable(resources, this) -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Context-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Context-Extensions.kt index b2447bf13..f5b8e23bd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Context-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Context-Extensions.kt @@ -10,7 +10,6 @@ import java.util.* val Context.layoutInflater: LayoutInflater get() = this.getSystemService(Service.LAYOUT_INFLATER_SERVICE) as LayoutInflater - fun Context.getThemeColor(colorRes: Int): Int { val value = TypedValue() theme.resolveAttribute(colorRes, value, true) @@ -18,8 +17,10 @@ fun Context.getThemeColor(colorRes: Int): Int { } fun Context.isUsingNightModeResources(): Boolean { - return when (resources.configuration.uiMode and - Configuration.UI_MODE_NIGHT_MASK) { + return when ( + resources.configuration.uiMode and + Configuration.UI_MODE_NIGHT_MASK + ) { Configuration.UI_MODE_NIGHT_YES -> true Configuration.UI_MODE_NIGHT_NO -> false Configuration.UI_MODE_NIGHT_UNDEFINED -> false @@ -31,4 +32,4 @@ fun Context.forceLocale(locale: Locale): Context { val config = Configuration(resources.configuration) config.setLocale(locale) return createConfigurationContext(config) -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt index 77364788a..4ed6055f3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt @@ -114,4 +114,4 @@ fun Long.getShortRemainingString(): String { str = "$str ${diffSeconds}s" } return str -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Double-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Double-Extensions.kt index de38f4c52..1c7124143 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Double-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Double-Extensions.kt @@ -5,4 +5,4 @@ import kotlin.math.roundToInt fun Double.round(decimals: Int): Double { return (this * 10.0.pow(decimals.toDouble())).roundToInt() / 10.0.pow(decimals.toDouble()) -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Drawable-Extendsions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Drawable-Extendsions.kt index a4acf1bc3..cafd33a7f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Drawable-Extendsions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Drawable-Extendsions.kt @@ -6,14 +6,12 @@ import android.graphics.drawable.Drawable import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat - public fun Drawable.setTintWith(context: Context, colorResource: Int, tintMode: PorterDuff.Mode = PorterDuff.Mode.MULTIPLY) { DrawableCompat.setTintMode(this, tintMode) DrawableCompat.setTint(this, ContextCompat.getColor(context, colorResource)) - } public fun Drawable.setTintWith(color: Int, tintMode: PorterDuff.Mode = PorterDuff.Mode.MULTIPLY) { DrawableCompat.setTint(this, color) DrawableCompat.setTintMode(this, tintMode) -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt index 4c4ba113b..36c62d032 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt @@ -12,4 +12,4 @@ fun Flowable.subscribeWithErrorHandler(function: Consumer): Disposable fun Flowable.skipNull(): Flowable { @Suppress("UNCHECKED_CAST") return skipWhile { it == null } as? Flowable ?: Flowable.empty() -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Int-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Int-Extensions.kt index 3a5f34113..9d634053d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Int-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Int-Extensions.kt @@ -5,5 +5,4 @@ import android.content.Context fun Int.dpToPx(context: Context?): Int { val displayMetrics = context?.resources?.displayMetrics return ((this * (displayMetrics?.density ?: 1.0f)) + 0.5).toInt() - -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/JsonObject-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/JsonObject-Extensions.kt index 8c336fdcc..b2735ad59 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/JsonObject-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/JsonObject-Extensions.kt @@ -2,10 +2,9 @@ package com.habitrpg.android.habitica.extensions import com.google.gson.JsonObject - fun JsonObject?.getAsString(key: String): String { if (this?.get(key)?.isJsonPrimitive == true) { return this.get(key)?.asString ?: "" } return "" -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Optional.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Optional.kt index 23358edb5..433cbe1cd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Optional.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Optional.kt @@ -3,4 +3,4 @@ package com.habitrpg.android.habitica.extensions data class Optional(val value: T?) { val isEmpty = value == null } -fun T?.asOptional() = Optional(this) \ No newline at end of file +fun T?.asOptional() = Optional(this) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/RxJava-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/RxJava-Extensions.kt index b9faab911..b22d619db 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/RxJava-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/RxJava-Extensions.kt @@ -5,47 +5,46 @@ import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single - fun > Flowable.filterOptionalDoOnEmpty(function: () -> Unit): Flowable { return this.doOnNext { if (it.isEmpty) function() } - .filter { !it.isEmpty } - .map { it.value } + .filter { !it.isEmpty } + .map { it.value } } fun > Flowable.filterMapEmpty(): Flowable { return this.filter { !it.isEmpty } - .map { it.value } + .map { it.value } } fun > Observable.filterOptionalDoOnEmpty(function: () -> Unit): Observable { return this.doOnNext { if (it.isEmpty) function() } - .filter { !it.isEmpty } - .map { it.value } + .filter { !it.isEmpty } + .map { it.value } } fun > Observable.filterMapEmpty(): Observable { return this.filter { !it.isEmpty } - .map { it.value } + .map { it.value } } fun > Single.filterOptionalDoOnEmpty(function: () -> Unit): Maybe { return this.doOnSuccess { if (it.isEmpty) function() } - .filter { !it.isEmpty } - .map { it.value } + .filter { !it.isEmpty } + .map { it.value } } fun > Single.filterMapEmpty(): Maybe { return this.filter { !it.isEmpty } - .map { it.value } + .map { it.value } } fun > Maybe.filterOptionalDoOnEmpty(function: () -> Unit): Maybe { return this.doOnSuccess { if (it.isEmpty) function() } - .filter { !it.isEmpty } - .map { it.value } + .filter { !it.isEmpty } + .map { it.value } } fun > Maybe.filterMapEmpty(): Maybe { return this.filter { !it.isEmpty } - .map { it.value } -} \ No newline at end of file + .map { it.value } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextView-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextView-Extensions.kt index 284dec98d..c99a2fef2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextView-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextView-Extensions.kt @@ -9,11 +9,11 @@ import android.view.View import android.widget.TextView fun TextView.handleUrlClicks(onClicked: ((String) -> Unit)? = null) { - //create span builder and replaces current text with it + // create span builder and replaces current text with it text = SpannableStringBuilder.valueOf(text).apply { - //search for all URL spans and replace all spans with our own clickable spans + // search for all URL spans and replace all spans with our own clickable spans getSpans(0, length, URLSpan::class.java).forEach { - //add new clickable span at the same position + // add new clickable span at the same position setSpan( object : ClickableSpan() { override fun onClick(widget: View) { @@ -24,10 +24,10 @@ fun TextView.handleUrlClicks(onClicked: ((String) -> Unit)? = null) { getSpanEnd(it), Spanned.SPAN_INCLUSIVE_EXCLUSIVE ) - //remove old URLSpan + // remove old URLSpan removeSpan(it) } } - //make sure movement method is set + // make sure movement method is set movementMethod = LinkMovementMethod.getInstance() -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextWatcher-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextWatcher-Extensions.kt index 6396d5820..79d43c1fd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextWatcher-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/TextWatcher-Extensions.kt @@ -31,4 +31,4 @@ class AfterChangeTextWatcher(private var function: (Editable?) -> Unit) : TextWa override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { /* no-on */ } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { /* no-on */ } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewExt.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewExt.kt index 1135ee139..b714f550b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewExt.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewExt.kt @@ -4,12 +4,10 @@ import android.content.Context import android.view.View import android.view.ViewTreeObserver - fun View.setScaledPadding(context: Context?, left: Int, top: Int, right: Int, bottom: Int) { this.setPadding(left.dpToPx(context), top.dpToPx(context), right.dpToPx(context), bottom.dpToPx(context)) } - inline fun View.waitForLayout(crossinline f: View.() -> Unit) = with(viewTreeObserver) { addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { @@ -19,7 +17,7 @@ inline fun View.waitForLayout(crossinline f: View.() -> Unit) = with(viewTreeObs }) } -inline fun View.afterMeasured(crossinline f: View.() -> Unit) { +inline fun View.afterMeasured(crossinline f: View.() -> Unit) { viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { if (measuredWidth > 0 && measuredHeight > 0) { @@ -28,4 +26,4 @@ inline fun View.afterMeasured(crossinline f: View.() -> Unit) { } } }) -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewGroup-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewGroup-Extensions.kt index 9994b8906..e55e4aa66 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewGroup-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewGroup-Extensions.kt @@ -5,4 +5,4 @@ import android.view.View import android.view.ViewGroup fun ViewGroup.inflate(layoutId: Int, attachToRoot: Boolean = false): View = - context.layoutInflater.inflate(layoutId, this, attachToRoot) \ No newline at end of file + context.layoutInflater.inflate(layoutId, this, attachToRoot) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AmplitudeManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AmplitudeManager.kt index 157db8368..f67e61dd9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AmplitudeManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AmplitudeManager.kt @@ -41,4 +41,4 @@ object AmplitudeManager { additionalData["page"] = page sendEvent("navigated", EVENT_CATEGORY_NAVIGATION, EVENT_HITTYPE_PAGEVIEW, additionalData) } -} \ No newline at end of file +} 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 20c905a65..6012eb270 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 @@ -18,9 +18,12 @@ class AppConfigManager(contentRepository: ContentRepository?) { private var worldState: WorldState? = null init { - contentRepository?.getWorldState()?.subscribe( { - worldState = it - }, RxErrorHandler.handleEmptyError()) + contentRepository?.getWorldState()?.subscribe( + { + worldState = it + }, + RxErrorHandler.handleEmptyError() + ) } private val remoteConfig = FirebaseRemoteConfig.getInstance() 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 64268000f..32fd3d2cc 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 @@ -11,7 +11,7 @@ class AprilFoolsHandler { if (endDate != null) { this.eventEnd = endDate } - when(name) { + when (name) { "invert" -> invertFools() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/DeviceName.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/DeviceName.kt index ee634fb33..0de40c450 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/DeviceName.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/DeviceName.kt @@ -171,16 +171,25 @@ object DeviceName { if (codename != null && codename == "HWBND-H" || model != null && (model == "BND-L21" || model == "BND-L24" || model == "BND-L31")) { return "Honor 7X" } - if (codename != null && codename == "HWBKL" || model != null && (model == "BKL-L04" || model == - "BKL-L09")) { + if (codename != null && codename == "HWBKL" || model != null && ( + model == "BKL-L04" || model == + "BKL-L09" + ) + ) { return "Honor View 10" } - if (codename != null && codename == "HWALP" || model != null && (model == "ALP-AL00" || model == - "ALP-L09" || model == "ALP-L29" || model == "ALP-TL00")) { + if (codename != null && codename == "HWALP" || model != null && ( + model == "ALP-AL00" || model == + "ALP-L09" || model == "ALP-L29" || model == "ALP-TL00" + ) + ) { return "Mate 10" } - if (codename != null && codename == "HWMHA" || model != null && (model == "MHA-AL00" || model == - "MHA-L09" || model == "MHA-L29" || model == "MHA-TL00")) { + if (codename != null && codename == "HWMHA" || model != null && ( + model == "MHA-AL00" || model == + "MHA-L09" || model == "MHA-L29" || model == "MHA-TL00" + ) + ) { return "Mate 9" } if (codename != null && codename == "angler") { @@ -188,11 +197,14 @@ object DeviceName { } // ---------------------------------------------------------------------------- // LGE - if (codename != null && codename == "h1" || model != null && (model == "LG-F700K" || model == - "LG-F700L" || model == "LG-F700S" || model == "LG-H820" || model == "LG-H820PR" || model == - "LG-H830" || model == "LG-H831" || model == "LG-H850" || model == "LG-H858" || model == - "LG-H860" || model == "LG-H868" || model == "LGAS992" || model == "LGLS992" || model == - "LGUS992" || model == "RS988" || model == "VS987")) { + if (codename != null && codename == "h1" || model != null && ( + model == "LG-F700K" || model == + "LG-F700L" || model == "LG-F700S" || model == "LG-H820" || model == "LG-H820PR" || model == + "LG-H830" || model == "LG-H831" || model == "LG-H850" || model == "LG-H858" || model == + "LG-H860" || model == "LG-H868" || model == "LGAS992" || model == "LGLS992" || model == + "LGUS992" || model == "RS988" || model == "VS987" + ) + ) { return "LG G5" } if (codename != null && codename == "lucye" || model != null && (model == "LG-AS993" || model == "LG-H870" || model == "LG-H870AR" || model == "LG-H870DS" || model == "LG-H870I" || model == "LG-H870S" || model == "LG-H871" || model == "LG-H871S" || model == "LG-H872" || model == "LG-H872PR" || model == "LG-H873" || model == "LG-LS993" || model == "LGM-G600K" || model == "LGM-G600L" || model == "LGM-G600S" || model == "LGUS997" || model == "VS988")) { @@ -212,8 +224,11 @@ object DeviceName { } // ---------------------------------------------------------------------------- // Motorola - if (codename != null && codename == "griffin" || model != null && (model == "XT1650" || model == - "XT1650-05")) { + if (codename != null && codename == "griffin" || model != null && ( + model == "XT1650" || model == + "XT1650-05" + ) + ) { return "Moto Z" } if (codename != null && codename == "shamu") { @@ -232,15 +247,21 @@ object DeviceName { if (codename != null && codename == "OnePlus6" || model != null && model == "ONEPLUS A6003") { return "OnePlus 6" } - if (codename != null && (codename == "OnePlus6T" || codename == "OnePlus6TSingle") || (model != null - && model == "ONEPLUS A6013")) { + if (codename != null && (codename == "OnePlus6T" || codename == "OnePlus6TSingle") || ( + model != null && + model == "ONEPLUS A6013" + ) + ) { return "OnePlus 6T" } if (codename != null && codename == "OnePlus7" || model != null && model == "GM1905") { return "OnePlus 7" } - if (codename != null && (codename == "OnePlus7Pro" || codename == "OnePlus7ProTMO") || (model != null - && (model == "GM1915" || model == "GM1917"))) { + if (codename != null && (codename == "OnePlus7Pro" || codename == "OnePlus7ProTMO") || ( + model != null && + (model == "GM1915" || model == "GM1917") + ) + ) { return "OnePlus 7 Pro" } // ---------------------------------------------------------------------------- @@ -266,8 +287,11 @@ object DeviceName { if (codename != null && (codename == "SC-04L" || codename == "SCV42" || codename == "beyond2" || codename == "beyond2q") || model != null && (model == "SC-04L" || model == "SCV42" || model == "SM-G9750" || model == "SM-G9758" || model == "SM-G975F" || model == "SM-G975N" || model == "SM-G975U" || model == "SM-G975U1" || model == "SM-G975W")) { return "Galaxy S10+" } - if (codename != null && (codename == "beyond0" || codename == "beyond0q") || (model != null - && (model == "SM-G9700" || model == "SM-G9708" || model == "SM-G970F" || model == "SM-G970N" || model == "SM-G970U" || model == "SM-G970U1" || model == "SM-G970W"))) { + if (codename != null && (codename == "beyond0" || codename == "beyond0q") || ( + model != null && + (model == "SM-G9700" || model == "SM-G9708" || model == "SM-G970F" || model == "SM-G970N" || model == "SM-G970U" || model == "SM-G970U1" || model == "SM-G970W") + ) + ) { return "Galaxy S10e" } if (codename != null && (codename == "SC-04F" || codename == "SCL23" || codename == "k3g" || codename == "klte" || codename == "klteMetroPCS" || codename == "klteacg" || codename == "klteaio" || codename == "klteatt" || codename == "kltecan" || codename == "klteduoszn" || codename == "kltektt" || codename == "kltelgt" || codename == "kltelra" || codename == "klteskt" || codename == "kltespr" || codename == "kltetfnvzw" || codename == "kltetmo" || codename == "klteusc" || codename == "kltevzw" || codename == "kwifi" || codename == "lentisltektt" || codename == "lentisltelgt" || codename == "lentislteskt") || model != null && (model == "SAMSUNG-SM-G900A" || model == "SAMSUNG-SM-G900AZ" || model == "SC-04F" || model == "SCL23" || model == "SM-G9006W" || model == "SM-G9008W" || model == "SM-G9009W" || model == "SM-G900F" || model == "SM-G900FQ" || model == "SM-G900H" || model == "SM-G900I" || model == "SM-G900K" || model == "SM-G900L" || model == "SM-G900M" || model == "SM-G900MD" || model == "SM-G900P" || model == "SM-G900R4" || model == "SM-G900R6" || model == "SM-G900R7" || model == "SM-G900S" || model == "SM-G900T" || model == "SM-G900T1" || model == "SM-G900T3" || model == "SM-G900T4" || model == "SM-G900V" || model == "SM-G900W8" || model == "SM-G900X" || model == "SM-G906K" || model == "SM-G906L" || model == "SM-G906S" || model == "SM-S903VL")) { @@ -285,13 +309,16 @@ object DeviceName { if (codename != null && (codename == "zenlte" || codename == "zenlteatt" || codename == "zenltebmc" || codename == "zenltechn" || codename == "zenltektt" || codename == "zenltekx" || codename == "zenltelgt" || codename == "zenlteskt" || codename == "zenltespr" || codename == "zenltetmo" || codename == "zenlteusc" || codename == "zenltevzw") || model != null && (model == "SAMSUNG-SM-G928A" || model == "SM-G9280" || model == "SM-G9287C" || model == "SM-G928C" || model == "SM-G928G" || model == "SM-G928I" || model == "SM-G928K" || model == "SM-G928L" || model == "SM-G928N0" || model == "SM-G928P" || model == "SM-G928R4" || model == "SM-G928S" || model == "SM-G928T" || model == "SM-G928V" || model == "SM-G928W8" || model == "SM-G928X")) { return "Galaxy S6 Edge+" } - if (codename != null && (codename == "herolte" || codename == "heroltebmc" || codename == - "heroltektt" || codename == "heroltelgt" || codename == "herolteskt" || codename == - "heroqlteacg" || codename == "heroqlteaio" || codename == "heroqlteatt" || codename == - "heroqltecctvzw" || codename == "heroqltechn" || codename == "heroqltelra" || codename == - "heroqltemtr" || codename == "heroqltespr" || codename == "heroqltetfnvzw" || codename == - "heroqltetmo" || codename == "heroqlteue" || codename == "heroqlteusc" || codename == - "heroqltevzw") || model != null && (model == "SAMSUNG-SM-G930A" || model == "SAMSUNG-SM-G930AZ" || model == "SM-G9300" || model == "SM-G9308" || model == "SM-G930F" || model == "SM-G930K" || model == "SM-G930L" || model == "SM-G930P" || model == "SM-G930R4" || model == "SM-G930R6" || model == "SM-G930R7" || model == "SM-G930S" || model == "SM-G930T" || model == "SM-G930T1" || model == "SM-G930U" || model == "SM-G930V" || model == "SM-G930VC" || model == "SM-G930VL" || model == "SM-G930W8" || model == "SM-G930X")) { + if (codename != null && ( + codename == "herolte" || codename == "heroltebmc" || codename == + "heroltektt" || codename == "heroltelgt" || codename == "herolteskt" || codename == + "heroqlteacg" || codename == "heroqlteaio" || codename == "heroqlteatt" || codename == + "heroqltecctvzw" || codename == "heroqltechn" || codename == "heroqltelra" || codename == + "heroqltemtr" || codename == "heroqltespr" || codename == "heroqltetfnvzw" || codename == + "heroqltetmo" || codename == "heroqlteue" || codename == "heroqlteusc" || codename == + "heroqltevzw" + ) || model != null && (model == "SAMSUNG-SM-G930A" || model == "SAMSUNG-SM-G930AZ" || model == "SM-G9300" || model == "SM-G9308" || model == "SM-G930F" || model == "SM-G930K" || model == "SM-G930L" || model == "SM-G930P" || model == "SM-G930R4" || model == "SM-G930R6" || model == "SM-G930R7" || model == "SM-G930S" || model == "SM-G930T" || model == "SM-G930T1" || model == "SM-G930U" || model == "SM-G930V" || model == "SM-G930VC" || model == "SM-G930VL" || model == "SM-G930W8" || model == "SM-G930X") + ) { return "Galaxy S7" } if (codename != null && (codename == "SC-02H" || codename == "SCV33" || codename == "hero2lte" || codename == "hero2ltebmc" || codename == "hero2ltektt" || codename == "hero2lteskt" || codename == "hero2qlteatt" || codename == "hero2qltecctvzw" || codename == "hero2qltespr" || codename == "hero2qltetmo" || codename == "hero2qlteusc" || codename == "hero2qltevzw") || model != null && (model == "SAMSUNG-SM-G935A" || model == "SC-02H" || model == "SCV33" || model == "SM-G935K" || model == "SM-G935P" || model == "SM-G935R4" || model == "SM-G935S" || model == "SM-G935T" || model == "SM-G935V" || model == "SM-G935VC" || model == "SM-G935W8" || model == "SM-G935X")) { @@ -405,8 +432,9 @@ object DeviceName { while (i < len) { val json = jsonArray.getJSONObject(i) val info = DeviceInfo(json) - if (codename.equals(info.codename, ignoreCase = true) && model == null - || codename.equals(info.codename, ignoreCase = true) && model.equals(info.model, ignoreCase = true)) { + if (codename.equals(info.codename, ignoreCase = true) && model == null || + codename.equals(info.codename, ignoreCase = true) && model.equals(info.model, ignoreCase = true) + ) { // Save to SharedPreferences so we don't need to make another request. val editor = prefs.edit() editor.putString(key, json.toString()) @@ -570,4 +598,4 @@ object DeviceName { marketName } else model?.capitalize(Locale.getDefault()) } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/HapticFeedbackManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/HapticFeedbackManager.kt index fa6c5d1b4..a64b44fa8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/HapticFeedbackManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/HapticFeedbackManager.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.helpers import android.view.HapticFeedbackConstants import android.view.View -import android.view.Window class HapticFeedbackManager { companion object { @@ -14,4 +13,4 @@ class HapticFeedbackManager { view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/HealthFormatter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/HealthFormatter.kt index ade590520..48d3f73b5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/HealthFormatter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/HealthFormatter.kt @@ -11,11 +11,11 @@ object HealthFormatter { @JvmStatic fun format(input: Double) = - if (input < 1 && input > 0) { - ceil(input * 10) / 10 - } else { - floor(input) - } + if (input < 1 && input > 0) { + ceil(input * 10) / 10 + } else { + floor(input) + } fun formatToString(input: Int, locale: Locale = getDefaultLocale()) = formatToString(input.toDouble(), locale) @@ -32,4 +32,4 @@ object HealthFormatter { } else { Locale.getDefault() } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/Keyhelper.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/Keyhelper.kt index 3de8006b0..6a098d239 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/Keyhelper.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/Keyhelper.kt @@ -42,11 +42,9 @@ constructor(ctx: Context, var sharedPreferences: SharedPreferences, var keyStore } catch (e: Exception) { e.printStackTrace() } - } } - @Throws(NoSuchProviderException::class, NoSuchAlgorithmException::class, InvalidAlgorithmParameterException::class, KeyStoreException::class, CertificateException::class, IOException::class) private fun generateEncryptKey(ctx: Context) { keyStore.load(null) @@ -55,12 +53,15 @@ constructor(ctx: Context, var sharedPreferences: SharedPreferences, var keyStore if (!keyStore.containsAlias(KEY_ALIAS)) { val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, AndroidKeyStore) keyGenerator.init( - KeyGenParameterSpec.Builder(KEY_ALIAS, - KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT) - .setBlockModes(KeyProperties.BLOCK_MODE_GCM) - .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) - .setRandomizedEncryptionRequired(false) - .build()) + KeyGenParameterSpec.Builder( + KEY_ALIAS, + KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT + ) + .setBlockModes(KeyProperties.BLOCK_MODE_GCM) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) + .setRandomizedEncryptionRequired(false) + .build() + ) keyGenerator.generateKey() } } else { @@ -70,12 +71,12 @@ constructor(ctx: Context, var sharedPreferences: SharedPreferences, var keyStore val end = Calendar.getInstance() end.add(Calendar.YEAR, 30) val spec = KeyPairGeneratorSpec.Builder(ctx) - .setAlias(KEY_ALIAS) - .setSubject(X500Principal("CN=$KEY_ALIAS")) - .setSerialNumber(BigInteger.TEN) - .setStartDate(start.time) - .setEndDate(end.time) - .build() + .setAlias(KEY_ALIAS) + .setSubject(X500Principal("CN=$KEY_ALIAS")) + .setSerialNumber(BigInteger.TEN) + .setStartDate(start.time) + .setEndDate(end.time) + .build() val kpg = KeyPairGenerator.getInstance("RSA", AndroidKeyStore) kpg.initialize(spec) kpg.generateKeyPair() @@ -104,7 +105,8 @@ constructor(ctx: Context, var sharedPreferences: SharedPreferences, var keyStore val output = Cipher.getInstance(RSA_MODE, "AndroidOpenSSL") output.init(Cipher.DECRYPT_MODE, privateKeyEntry?.privateKey) val cipherInputStream = CipherInputStream( - ByteArrayInputStream(encrypted), output) + ByteArrayInputStream(encrypted), output + ) return cipherInputStream.readBytes() } @@ -123,7 +125,6 @@ constructor(ctx: Context, var sharedPreferences: SharedPreferences, var keyStore } } - @Throws(Exception::class) private fun getSecretKey(): Key { val enryptedKeyB64 = sharedPreferences.getString(ENCRYPTED_KEY, null) @@ -152,13 +153,11 @@ constructor(ctx: Context, var sharedPreferences: SharedPreferences, var keyStore } catch (e: Exception) { e.printStackTrace() } - } val encodedBytes = c.doFinal(input.toByteArray(charset("UTF-8"))) return Base64.encodeToString(encodedBytes, Base64.DEFAULT) } - @Throws(NoSuchAlgorithmException::class, NoSuchPaddingException::class, NoSuchProviderException::class, BadPaddingException::class, IllegalBlockSizeException::class, UnsupportedEncodingException::class) fun decrypt(encrypted: String): String? { val c: Cipher @@ -178,7 +177,6 @@ constructor(ctx: Context, var sharedPreferences: SharedPreferences, var keyStore } catch (e: Exception) { e.printStackTrace() } - } return try { @@ -237,9 +235,8 @@ constructor(ctx: Context, var sharedPreferences: SharedPreferences, var keyStore } catch (e: IOException) { e.printStackTrace() } - } return keyHelper } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/MainNavigationController.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/MainNavigationController.kt index f6ed06016..07eb62d60 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/MainNavigationController.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/MainNavigationController.kt @@ -5,7 +5,6 @@ import android.net.Uri import android.os.Bundle import android.util.Log import androidx.navigation.NavController -import androidx.navigation.NavDeepLink import androidx.navigation.NavDeepLinkRequest import androidx.navigation.NavDirections import java.lang.ref.WeakReference @@ -18,7 +17,7 @@ object MainNavigationController { private var controllerReference: WeakReference? = null private val navController: NavController? - get() { return controllerReference?.get() } + get() { return controllerReference?.get() } fun setup(navController: NavController) { this.controllerReference = WeakReference(navController) @@ -41,7 +40,7 @@ object MainNavigationController { if (abs((lastNavigation?.time ?: 0) - Date().time) > 500) { lastNavigation = Date() try { - navController?.navigate(directions) + navController?.navigate(directions) } catch (_: IllegalArgumentException) {} } } @@ -66,4 +65,4 @@ object MainNavigationController { fun handle(deeplink: Intent) { navController?.handleDeepLink(deeplink) } -} \ No newline at end of file +} 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 febc4d6ec..a9a9c32e4 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 @@ -4,7 +4,6 @@ import android.content.Intent import androidx.core.os.bundleOf import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager -import com.habitrpg.android.habitica.models.user.User import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -79,4 +78,4 @@ class NotificationOpenHandler { } } } -} \ No newline at end of file +} 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 beb79e512..a854de30a 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 @@ -20,7 +20,7 @@ import org.greenrobot.eventbus.EventBus import java.util.* import java.util.concurrent.TimeUnit -class NotificationsManager (private val context: Context) { +class NotificationsManager(private val context: Context) { private val seenNotifications: MutableMap private var apiClient: ApiClient? = null @@ -41,7 +41,7 @@ class NotificationsManager (private val context: Context) { fun getNotifications(): Flowable> { return this.notifications.startWithArray(emptyList()) - .toFlowable(BackpressureStrategy.LATEST) + .toFlowable(BackpressureStrategy.LATEST) } fun getNotification(id: String): Notification? { @@ -59,58 +59,60 @@ class NotificationsManager (private val context: Context) { } lastNotificationHandling = now notifications - .filter { !this.seenNotifications.containsKey(it.id) } - .map { - val notificationDisplayed = when (it.type) { - Notification.Type.LOGIN_INCENTIVE.type -> displayLoginIncentiveNotification(it) - Notification.Type.ACHIEVEMENT_PARTY_UP.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_PARTY_ON.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_BEAST_MASTER.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_MOUNT_MASTER.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_TRIAD_BINGO.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_GUILD_JOINED.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_CHALLENGE_JOINED.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_INVITED_FRIEND.type -> displayAchievementNotification(it) - Notification.Type.WON_CHALLENGE.type -> displayWonChallengeNotificaiton(it) + .filter { !this.seenNotifications.containsKey(it.id) } + .map { + val notificationDisplayed = when (it.type) { + Notification.Type.LOGIN_INCENTIVE.type -> displayLoginIncentiveNotification(it) + Notification.Type.ACHIEVEMENT_PARTY_UP.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_PARTY_ON.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_BEAST_MASTER.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_MOUNT_MASTER.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_TRIAD_BINGO.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_GUILD_JOINED.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_CHALLENGE_JOINED.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_INVITED_FRIEND.type -> displayAchievementNotification(it) + Notification.Type.WON_CHALLENGE.type -> displayWonChallengeNotificaiton(it) - Notification.Type.ACHIEVEMENT_ALL_YOUR_BASE.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_BACK_TO_BASICS.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_JUST_ADD_WATER.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_LOST_MASTERCLASSER.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_MIND_OVER_MATTER.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_DUST_DEVIL.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_ARID_AUTHORITY.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_MONSTER_MAGUS.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_UNDEAD_UNDERTAKER.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_PRIMED_FOR_PAINTING.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_PEARLY_PRO.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_TICKLED_PINK.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_ROSY_OUTLOOK.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_BUG_BONANZA.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_BARE_NECESSITIES.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_FRESHWATER_FRIENDS.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_ALL_THAT_GLITTERS.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_BONE_COLLECTOR.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_SKELETON_CREW.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_SEEING_RED.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_RED_LETTER_DAY.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_ALL_YOUR_BASE.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_BACK_TO_BASICS.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_JUST_ADD_WATER.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_LOST_MASTERCLASSER.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_MIND_OVER_MATTER.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_DUST_DEVIL.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_ARID_AUTHORITY.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_MONSTER_MAGUS.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_UNDEAD_UNDERTAKER.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_PRIMED_FOR_PAINTING.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_PEARLY_PRO.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_TICKLED_PINK.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_ROSY_OUTLOOK.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_BUG_BONANZA.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_BARE_NECESSITIES.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_FRESHWATER_FRIENDS.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_ALL_THAT_GLITTERS.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_BONE_COLLECTOR.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_SKELETON_CREW.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_SEEING_RED.type -> displayAchievementNotification(it) + Notification.Type.ACHIEVEMENT_RED_LETTER_DAY.type -> displayAchievementNotification(it) - Notification.Type.ACHIEVEMENT_GENERIC.type -> displayAchievementNotification(it, notifications.find { notif -> + Notification.Type.ACHIEVEMENT_GENERIC.type -> displayAchievementNotification( + it, + notifications.find { notif -> notif.type == Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type - } != null) - Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type -> displayAchievementNotification(it) - Notification.Type.FIRST_DROP.type -> displayFirstDropNotification(it) - else -> false - } - - if (notificationDisplayed == true) { - this.seenNotifications[it.id] = true - } - + } != null + ) + Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type -> displayAchievementNotification(it) + Notification.Type.FIRST_DROP.type -> displayFirstDropNotification(it) + else -> false } + if (notificationDisplayed == true) { + this.seenNotifications[it.id] = true + } + } + return true } @@ -139,7 +141,7 @@ class NotificationsManager (private val context: Context) { EventBus.getDefault().post(event) if (apiClient != null) { apiClient?.readNotification(notification.id) - ?.subscribe({}, RxErrorHandler.handleEmptyError()) + ?.subscribe({}, RxErrorHandler.handleEmptyError()) } } return true @@ -154,10 +156,13 @@ class NotificationsManager (private val context: Context) { 200 } val sub = Completable.complete() - .delay(delay, TimeUnit.MILLISECONDS) - .subscribe({ + .delay(delay, TimeUnit.MILLISECONDS) + .subscribe( + { EventBus.getDefault().post(ShowAchievementDialog(achievement, notification.id, data?.message, data?.modalText, isLastOnboardingAchievement)) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) logOnboardingEvents(achievement) return true } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NumberAbbreviator.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NumberAbbreviator.kt index 495f5b07b..fc57cdcc5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NumberAbbreviator.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NumberAbbreviator.kt @@ -1,9 +1,7 @@ package com.habitrpg.android.habitica.helpers import android.content.Context - import com.habitrpg.android.habitica.R - import java.math.RoundingMode import java.text.DecimalFormat 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 074cf09ca..9b3ef1517 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 @@ -65,7 +65,6 @@ class PurchaseHandler(activity: Activity, val analyticsManager: AnalyticsManager getSKU(ProductTypes.IN_APP, identifier, onSuccess) } - private fun getSKUs(type: String, identifiers: List, onSuccess: ((List) -> Unit)) { getProduct(type, identifiers) { onSuccess(it.skus) @@ -73,19 +72,25 @@ class PurchaseHandler(activity: Activity, val analyticsManager: AnalyticsManager } private fun getProduct(type: String, identifiers: List, onSuccess: ((Inventory.Product) -> Unit)) { - loadInventory(type, identifiers, Inventory.Callback { products -> - val purchases = products.get(type) - if (!purchases.supported) return@Callback - onSuccess(purchases) - }) + loadInventory( + type, identifiers, + Inventory.Callback { products -> + val purchases = products.get(type) + if (!purchases.supported) return@Callback + onSuccess(purchases) + } + ) } private fun getSKU(type: String, identifier: String, onSuccess: ((Sku) -> Unit)) { - loadInventory(type, listOf(identifier), Inventory.Callback { products -> - val purchases = products.get(type) - if (!purchases.supported) return@Callback - purchases.skus.firstOrNull()?.let { onSuccess(it) } - }) + loadInventory( + type, listOf(identifier), + Inventory.Callback { products -> + val purchases = products.get(type) + if (!purchases.supported) return@Callback + purchases.skus.firstOrNull()?.let { onSuccess(it) } + } + ) } private fun loadInventory(type: String, skus: List, callback: Inventory.Callback) { @@ -101,132 +106,166 @@ class PurchaseHandler(activity: Activity, val analyticsManager: AnalyticsManager fun purchaseSubscription(sku: Sku, onSuccess: (() -> Unit)) { sku.id.code?.let { code -> - billingRequests?.isPurchased(ProductTypes.SUBSCRIPTION, code, object : RequestListener { - override fun onSuccess(aBoolean: Boolean) { - if (!aBoolean) { - // no current product exist - checkout?.let { - billingRequests?.purchase(ProductTypes.SUBSCRIPTION, code, null, it.createOneShotPurchaseFlow(object : RequestListener { - override fun onSuccess(result: Purchase) { - onSuccess() - } + billingRequests?.isPurchased( + ProductTypes.SUBSCRIPTION, code, + object : RequestListener { + override fun onSuccess(aBoolean: Boolean) { + if (!aBoolean) { + // no current product exist + checkout?.let { + billingRequests?.purchase( + ProductTypes.SUBSCRIPTION, code, null, + it.createOneShotPurchaseFlow(object : RequestListener { + override fun onSuccess(result: Purchase) { + onSuccess() + } - override fun onError(response: Int, e: java.lang.Exception) {} - })) + override fun onError(response: Int, e: java.lang.Exception) {} + }) + ) + } + } else { + onSuccess() } - } else { - onSuccess() } - } - override fun onError(i: Int, e: Exception) { analyticsManager.logException(e) } - }) + override fun onError(i: Int, e: Exception) { analyticsManager.logException(e) } + } + ) } } fun checkForSubscription(onSubscriptionFound: ((Purchase) -> Unit)) { - billingRequests?.getPurchases(ProductTypes.SUBSCRIPTION, null, object : RequestListener { - override fun onSuccess(result: Purchases) { - var lastPurchase: Purchase? = null - for (purchase in result.list) { - if (lastPurchase != null && lastPurchase.time > purchase.time) { - continue - } else { - lastPurchase = purchase + billingRequests?.getPurchases( + ProductTypes.SUBSCRIPTION, null, + object : RequestListener { + override fun onSuccess(result: Purchases) { + var lastPurchase: Purchase? = null + for (purchase in result.list) { + if (lastPurchase != null && lastPurchase.time > purchase.time) { + continue + } else { + lastPurchase = purchase + } + } + if (lastPurchase != null) { + onSubscriptionFound(lastPurchase) } } - if (lastPurchase != null) { - onSubscriptionFound(lastPurchase) + + override fun onError(response: Int, e: java.lang.Exception) { } } - - override fun onError(response: Int, e: java.lang.Exception) { - } - }) + ) } private fun checkIfPendingPurchases() { - billingRequests?.getAllPurchases(ProductTypes.IN_APP, object : RequestListener { - override fun onSuccess(purchases: Purchases) { - for (purchase in purchases.list) { - if (PurchaseTypes.allGemTypes.contains(purchase.sku)) { - billingRequests?.consume(purchase.token, object : RequestListener { - override fun onSuccess(o: Any) { - //EventBus.getDefault().post(new BoughtGemsEvent(GEMS_TO_ADD)); - } + billingRequests?.getAllPurchases( + ProductTypes.IN_APP, + object : RequestListener { + override fun onSuccess(purchases: Purchases) { + for (purchase in purchases.list) { + if (PurchaseTypes.allGemTypes.contains(purchase.sku)) { + billingRequests?.consume( + purchase.token, + object : RequestListener { + override fun onSuccess(o: Any) { + // EventBus.getDefault().post(new BoughtGemsEvent(GEMS_TO_ADD)); + } - override fun onError(i: Int, e: Exception) { - analyticsManager.logException(e) - } - }) + override fun onError(i: Int, e: Exception) { + analyticsManager.logException(e) + } + } + ) + } } } - } - override fun onError(i: Int, e: Exception) { - analyticsManager.logException(e) + override fun onError(i: Int, e: Exception) { + analyticsManager.logException(e) + } } - }) + ) } fun purchaseGems(identifier: String) { checkout?.let { it.destroyPurchaseFlow() - billingRequests?.purchase(ProductTypes.IN_APP, identifier, null, it.createOneShotPurchaseFlow( - PURCHASE_REQUEST_CODE, object : RequestListener { - override fun onSuccess(result: Purchase) { - billingRequests?.consume(result.token, object : RequestListener { - override fun onSuccess(o: Any) { /* no-op */ } + billingRequests?.purchase( + ProductTypes.IN_APP, identifier, null, + it.createOneShotPurchaseFlow( + PURCHASE_REQUEST_CODE, + object : RequestListener { + override fun onSuccess(result: Purchase) { + billingRequests?.consume( + result.token, + object : RequestListener { + override fun onSuccess(o: Any) { /* no-op */ } - override fun onError(i: Int, e: Exception) { - analyticsManager.logException(e) + override fun onError(i: Int, e: Exception) { + analyticsManager.logException(e) + } + } + ) } - }) - } - override fun onError(response: Int, e: java.lang.Exception) { - analyticsManager.logException(e) - if (response == ResponseCodes.ITEM_ALREADY_OWNED) { - checkIfPendingPurchases() + override fun onError(response: Int, e: java.lang.Exception) { + analyticsManager.logException(e) + if (response == ResponseCodes.ITEM_ALREADY_OWNED) { + checkIfPendingPurchases() + } + } } - } - })) + ) + ) } } fun purchaseNoRenewSubscription(sku: Sku) { checkout?.let { - billingRequests?.purchase(ProductTypes.IN_APP, sku.id.code, null, it.createOneShotPurchaseFlow( - PURCHASE_REQUEST_CODE, object : RequestListener { - override fun onSuccess(result: Purchase) { - billingRequests?.consume(result.token, object : RequestListener { - override fun onSuccess(o: Any) { /* no-op */ } + billingRequests?.purchase( + ProductTypes.IN_APP, sku.id.code, null, + it.createOneShotPurchaseFlow( + PURCHASE_REQUEST_CODE, + object : RequestListener { + override fun onSuccess(result: Purchase) { + billingRequests?.consume( + result.token, + object : RequestListener { + override fun onSuccess(o: Any) { /* no-op */ } - override fun onError(i: Int, e: Exception) { + override fun onError(i: Int, e: Exception) { + analyticsManager.logException(e) + } + } + ) + } + + override fun onError(response: Int, e: java.lang.Exception) { analyticsManager.logException(e) } - }) - } - - override fun onError(response: Int, e: java.lang.Exception) { - analyticsManager.logException(e) - } - })) + } + ) + ) } } fun consumePurchase(purchase: Purchase) { if (PurchaseTypes.allGemTypes.contains(purchase.sku) || PurchaseTypes.allSubscriptionNoRenewTypes.contains(purchase.sku)) { - billingRequests?.consume(purchase.token, object : RequestListener { - override fun onSuccess(result: Any) { /* no-op */ } + billingRequests?.consume( + purchase.token, + object : RequestListener { + override fun onSuccess(result: Any) { /* no-op */ } - override fun onError(response: Int, e: Exception) { - analyticsManager.logException(e) + override fun onError(response: Int, e: Exception) { + analyticsManager.logException(e) + } } - }) + ) } } - + companion object { private var handlers = WeakHashMap() @@ -237,4 +276,4 @@ class PurchaseHandler(activity: Activity, val analyticsManager: AnalyticsManager return handlers[activity] } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RxErrorHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RxErrorHandler.kt index 6f3943360..0197ff7e0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RxErrorHandler.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RxErrorHandler.kt @@ -22,7 +22,7 @@ class RxErrorHandler { } fun handleEmptyError(): Consumer { - //Can't be turned into a lambda, because it then doesn't work for some reason. + // Can't be turned into a lambda, because it then doesn't work for some reason. return Consumer { reportError(it) } } @@ -32,13 +32,13 @@ class RxErrorHandler { Log.e("ObservableError", Log.getStackTraceString(throwable)) } catch (ignored: Exception) { } - } else { - if (!IOException::class.java.isAssignableFrom(throwable.javaClass) - && !HttpException::class.java.isAssignableFrom(throwable.javaClass) - && !retrofit2.HttpException::class.java.isAssignableFrom(throwable.javaClass) - && !EOFException::class.java.isAssignableFrom(throwable.javaClass) - && throwable !is ConnectionShutdownException) { + if (!IOException::class.java.isAssignableFrom(throwable.javaClass) && + !HttpException::class.java.isAssignableFrom(throwable.javaClass) && + !retrofit2.HttpException::class.java.isAssignableFrom(throwable.javaClass) && + !EOFException::class.java.isAssignableFrom(throwable.javaClass) && + throwable !is ConnectionShutdownException + ) { instance?.analyticsManager?.logException(throwable) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewClient.kt index 5e8297b52..10c12ba92 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewClient.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewClient.kt @@ -11,8 +11,8 @@ import androidx.annotation.RequiresApi import com.habitrpg.android.habitica.BuildConfig class SignInWebViewClient( - private val attempt: SignInWithAppleService.AuthenticationAttempt, - private val callback: (SignInWithAppleResult) -> Unit + private val attempt: SignInWithAppleService.AuthenticationAttempt, + private val callback: (SignInWithAppleResult) -> Unit ) : WebViewClient() { // for API levels < 24 @@ -61,7 +61,6 @@ class SignInWebViewClient( } } } - } sealed class SignInWithAppleResult { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewDialogFragment.kt index eb596f164..cc45e6787 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewDialogFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewDialogFragment.kt @@ -42,9 +42,9 @@ class SignInWebViewDialogFragment : DialogFragment() { } override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? ): View? { super.onCreateView(inflater, container, savedInstanceState) @@ -73,10 +73,10 @@ class SignInWebViewDialogFragment : DialogFragment() { override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putBundle( - WEB_VIEW_KEY, - Bundle().apply { - webViewIfCreated?.saveState(this) - } + WEB_VIEW_KEY, + Bundle().apply { + webViewIfCreated?.saveState(this) + } ) } @@ -102,4 +102,4 @@ class SignInWebViewDialogFragment : DialogFragment() { } callback(result) } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWithAppleService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWithAppleService.kt index 4cb72216d..74dd4d937 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWithAppleService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWithAppleService.kt @@ -8,27 +8,27 @@ import com.willowtreeapps.signinwithapplebutton.SignInWithAppleConfiguration import java.util.* class SignInWithAppleService( - private val fragmentManager: FragmentManager, - private val fragmentTag: String, - private val configuration: SignInWithAppleConfiguration, - private val callback: (SignInWithAppleResult) -> Unit + private val fragmentManager: FragmentManager, + private val fragmentTag: String, + private val configuration: SignInWithAppleConfiguration, + private val callback: (SignInWithAppleResult) -> Unit ) { init { val fragmentIfShown = - fragmentManager.findFragmentByTag(fragmentTag) as? SignInWebViewDialogFragment + fragmentManager.findFragmentByTag(fragmentTag) as? SignInWebViewDialogFragment fragmentIfShown?.configure(callback) } data class AuthenticationAttempt( - val authenticationUri: String, - val redirectUri: String, - val state: String + val authenticationUri: String, + val redirectUri: String, + val state: String ) : Parcelable { constructor(parcel: Parcel) : this( - parcel.readString() ?: "invalid", - parcel.readString() ?: "invalid", - parcel.readString() ?: "invalid" + parcel.readString() ?: "invalid", + parcel.readString() ?: "invalid", + parcel.readString() ?: "invalid" ) override fun writeToParcel(parcel: Parcel, flags: Int) { @@ -59,22 +59,22 @@ class SignInWithAppleService( https://developer.apple.com/documentation/signinwithapplejs/configuring_your_webpage_for_sign_in_with_apple */ fun create( - configuration: SignInWithAppleConfiguration, - state: String = UUID.randomUUID().toString() + configuration: SignInWithAppleConfiguration, + state: String = UUID.randomUUID().toString() ): AuthenticationAttempt { val authenticationUri = Uri - .parse("https://appleid.apple.com/auth/authorize") - .buildUpon().apply { - appendQueryParameter("response_type", "code") - appendQueryParameter("v", "1.1.6") - appendQueryParameter("client_id", configuration.clientId) - appendQueryParameter("redirect_uri", configuration.redirectUri) - appendQueryParameter("scope", configuration.scope) - appendQueryParameter("state", state) - appendQueryParameter("response_mode", "form_post") - } - .build() - .toString() + .parse("https://appleid.apple.com/auth/authorize") + .buildUpon().apply { + appendQueryParameter("response_type", "code") + appendQueryParameter("v", "1.1.6") + appendQueryParameter("client_id", configuration.clientId) + appendQueryParameter("redirect_uri", configuration.redirectUri) + appendQueryParameter("scope", configuration.scope) + appendQueryParameter("state", state) + appendQueryParameter("response_mode", "form_post") + } + .build() + .toString() return AuthenticationAttempt(authenticationUri, configuration.redirectUri, state) } @@ -86,4 +86,4 @@ class SignInWithAppleService( fragment.configure(callback) fragment.show(fragmentManager, fragmentTag) } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundFile.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundFile.kt index ff608eb2f..f7d54935b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundFile.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundFile.kt @@ -3,10 +3,8 @@ package com.habitrpg.android.habitica.helpers import android.media.AudioAttributes import android.media.AudioManager import android.media.MediaPlayer -import android.os.Build import java.io.File - class SoundFile(val theme: String, private val fileName: String) : MediaPlayer.OnCompletionListener { var file: File? = null private var playerPrepared: Boolean = false @@ -33,9 +31,9 @@ class SoundFile(val theme: String, private val fileName: String) : MediaPlayer.O try { m.setDataSource(file?.path) val attributes = AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .setLegacyStreamType(AudioManager.STREAM_NOTIFICATION) - .build() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setLegacyStreamType(AudioManager.STREAM_NOTIFICATION) + .build() m.setAudioAttributes(attributes) m.prepare() @@ -47,7 +45,6 @@ class SoundFile(val theme: String, private val fileName: String) : MediaPlayer.O } catch (e: Exception) { e.printStackTrace() } - } override fun onCompletion(mediaPlayer: MediaPlayer) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundFileLoader.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundFileLoader.kt index cda1cf7be..cafdc7ec5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundFileLoader.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundFileLoader.kt @@ -28,7 +28,8 @@ class SoundFileLoader(private val context: Context) { @SuppressLint("SetWorldReadable", "ReturnCount") fun download(files: List): Single> { return Observable.fromIterable(files) - .flatMap({ audioFile -> + .flatMap( + { audioFile -> val file = File(getFullAudioFilePath(audioFile)) if (file.exists() && file.length() > 5000) { // Important, or else the MediaPlayer can't access this file @@ -67,10 +68,12 @@ class SoundFileLoader(private val context: Context) { sub.onComplete() } fileObservable.subscribeOn(Schedulers.io()) - }, 5) - .toList() + }, + 5 + ) + .toList() } private fun getFullAudioFilePath(soundFile: SoundFile): String = - externalCacheDir + File.separator + soundFile.filePath -} \ No newline at end of file + externalCacheDir + File.separator + soundFile.filePath +} 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 48c389638..940ff3765 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 @@ -47,11 +47,14 @@ class SoundManager { val soundFiles = ArrayList() soundFiles.add(SoundFile(soundTheme, type)) - soundFileLoader.download(soundFiles).observeOn(Schedulers.newThread()).subscribe({ - val file = soundFiles[0] - loadedSoundFiles[type] = file - file.play() - }, RxErrorHandler.handleEmptyError()) + soundFileLoader.download(soundFiles).observeOn(Schedulers.newThread()).subscribe( + { + val file = soundFiles[0] + loadedSoundFiles[type] = file + file.play() + }, + RxErrorHandler.handleEmptyError() + ) } } @@ -68,5 +71,4 @@ class SoundManager { const val SoundTodo = "Todo" const val SoundThemeOff = "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 6ddf8d20b..017bd9563 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 @@ -24,7 +24,7 @@ class TaskAlarmManager(private var context: Context, private var taskRepository: for (reminder in it) { var currentReminder = reminder if (task.type == Task.TYPE_DAILY) { - //Ensure that we set to the next available time + // Ensure that we set to the next available time currentReminder = this.setTimeForDailyReminder(currentReminder, task) } this.setAlarmForRemindersItem(task, currentReminder) @@ -40,22 +40,22 @@ class TaskAlarmManager(private var context: Context, private var taskRepository: } } - //This function is used from the TaskReceiver since we do not have access to the task - //We currently only use this function to schedule the next reminder for dailies - //We may be able to use repeating alarms instead of this in the future + // This function is used from the TaskReceiver since we do not have access to the task + // We currently only use this function to schedule the next reminder for dailies + // We may be able to use repeating alarms instead of this in the future fun addAlarmForTaskId(taskId: String) { taskRepository.getTaskCopy(taskId) - .filter { task -> task.isValid && task.isManaged && Task.TYPE_DAILY == task.type } - .firstElement() - .subscribe({ this.setAlarmsForTask(it) }, RxErrorHandler.handleEmptyError()) + .filter { task -> task.isValid && task.isManaged && Task.TYPE_DAILY == task.type } + .firstElement() + .subscribe({ this.setAlarmsForTask(it) }, RxErrorHandler.handleEmptyError()) } fun scheduleAllSavedAlarms(preventDailyReminder: Boolean) { taskRepository.getTaskCopies(userId) - .firstElement() - .toFlowable() - .flatMap { Flowable.fromIterable(it) } - .subscribe({ this.setAlarmsForTask(it) }, RxErrorHandler.handleEmptyError()) + .firstElement() + .toFlowable() + .flatMap { Flowable.fromIterable(it) } + .subscribe({ this.setAlarmsForTask(it) }, RxErrorHandler.handleEmptyError()) if (!preventDailyReminder) { scheduleDailyReminder(context) @@ -92,7 +92,7 @@ class TaskAlarmManager(private var context: Context, private var taskRepository: intent.putExtra(TASK_ID_INTENT_KEY, reminderItemTask.id) val intentId = remindersItem.id?.hashCode() ?: 0 and 0xfffffff - //Cancel alarm if already exists + // Cancel alarm if already exists val previousSender = PendingIntent.getBroadcast(context, intentId, intent, PendingIntent.FLAG_NO_CREATE) if (previousSender != null) { previousSender.cancel() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.kt index e4ebe9147..bdd3232fa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.kt @@ -97,11 +97,11 @@ class TaskFilterHelper { } if (searchQuery?.isNotEmpty() == true) { query = query - .beginGroup() - .contains("text", searchQuery ?: "", Case.INSENSITIVE) - .or() - .contains("notes", searchQuery ?: "", Case.INSENSITIVE) - .endGroup() + .beginGroup() + .contains("text", searchQuery ?: "", Case.INSENSITIVE) + .or() + .contains("notes", searchQuery ?: "", Case.INSENSITIVE) + .endGroup() } if (activeFilter != null && activeFilter != Task.FILTER_ALL) { when (activeFilter) { 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 48e65de43..b6d586813 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 @@ -128,7 +128,6 @@ class UserStatComputer { attributeRow.summary = false skillRows.add(attributeRow) - val attributeRow2 = AttributeRow() attributeRow2.labelId = R.string.profile_class_bonus attributeRow2.strVal = strClassBonus diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ChangeUsernameLocalNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ChangeUsernameLocalNotification.kt index 3862692b3..e8ee92022 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ChangeUsernameLocalNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ChangeUsernameLocalNotification.kt @@ -2,4 +2,4 @@ package com.habitrpg.android.habitica.helpers.notifications import android.content.Context -class ChangeUsernameLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) \ No newline at end of file +class ChangeUsernameLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ChatMentionNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ChatMentionNotification.kt index 57dd8d7c6..6641b23e5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ChatMentionNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/ChatMentionNotification.kt @@ -8,10 +8,10 @@ class ChatMentionNotification(context: Context, identifier: String?) : HabiticaL override fun configureNotificationBuilder(data: MutableMap): NotificationCompat.Builder { val style = NotificationCompat.BigTextStyle() - .setBigContentTitle(title) - .bigText(message) + .setBigContentTitle(title) + .bigText(message) return super.configureNotificationBuilder(data) - .setStyle(style) + .setStyle(style) } override fun configureMainIntent(intent: Intent) { @@ -19,4 +19,4 @@ class ChatMentionNotification(context: Context, identifier: String?) : HabiticaL intent.putExtra("type", data?.get("type")) intent.putExtra("groupID", data?.get("groupID")) } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GenericLocalNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GenericLocalNotification.kt index 291393c49..ee768552d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GenericLocalNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GenericLocalNotification.kt @@ -2,4 +2,4 @@ package com.habitrpg.android.habitica.helpers.notifications import android.content.Context -class GenericLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) \ No newline at end of file +class GenericLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GiftOneGetOneLocalNotification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GiftOneGetOneLocalNotification.kt index 147a68019..a14ab5e28 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GiftOneGetOneLocalNotification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/GiftOneGetOneLocalNotification.kt @@ -2,4 +2,4 @@ package com.habitrpg.android.habitica.helpers.notifications import android.content.Context -class GiftOneGetOneLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) \ No newline at end of file +class GiftOneGetOneLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) 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 dfeb5e7dc..2b80cb16f 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 @@ -25,8 +25,8 @@ class GroupActivityNotification(context: Context, identifier: String?) : Habitic val user = Person.Builder().setName("You").build() val message = makeMessageFromData(data) var style = NotificationCompat.MessagingStyle(user) - .setGroupConversation(true) - .setConversationTitle(data["groupName"]) + .setGroupConversation(true) + .setConversationTitle(data["groupName"]) val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager val existingNotifications = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -39,8 +39,8 @@ class GroupActivityNotification(context: Context, identifier: String?) : Habitic style = style.addMessage(message) oldMessages.add(data) return super.configureNotificationBuilder(data) - .setStyle(style) - .setExtras(bundleOf(Pair("messages", bundleOf(Pair("messages", oldMessages))))) + .setStyle(style) + .setExtras(bundleOf(Pair("messages", bundleOf(Pair("messages", oldMessages))))) } private fun makeMessageFromData(data: Map): NotificationCompat.MessagingStyle.Message { @@ -49,9 +49,9 @@ class GroupActivityNotification(context: Context, identifier: String?) : Habitic val timestamp = dateFormat.parse(data["timestamp"]) ?: Date() val messageText = EmojiParser.parseEmojis(data["message"]?.trim { it <= ' ' }) return NotificationCompat.MessagingStyle.Message( - messageText, - timestamp.time, - sender + messageText, + timestamp.time, + sender ) } @@ -69,15 +69,19 @@ class GroupActivityNotification(context: Context, identifier: String?) : Habitic intent.action = actionName intent.putExtra("groupID", groupID) val replyPendingIntent: PendingIntent = - PendingIntent.getBroadcast(context, groupID.hashCode(), - intent, - PendingIntent.FLAG_UPDATE_CURRENT) + PendingIntent.getBroadcast( + context, groupID.hashCode(), + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ) val action: NotificationCompat.Action = - NotificationCompat.Action.Builder(R.drawable.ic_send_grey_600_24dp, - context.getString(R.string.reply), replyPendingIntent) - .addRemoteInput(remoteInput) - .build() + NotificationCompat.Action.Builder( + R.drawable.ic_send_grey_600_24dp, + context.getString(R.string.reply), replyPendingIntent + ) + .addRemoteInput(remoteInput) + .build() notificationBuilder.addAction(action) } @@ -86,4 +90,4 @@ class GroupActivityNotification(context: Context, identifier: String?) : Habitic intent.putExtra("type", data?.get("type")) intent.putExtra("groupID", data?.get("groupID")) } -} \ No newline at end of file +} 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 274ba2dff..e9e3f2ecc 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 @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.helpers.notifications import android.app.PendingIntent import android.content.Context import android.content.Intent - import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver @@ -25,10 +24,10 @@ class GuildInviteLocalNotification(context: Context, identifier: String?) : Habi acceptInviteIntent.action = res.getString(R.string.accept_guild_invite) acceptInviteIntent.putExtra("groupID", this.data?.get("groupID")) val pendingIntentAccept = PendingIntent.getBroadcast( - context, - 3000, - acceptInviteIntent, - PendingIntent.FLAG_UPDATE_CURRENT + context, + 3000, + acceptInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT ) notificationBuilder.addAction(0, "Accept", pendingIntentAccept) @@ -36,10 +35,10 @@ class GuildInviteLocalNotification(context: Context, identifier: String?) : Habi rejectInviteIntent.action = res.getString(R.string.reject_guild_invite) rejectInviteIntent.putExtra("groupID", this.data?.get("groupID")) val pendingIntentReject = PendingIntent.getBroadcast( - context, - 2000, - rejectInviteIntent, - PendingIntent.FLAG_UPDATE_CURRENT + context, + 2000, + rejectInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT ) notificationBuilder.addAction(0, "Reject", pendingIntentReject) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt index 1c67078d1..d4cdcd1ad 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt @@ -5,14 +5,12 @@ import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.components.UserComponent -import com.habitrpg.android.habitica.data.UserRepository -import com.habitrpg.android.habitica.helpers.RxErrorHandler import javax.inject.Inject class HabiticaFirebaseMessagingService : FirebaseMessagingService() { private val userComponent: UserComponent? - get() = HabiticaBaseApplication.userComponent + get() = HabiticaBaseApplication.userComponent @Inject internal lateinit var pushNotificationManager: PushNotificationManager @@ -23,7 +21,7 @@ class HabiticaFirebaseMessagingService : FirebaseMessagingService() { pushNotificationManager.displayNotification(remoteMessage) if (remoteMessage.data["identifier"]?.contains(PushNotificationManager.WON_CHALLENGE_PUSH_NOTIFICATION_KEY) == true) { - //userRepository.retrieveUser(true).subscribe({}, RxErrorHandler.handleEmptyError()) + // userRepository.retrieveUser(true).subscribe({}, RxErrorHandler.handleEmptyError()) } } } @@ -37,6 +35,5 @@ class HabiticaFirebaseMessagingService : FirebaseMessagingService() { pushNotificationManager.refreshedToken = refreshedToken } } - } -} \ No newline at end of file +} 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 272ac3b74..b85a6369e 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 @@ -21,13 +21,13 @@ abstract class HabiticaLocalNotification(protected var context: Context, protect protected var message: String? = null protected var notificationBuilder = NotificationCompat.Builder(context, "default") - .setSmallIcon(R.drawable.ic_gryphon_white) - .setAutoCancel(true) + .setSmallIcon(R.drawable.ic_gryphon_white) + .setAutoCancel(true) open fun configureNotificationBuilder(data: MutableMap): NotificationCompat.Builder { val path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) return notificationBuilder - .setSound(path) + .setSound(path) } @CallSuper @@ -54,14 +54,14 @@ abstract class HabiticaLocalNotification(protected var context: Context, protect this.data = data } - protected open fun setNotificationActions(data: Map) { + protected open fun setNotificationActions(data: Map) { val intent = Intent(context, MainActivity::class.java) configureMainIntent(intent) val pendingIntent = PendingIntent.getActivity( - context, - 3000, - intent, - PendingIntent.FLAG_UPDATE_CURRENT + context, + 3000, + intent, + 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 ed92d1895..a71cfb522 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,43 +6,43 @@ import android.content.Context * Created by keithholliday on 6/28/16. */ class HabiticaLocalNotificationFactory { - //use getShape method to get object of type shape + // use getShape method to get object of type shape fun build(notificationType: String?, context: Context?): HabiticaLocalNotification { return when { - PushNotificationManager.PARTY_INVITE_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.PARTY_INVITE_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { PartyInviteLocalNotification(context!!, notificationType) } - PushNotificationManager.RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { ReceivedPrivateMessageLocalNotification(context!!, notificationType) } - PushNotificationManager.RECEIVED_GEMS_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.RECEIVED_GEMS_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { ReceivedGemsGiftLocalNotification(context!!, notificationType) } - PushNotificationManager.RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.RECEIVED_SUBSCRIPTION_GIFT_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { ReceivedSubscriptionGiftLocalNotification(context!!, notificationType) } - PushNotificationManager.GUILD_INVITE_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.GUILD_INVITE_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { GuildInviteLocalNotification(context!!, notificationType) } - PushNotificationManager.QUEST_INVITE_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.QUEST_INVITE_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { QuestInviteLocalNotification(context!!, notificationType) } - PushNotificationManager.QUEST_BEGUN_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.QUEST_BEGUN_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { QuestBegunLocalNotification(context!!, notificationType) } - PushNotificationManager.WON_CHALLENGE_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.WON_CHALLENGE_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { WonChallengeLocalNotification(context!!, notificationType) } - PushNotificationManager.CHANGE_USERNAME_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.CHANGE_USERNAME_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { ChangeUsernameLocalNotification(context!!, notificationType) } - PushNotificationManager.GIFT_ONE_GET_ONE_PUSH_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.GIFT_ONE_GET_ONE_PUSH_NOTIFICATION_KEY.equals(notificationType, true) -> { GiftOneGetOneLocalNotification(context!!, notificationType) } - PushNotificationManager.CHAT_MENTION_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.CHAT_MENTION_NOTIFICATION_KEY.equals(notificationType, true) -> { ChatMentionNotification(context!!, notificationType) } - PushNotificationManager.GROUP_ACTIVITY_NOTIFICATION_KEY.equals(notificationType, true)-> { + PushNotificationManager.GROUP_ACTIVITY_NOTIFICATION_KEY.equals(notificationType, true) -> { GroupActivityNotification(context!!, notificationType) } else -> { @@ -50,4 +50,4 @@ class HabiticaLocalNotificationFactory { } } } -} \ No newline at end of file +} 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 e2eb8263b..14ddb6ebd 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 @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.helpers.notifications import android.app.PendingIntent import android.content.Context import android.content.Intent - import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver @@ -20,10 +19,10 @@ class PartyInviteLocalNotification(context: Context, identifier: String?) : Habi acceptInviteIntent.action = res.getString(R.string.accept_party_invite) acceptInviteIntent.putExtra("groupID", this.data?.get("groupID")) val pendingIntentAccept = PendingIntent.getBroadcast( - context, - 3000, - acceptInviteIntent, - PendingIntent.FLAG_UPDATE_CURRENT + context, + 3000, + acceptInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT ) notificationBuilder.addAction(0, context.getString(R.string.accept), pendingIntentAccept) @@ -31,10 +30,10 @@ class PartyInviteLocalNotification(context: Context, identifier: String?) : Habi rejectInviteIntent.action = res.getString(R.string.reject_party_invite) rejectInviteIntent.putExtra("groupID", this.data?.get("groupID")) val pendingIntentReject = PendingIntent.getBroadcast( - context, - 2000, - rejectInviteIntent, - PendingIntent.FLAG_UPDATE_CURRENT + context, + 2000, + rejectInviteIntent, + 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 d64cb43dc..249355efb 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 @@ -14,16 +14,16 @@ import java.util.* class PushNotificationManager(var apiClient: ApiClient, private val sharedPreferences: SharedPreferences, private val context: Context) { var refreshedToken: String = "" - set(value) { - if (value.isEmpty()) { - return - } + set(value) { + if (value.isEmpty()) { + return + } - field = value - sharedPreferences.edit { - putString(DEVICE_TOKEN_PREFERENCE_KEY, value) + field = value + sharedPreferences.edit { + putString(DEVICE_TOKEN_PREFERENCE_KEY, value) + } } - } private var user: User? = null fun setUser(user: User) { @@ -66,7 +66,6 @@ class PushNotificationManager(var apiClient: ApiClient, private val sharedPrefer fun displayNotification(remoteMessage: RemoteMessage) { val remoteMessageIdentifier = remoteMessage.data["identifier"] - val notificationFactory = HabiticaLocalNotificationFactory() val notification = notificationFactory.build(remoteMessageIdentifier, context) if (userIsSubscribedToNotificationType(remoteMessageIdentifier) && notification != null) { 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 c3ad147f0..2f347a31a 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 @@ -22,20 +22,20 @@ class QuestInviteLocalNotification(context: Context, identifier: String?) : Habi val acceptInviteIntent = Intent(context, LocalNotificationActionReceiver::class.java) acceptInviteIntent.action = res.getString(R.string.accept_quest_invite) val pendingIntentAccept = PendingIntent.getBroadcast( - context, - 3000, - acceptInviteIntent, - PendingIntent.FLAG_UPDATE_CURRENT + context, + 3000, + acceptInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT ) notificationBuilder.addAction(0, "Accept", pendingIntentAccept) val rejectInviteIntent = Intent(context, LocalNotificationActionReceiver::class.java) rejectInviteIntent.action = res.getString(R.string.reject_quest_invite) val pendingIntentReject = PendingIntent.getBroadcast( - context, - 2000, - rejectInviteIntent, - PendingIntent.FLAG_UPDATE_CURRENT + context, + 2000, + rejectInviteIntent, + PendingIntent.FLAG_UPDATE_CURRENT ) 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 d304522e9..1f51863f9 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 @@ -12,7 +12,6 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver import com.habitrpg.android.habitica.ui.helpers.EmojiParser - class ReceivedPrivateMessageLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) { override fun configureNotificationBuilder(data: MutableMap): NotificationCompat.Builder { val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager @@ -28,7 +27,7 @@ class ReceivedPrivateMessageLocalNotification(context: Context, identifier: Stri style = style.addLine(messageText) oldMessages.add(messageText) var notification = super.configureNotificationBuilder(data) - .setExtras(bundleOf(Pair("messages", oldMessages))) + .setExtras(bundleOf(Pair("messages", oldMessages))) if (oldMessages.size > 1) { val notificationTitle = if (data["senderName"] != null) { context.getString(R.string.inbox_messages_title, oldMessages.size, data["senderName"]) @@ -36,8 +35,8 @@ class ReceivedPrivateMessageLocalNotification(context: Context, identifier: Stri context.getString(R.string.inbox_messages_title_nosender, oldMessages.size) } notification = notification - .setContentTitle(notificationTitle) - .setStyle(style) + .setContentTitle(notificationTitle) + .setStyle(style) title = null } else { notification = notification.setContentTitle(context.getString(R.string.inbox_messages_title_single, data["senderName"])) @@ -63,15 +62,19 @@ class ReceivedPrivateMessageLocalNotification(context: Context, identifier: Stri intent.action = actionName intent.putExtra("senderID", senderID) val replyPendingIntent: PendingIntent = - PendingIntent.getBroadcast(context, senderID.hashCode(), - intent, - PendingIntent.FLAG_UPDATE_CURRENT) + PendingIntent.getBroadcast( + context, senderID.hashCode(), + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ) val action: NotificationCompat.Action = - NotificationCompat.Action.Builder(R.drawable.ic_send_grey_600_24dp, - context.getString(R.string.reply), replyPendingIntent) - .addRemoteInput(remoteInput) - .build() + NotificationCompat.Action.Builder( + R.drawable.ic_send_grey_600_24dp, + context.getString(R.string.reply), replyPendingIntent + ) + .addRemoteInput(remoteInput) + .build() notificationBuilder.addAction(action) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/postProcessors/InvertPostProcessor.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/postProcessors/InvertPostProcessor.kt index 0066a8323..7f0b6172e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/postProcessors/InvertPostProcessor.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/postProcessors/InvertPostProcessor.kt @@ -1,2 +1 @@ package com.habitrpg.android.habitica.helpers.postProcessors - 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 f10465a7f..5c6728052 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 @@ -6,18 +6,16 @@ import com.habitrpg.android.habitica.helpers.SoundManager import com.habitrpg.android.habitica.models.responses.TaskScoringResult import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.user.User - -import javax.inject.Inject - import io.reactivex.rxjava3.core.Flowable +import javax.inject.Inject class BuyRewardUseCase @Inject constructor(private val taskRepository: TaskRepository, private val soundManager: SoundManager, postExecutionThread: PostExecutionThread) : UseCase(postExecutionThread) { override fun buildUseCaseObservable(requestValues: RequestValues): Flowable { return taskRepository - .taskChecked(requestValues.user, requestValues.task, false, false, requestValues.notifyFunc) - .doOnNext { soundManager.loadAndPlayAudio(SoundManager.SoundReward) } + .taskChecked(requestValues.user, requestValues.task, false, false, requestValues.notifyFunc) + .doOnNext { soundManager.loadAndPlayAudio(SoundManager.SoundReward) } } 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 1449c8bfd..32fcdb757 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 @@ -3,14 +3,11 @@ package com.habitrpg.android.habitica.interactors import android.app.Activity import android.content.Intent import android.os.Bundle - import com.habitrpg.android.habitica.executors.PostExecutionThread import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity - -import javax.inject.Inject - import io.reactivex.rxjava3.core.Flowable +import javax.inject.Inject class CheckClassSelectionUseCase @Inject constructor(postExecutionThread: PostExecutionThread) : UseCase(postExecutionThread) { @@ -20,8 +17,9 @@ class CheckClassSelectionUseCase @Inject constructor(postExecutionThread: PostEx if (requestValues.currentClass == null) { if (user?.stats?.lvl ?: 0 >= 10 && - user?.preferences?.disableClasses == false && - user.flags?.classSelected == false) { + user?.preferences?.disableClasses == false && + user.flags?.classSelected == false + ) { displayClassSelectionActivity(true, null, requestValues.activity) } } else { 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 fd41a505d..86d0261be 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 @@ -31,8 +31,10 @@ constructor(private val soundManager: SoundManager, postExecutionThread: PostExe if (snackbarText.isNotEmpty()) { GlobalScope.launch(context = Dispatchers.Main) { delay(3000L) - HabiticaSnackbar.showSnackbar(requestValues.snackbarTargetView, - snackbarText, HabiticaSnackbar.SnackbarDisplayType.DROP, true) + HabiticaSnackbar.showSnackbar( + requestValues.snackbarTargetView, + snackbarText, HabiticaSnackbar.SnackbarDisplayType.DROP, true + ) soundManager.loadAndPlayAudio(SoundManager.SoundItemDrop) } } @@ -42,4 +44,4 @@ constructor(private val soundManager: SoundManager, postExecutionThread: PostExe } class RequestValues(val data: TaskScoringResult?, val context: AppCompatActivity, val snackbarTargetView: ViewGroup, val showQuestItems: Boolean) : UseCase.RequestValues -} \ No newline at end of file +} 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 ab8827abb..7753dadce 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 @@ -19,8 +19,11 @@ import org.greenrobot.eventbus.EventBus import javax.inject.Inject class LevelUpUseCase @Inject -constructor(private val soundManager: SoundManager, postExecutionThread: PostExecutionThread, - private val checkClassSelectionUseCase: CheckClassSelectionUseCase) : UseCase(postExecutionThread) { +constructor( + private val soundManager: SoundManager, + postExecutionThread: PostExecutionThread, + private val checkClassSelectionUseCase: CheckClassSelectionUseCase +) : UseCase(postExecutionThread) { override fun buildUseCaseObservable(requestValues: RequestValues): Flowable { return Flowable.defer { @@ -49,9 +52,11 @@ constructor(private val soundManager: SoundManager, postExecutionThread: PostExe } } else { if (suppressedModals?.levelUp == true) { - HabiticaSnackbar.showSnackbar(requestValues.snackbarTargetView, - requestValues.activity.getString(R.string.levelup_header, requestValues.newLevel), - HabiticaSnackbar.SnackbarDisplayType.SUCCESS, true) + HabiticaSnackbar.showSnackbar( + requestValues.snackbarTargetView, + requestValues.activity.getString(R.string.levelup_header, requestValues.newLevel), + HabiticaSnackbar.SnackbarDisplayType.SUCCESS, true + ) return@defer Flowable.just(requestValues.user.stats) } val customView = requestValues.activity.layoutInflater.inflate(R.layout.dialog_levelup, null) @@ -89,7 +94,7 @@ constructor(private val soundManager: SoundManager, postExecutionThread: PostExe private fun showClassSelection(requestValues: RequestValues) { checkClassSelectionUseCase.observable(CheckClassSelectionUseCase.RequestValues(requestValues.user, true, null, requestValues.activity)) - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .subscribe({ }, RxErrorHandler.handleEmptyError()) } class RequestValues(val user: User, val level: Int?, val activity: AppCompatActivity, val snackbarTargetView: ViewGroup) : UseCase.RequestValues { 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 79e51402d..e1eb5a6f7 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 @@ -26,8 +26,11 @@ import javax.inject.Inject import kotlin.math.abs class NotifyUserUseCase @Inject -constructor(postExecutionThread: PostExecutionThread, - private val levelUpUseCase: LevelUpUseCase, private val userRepository: UserRepository) : UseCase(postExecutionThread) { +constructor( + postExecutionThread: PostExecutionThread, + private val levelUpUseCase: LevelUpUseCase, + private val userRepository: UserRepository +) : UseCase(postExecutionThread) { override fun buildUseCaseObservable(requestValues: RequestValues): Flowable { return Flowable.defer { @@ -44,15 +47,15 @@ constructor(postExecutionThread: PostExecutionThread, } if (requestValues.hasLeveledUp == true) { return@defer levelUpUseCase.observable(LevelUpUseCase.RequestValues(requestValues.user, requestValues.level, requestValues.context, requestValues.snackbarTargetView)) - .flatMap { userRepository.retrieveUser(true) } - .map { it.stats } + .flatMap { userRepository.retrieveUser(true) } + .map { it.stats } } else { return@defer Flowable.just(stats) } } } - class RequestValues( val context: AppCompatActivity, 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 + class RequestValues(val context: AppCompatActivity, 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 { @@ -66,27 +69,27 @@ constructor(postExecutionThread: PostExecutionThread, if (xp != null && xp > 0) { container.addView(createTextView(context, xp, HabiticaIconsHelper.imageOfExperience())) } - if (hp != null && hp != 0.0) { + if (hp != null && hp != 0.0) { displayType = SnackbarDisplayType.FAILURE container.addView(createTextView(context, hp, HabiticaIconsHelper.imageOfHeartDarkBg())) } - if (gold != null && gold != 0.0) { + 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) { + if (mp != null && mp > 0 && user?.hasClass() == true) { container.addView(createTextView(context, mp, HabiticaIconsHelper.imageOfMagic())) } - if (questDamage != null && questDamage > 0) { + if (questDamage != null && questDamage > 0) { container.addView(createTextView(context, questDamage, HabiticaIconsHelper.imageOfDamage())) } val padding = context.resources.getDimension(R.dimen.spacing_medium).toInt() (1 until container.childCount) - .map { container.getChildAt(it) } - .forEach { it.setPadding(padding, 0, 0, 0) } + .map { container.getChildAt(it) } + .forEach { it.setPadding(padding, 0, 0, 0) } return Pair(container, displayType) } @@ -133,4 +136,4 @@ constructor(postExecutionThread: PostExecutionThread, return Pair(builder, displayType) } } -} \ No newline at end of file +} 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 0d8afd231..256904488 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 @@ -27,8 +27,10 @@ class ScoreTaskLocallyInteractor { if (task.checklist?.size ?: 0 > 0) { if (task.type == Task.TYPE_TODO) { - nextDelta *= 1 + (task.checklist?.map { if (it.completed) 1 else 0 }?.reduce { _, _ -> 0 } - ?: 0) + nextDelta *= 1 + ( + task.checklist?.map { if (it.completed) 1 else 0 }?.reduce { _, _ -> 0 } + ?: 0 + ) } } @@ -36,15 +38,12 @@ class ScoreTaskLocallyInteractor { } private fun scoreHabit(user: User, task: Task, direction: TaskDirection) { - } private fun scoreDaily(user: User, task: Task, direction: TaskDirection) { - } private fun scoreToDo(user: User, task: Task, direction: TaskDirection) { - } fun score(user: User, task: Task, direction: TaskDirection): TaskDirectionData? { @@ -98,8 +97,10 @@ class ScoreTaskLocallyInteractor { private fun addPoints(result: TaskDirectionData, delta: Double, stats: Stats, computedStats: Stats, task: Task, direction: TaskDirection) { val intBonus = 1f + ((computedStats.intelligence?.toFloat() ?: 0f) * 0.025f) - result.exp = (stats.exp - ?: 0.0) + (delta * intBonus * task.priority * 6).roundToLong().toDouble() + result.exp = ( + stats.exp + ?: 0.0 + ) + (delta * intBonus * task.priority * 6).roundToLong().toDouble() val perBonus = 1f + ((computedStats.per?.toFloat() ?: 0f) * 0.02f) val goldMod = delta * task.priority * perBonus @@ -155,4 +156,4 @@ class ScoreTaskLocallyInteractor { return stats } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Avatar.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Avatar.kt index 24e37bd57..5b6531c8a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Avatar.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Avatar.kt @@ -18,4 +18,4 @@ interface Avatar { val equipped: Outfit? fun hasClass(): Boolean fun isValid(): Boolean -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/AvatarPreferences.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/AvatarPreferences.kt index eae8e60ec..b576faef8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/AvatarPreferences.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/AvatarPreferences.kt @@ -12,4 +12,4 @@ interface AvatarPreferences { val background: String? val chair: String? val disableClasses: Boolean -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/BaseObject.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/BaseObject.kt index 72ec49f7d..eb1ff632b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/BaseObject.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/BaseObject.kt @@ -2,10 +2,10 @@ package com.habitrpg.android.habitica.models import io.realm.RealmModel -interface BaseObject: RealmModel +interface BaseObject : RealmModel -interface BaseMainObject: BaseObject { +interface BaseMainObject : BaseObject { val realmClass: Class val primaryIdentifier: String? val primaryIdentifierName: String -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/ContentGear.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/ContentGear.kt index c08ffe460..9806544c3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/ContentGear.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/ContentGear.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.models import com.habitrpg.android.habitica.models.inventory.Equipment - import io.realm.RealmList class ContentGear { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/ContentResult.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/ContentResult.kt index a69401b18..54182fedd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/ContentResult.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/ContentResult.kt @@ -22,4 +22,3 @@ class ContentResult { var faq = RealmList() var special = RealmList() } - diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/IAPGift.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/IAPGift.kt index 2ad438328..c912c79c1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/IAPGift.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/IAPGift.kt @@ -2,4 +2,4 @@ package com.habitrpg.android.habitica.models class IAPGift { var uuid: String? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Notification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Notification.kt index 5ccf6e63b..76f1e205f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Notification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Notification.kt @@ -15,7 +15,7 @@ class Notification { UNALLOCATED_STATS_POINTS("UNALLOCATED_STATS_POINTS"), WON_CHALLENGE("WON_CHALLENGE"), - //Achievements + // Achievements ACHIEVEMENT_PARTY_UP("ACHIEVEMENT_PARTY_UP"), ACHIEVEMENT_PARTY_ON("ACHIEVEMENT_PARTY_ON"), ACHIEVEMENT_BEAST_MASTER("ACHIEVEMENT_BEAST_MASTER"), @@ -104,21 +104,21 @@ class Notification { Type.ACHIEVEMENT_SKELETON_CREW.type -> AchievementData::class.java Type.ACHIEVEMENT_SEEING_RED.type -> AchievementData::class.java Type.ACHIEVEMENT_RED_LETTER_DAY.type -> AchievementData::class.java - + else -> null } } val priority: Int - get() { - return when (type) { - Type.NEW_STUFF.type -> 1 - Type.GUILD_INVITATION.type -> 2 - Type.PARTY_INVITATION.type -> 3 - Type.UNALLOCATED_STATS_POINTS.type -> 4 - Type.NEW_MYSTERY_ITEMS.type -> 5 - Type.NEW_CHAT_MESSAGE.type -> 6 - else -> 100 + get() { + return when (type) { + Type.NEW_STUFF.type -> 1 + Type.GUILD_INVITATION.type -> 2 + Type.PARTY_INVITATION.type -> 3 + Type.UNALLOCATED_STATS_POINTS.type -> 4 + Type.NEW_MYSTERY_ITEMS.type -> 5 + Type.NEW_CHAT_MESSAGE.type -> 6 + else -> 100 + } } - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/PurchaseValidationRequest.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/PurchaseValidationRequest.kt index 9772d28eb..9489f8230 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/PurchaseValidationRequest.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/PurchaseValidationRequest.kt @@ -5,4 +5,3 @@ class PurchaseValidationRequest { var transaction: Transaction? = null var gift: IAPGift? = null } - diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/PurchaseValidationResult.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/PurchaseValidationResult.kt index 7ae6c5f5a..88e03f365 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/PurchaseValidationResult.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/PurchaseValidationResult.kt @@ -3,4 +3,4 @@ package com.habitrpg.android.habitica.models class PurchaseValidationResult { var ok = false var data: Any? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/PushDevice.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/PushDevice.kt index 33a32afe9..01326369b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/PushDevice.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/PushDevice.kt @@ -11,4 +11,4 @@ class PushDevice { @SerializedName("type") @Expose var type: String? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/QuestAchievement.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/QuestAchievement.kt index 0f752a6a5..bcecf9e39 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/QuestAchievement.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/QuestAchievement.kt @@ -4,15 +4,15 @@ import io.realm.RealmObject import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey -open class QuestAchievement: RealmObject(), BaseObject { +open class QuestAchievement : RealmObject(), BaseObject { @PrimaryKey var combinedKey: String? = null var questKey: String? = null - set(value) { - field = value - combinedKey = userID + questKey - } + set(value) { + field = value + combinedKey = userID + questKey + } var userID: String? = null set(value) { field = value 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 fe08353a2..7848dcb19 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.models - class SetupCustomization { var key: String = "" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Skill.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Skill.kt index 0e7446cd1..35192789f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Skill.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Skill.kt @@ -1,10 +1,8 @@ package com.habitrpg.android.habitica.models - import io.realm.RealmObject import io.realm.annotations.PrimaryKey - open class Skill : RealmObject(), BaseObject { @PrimaryKey diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/SubscriptionValidationRequest.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/SubscriptionValidationRequest.kt index 010928519..ad461f6af 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/SubscriptionValidationRequest.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/SubscriptionValidationRequest.kt @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.models - class SubscriptionValidationRequest { var transaction: Transaction? = null var sku: String? = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.kt index eb0bb7ba5..123b344c4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.models import com.habitrpg.android.habitica.models.tasks.Task - import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -20,7 +19,6 @@ open class Tag : RealmObject(), BaseObject { return tasks } - override fun equals(other: Any?): Boolean { if (other is Tag) { return this.id == other.id diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/TeamPlan.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/TeamPlan.kt index ee79cf8a4..84cd7c2ce 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/TeamPlan.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/TeamPlan.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.models import com.google.gson.annotations.SerializedName -import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -13,7 +12,7 @@ open class TeamPlan : RealmObject(), BaseObject { var summary: String = "" @SerializedName("leader") var leaderID: String? = null - //var managers: RealmList = RealmList() + // var managers: RealmList = RealmList() var isActive: Boolean = false override fun equals(other: Any?): Boolean { 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 ff743b5f2..cf7480148 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 @@ -2,12 +2,11 @@ package com.habitrpg.android.habitica.models import io.realm.RealmModel import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass import java.util.* @RealmClass(embedded = true) -open class TutorialStep: RealmObject(), BaseMainObject { +open class TutorialStep : RealmObject(), BaseMainObject { var key: String? = null var tutorialGroup: String? = null @@ -24,7 +23,7 @@ open class TutorialStep: RealmObject(), BaseMainObject { var displayedOn: Date? = null fun shouldDisplay(): Boolean = - !this.wasCompleted && (this.displayedOn == null || Date().time - (displayedOn?.time ?: 0) > 86400000) + !this.wasCompleted && (this.displayedOn == null || Date().time - (displayedOn?.time ?: 0) > 86400000) override val realmClass: Class get() = TutorialStep::class.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldState.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldState.kt index 65d0c14c7..570e2a6db 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldState.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldState.kt @@ -4,12 +4,11 @@ import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.inventory.QuestProgress import com.habitrpg.android.habitica.models.inventory.QuestRageStrike import io.realm.RealmList -import io.realm.RealmModel import io.realm.RealmObject import io.realm.annotations.PrimaryKey import java.util.* -open class WorldState: RealmObject(), BaseObject { +open class WorldState : RealmObject(), BaseObject { @PrimaryKey var id = "habitica" var worldBossKey: String = "" @@ -22,4 +21,4 @@ open class WorldState: RealmObject(), BaseObject { var currentEvent: WorldStateEvent? = null @SerializedName("currentEventList") var events: RealmList = RealmList() -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldStateEvent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldStateEvent.kt index 71ce561f4..b5c2e6b57 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldStateEvent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldStateEvent.kt @@ -3,17 +3,16 @@ package com.habitrpg.android.habitica.models import com.google.gson.annotations.SerializedName import io.realm.RealmModel import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass import java.util.* @RealmClass(embedded = true) -open class WorldStateEvent: RealmObject(), BaseMainObject { +open class WorldStateEvent : RealmObject(), BaseMainObject { val isCurrentlyActive: Boolean - get() { - val now = Date() - return (start?.before(now) == true) && (end?.after(now) == true) - } + get() { + val now = Date() + return (start?.before(now) == true) && (end?.after(now) == true) + } @SerializedName("event") var eventKey: String? = null @@ -30,4 +29,4 @@ open class WorldStateEvent: RealmObject(), BaseMainObject { get() = eventKey override val primaryIdentifierName: String get() = "eventKey" -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/LocalAuthentication.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/LocalAuthentication.kt index b6b80edf9..b233866fc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/LocalAuthentication.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/LocalAuthentication.kt @@ -2,11 +2,10 @@ package com.habitrpg.android.habitica.models.auth import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) open class LocalAuthentication : RealmObject(), BaseObject { var username: String? = null var email: String? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuth.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuth.kt index c2d34a203..584b5cc27 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuth.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuth.kt @@ -5,4 +5,4 @@ class UserAuth { var password: String? = null var confirmPassword: String? = null var email: String? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.kt index d788e8c6f..29af565a6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.kt @@ -1,7 +1,7 @@ package com.habitrpg.android.habitica.models.auth class UserAuthResponse { - //we need apiToken and token, as both are possible returns + // we need apiToken and token, as both are possible returns var apiToken: String = "" var token: String get() { @@ -12,4 +12,4 @@ class UserAuthResponse { } var newUser = false var id: String = "" -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthSocial.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthSocial.kt index dcbc2e155..8262c130d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthSocial.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthSocial.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.models.auth - class UserAuthSocial { var network: String? = null var authResponse: UserAuthSocialTokens? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthSocialTokens.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthSocialTokens.kt index a157dbb22..1e8dad8dd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthSocialTokens.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthSocialTokens.kt @@ -3,4 +3,4 @@ package com.habitrpg.android.habitica.models.auth class UserAuthSocialTokens { var client_id: String? = null var access_token: String? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Animal.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Animal.kt index 47a7e5255..11de86c15 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Animal.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Animal.kt @@ -9,4 +9,4 @@ interface Animal { var premium: Boolean var numberOwned: Int var totalNumber: Int -} \ No newline at end of file +} 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 bece8280a..af9025915 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 @@ -9,10 +9,10 @@ open class Customization : RealmObject(), BaseObject { @PrimaryKey var id: String? = null var identifier: String? = null - set(value) { - field = value - updateID() - } + set(value) { + field = value + updateID() + } var category: String? = null set(value) { field = value @@ -36,11 +36,11 @@ open class Customization : RealmObject(), BaseObject { id = identifier + "_" + type + "_" + this.category } - //Not released yet + // Not released yet val purchasable: Boolean get() { val today = Date() - if (availableFrom != null && !availableFrom!!.before(today)) { //Not released yet + if (availableFrom != null && !availableFrom!!.before(today)) { // Not released yet return false } return !(availableUntil != null && !availableUntil!!.after(today)) @@ -86,4 +86,4 @@ open class Customization : RealmObject(), BaseObject { path = "$path.$identifier" return path } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/CustomizationSet.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/CustomizationSet.kt index aa4ca8b4a..415f3ef7f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/CustomizationSet.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/CustomizationSet.kt @@ -6,4 +6,4 @@ class CustomizationSet { var price: Int = 0 var hasPurchasable = false var customizations: MutableList = mutableListOf() -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Egg.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Egg.kt index b650d1ce9..efbe84606 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Egg.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Egg.kt @@ -16,4 +16,4 @@ open class Egg : RealmObject(), Item { override val type: String get() = "eggs" -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Equipment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Equipment.kt index 73ccdddb2..be9f35ae6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Equipment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Equipment.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.BaseObject - import io.realm.RealmObject import io.realm.annotations.PrimaryKey diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Food.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Food.kt index 2cd03c870..a5810f493 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Food.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Food.kt @@ -16,4 +16,4 @@ open class Food : RealmObject(), Item { var canDrop: Boolean? = null override val type: String get() = "food" -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/HatchingPotion.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/HatchingPotion.kt index 9c287c07a..ef5c56047 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/HatchingPotion.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/HatchingPotion.kt @@ -15,4 +15,4 @@ open class HatchingPotion : RealmObject(), Item { var premium: Boolean? = null override val type: String get() = "hatchingPotions" -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Item.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Item.kt index a019a54af..426bbbc94 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Item.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Item.kt @@ -10,11 +10,10 @@ open class ItemEvent : RealmObject(), BaseObject { var end: Date? = null } - interface Item : RealmModel { val type: String val key: String val text: String val value: Int var event: ItemEvent? -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Mount.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Mount.kt index 3e4386536..6f2f30cb3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Mount.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Mount.kt @@ -23,9 +23,8 @@ open class Mount : RealmObject(), Animal { override var type: String? = null override var premium = false - @Ignore override var numberOwned: Int = 0 @Ignore override var totalNumber: Int = 0 -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Pet.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Pet.kt index 7d2d69566..ae66e9716 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Pet.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Pet.kt @@ -8,17 +8,17 @@ open class Pet : RealmObject(), Animal { @PrimaryKey override var key: String? = null override var animal: String = "" - get() { - return if (field.isBlank()) { - key?.split("-")?.toTypedArray()?.get(0) ?: "" - } else field - } + get() { + return if (field.isBlank()) { + key?.split("-")?.toTypedArray()?.get(0) ?: "" + } else field + } override var color: String = "" - get() { - return if (field.isBlank()) { - key?.split("-")?.toTypedArray()?.get(1) ?: "" - } else field - } + get() { + return if (field.isBlank()) { + key?.split("-")?.toTypedArray()?.get(1) ?: "" + } else field + } override var text: String? = null override var type: String? = null override var premium = false @@ -27,4 +27,4 @@ open class Pet : RealmObject(), Animal { override var numberOwned: Int = 0 @Ignore override var totalNumber: Int = 0 -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.kt index 198c44b6b..d34a9ae5c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.members.Member - import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -10,15 +9,15 @@ import io.realm.annotations.PrimaryKey open class Quest : RealmObject(), BaseObject { @PrimaryKey var id: String? = null - set(value) { - field = value - progress?.id = value - } + set(value) { + field = value + progress?.id = value + } var key: String = "" - set(value) { - field = value - progress?.key = key - } + set(value) { + field = value + progress?.key = key + } var active: Boolean = false var leader: String? = null var RSVPNeeded: Boolean = false @@ -43,7 +42,7 @@ open class Quest : RealmObject(), BaseObject { } val activeRageStrikeNumber: Int - get() { - return rageStrikes?.filter { it.wasHit }?.size ?: 0 - } -} \ No newline at end of file + get() { + return rageStrikes?.filter { it.wasHit }?.size ?: 0 + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestBoss.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestBoss.kt index 2efcbd5d8..55672d674 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestBoss.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestBoss.kt @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.models.inventory - import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -9,10 +8,10 @@ open class QuestBoss : RealmObject(), BaseObject { @PrimaryKey var key: String? = null - set(value) { - field = value - rage?.key = key - } + set(value) { + field = value + rage?.key = key + } var name: String? = null var hp: Int = 0 var str: Float = 0.toFloat() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestCollect.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestCollect.kt index 7aa1ea98d..5fdba5d4d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestCollect.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestCollect.kt @@ -9,4 +9,4 @@ open class QuestCollect : RealmObject(), BaseObject { var key: String? = null var text: String? = null var count = 0 -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt index a43ac5708..2f897b7a7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt @@ -8,12 +8,12 @@ open class QuestContent : RealmObject(), Item { @PrimaryKey override var key: String = "" - set(value) { - field = value - drop?.key = value - colors?.key = value - boss?.key = value - } + set(value) { + field = value + drop?.key = value + colors?.key = value + boss?.key = value + } override var text: String = "" var notes: String = "" var completion: String = "" @@ -51,7 +51,7 @@ open class QuestContent : RealmObject(), Item { get() = this.boss != null override val type: String - get() = "quests" + get() = "quests" fun getCollectWithKey(key: String?): QuestCollect? { for (collect in this.collect ?: emptyList()) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestDropItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestDropItem.kt index 8be7de2cf..41ef17965 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestDropItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestDropItem.kt @@ -8,15 +8,15 @@ open class QuestDropItem : RealmObject(), BaseObject { @PrimaryKey var combinedKey: String? = null var questKey: String? = null - set(value) { - field = value - combinedKey = value + key - } + set(value) { + field = value + combinedKey = value + key + } var key: String = "" - set(value) { - field = value - combinedKey = questKey + value - } + set(value) { + field = value + combinedKey = questKey + value + } var type: String? = null var text: String? = null var onlyOwner = false @@ -24,10 +24,10 @@ open class QuestDropItem : RealmObject(), BaseObject { val imageName: String get() = when (type) { - "quests" -> "inventory_quest_scroll_$key" - "eggs" -> "Pet_Egg_$key" - "food" -> "Pet_Food_$key" - "hatchingPotions" -> "Pet_HatchingPotion_$key" - else -> "shop_$key" - } -} \ No newline at end of file + "quests" -> "inventory_quest_scroll_$key" + "eggs" -> "Pet_Egg_$key" + "food" -> "Pet_Food_$key" + "hatchingPotions" -> "Pet_HatchingPotion_$key" + else -> "shop_$key" + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestDrops.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestDrops.kt index a6116dc7e..ad6fad704 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestDrops.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestDrops.kt @@ -11,16 +11,16 @@ import io.realm.annotations.PrimaryKey open class QuestDrops : RealmObject(), BaseObject { @PrimaryKey var key: String? = null - set(value) { - field = value - items?.forEach { it.questKey = key } - } + set(value) { + field = value + items?.forEach { it.questKey = key } + } var gp = 0 var exp = 0 var unlock: String? = null var items: RealmList? = null - set(value) { - field = value - items?.forEach { it.questKey = key } - } -} \ No newline at end of file + set(value) { + field = value + items?.forEach { it.questKey = key } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestMember.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestMember.kt index 97a8761ca..1de42cbfd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestMember.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestMember.kt @@ -8,4 +8,4 @@ open class QuestMember : RealmObject(), BaseObject { @PrimaryKey var key: String? = null var isParticipating: Boolean? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestProgress.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestProgress.kt index 7303f2453..76c8a4ef0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestProgress.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestProgress.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.inventory import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestProgressCollect.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestProgressCollect.kt index 9349fd6d1..407b93d0c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestProgressCollect.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestProgressCollect.kt @@ -2,11 +2,10 @@ package com.habitrpg.android.habitica.models.inventory import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) open class QuestProgressCollect : RealmObject(), BaseObject { var key: String? = null var count = 0 -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestRageStrike.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestRageStrike.kt index b6c79a7ec..5a2291c5a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestRageStrike.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestRageStrike.kt @@ -10,10 +10,8 @@ open class QuestRageStrike() : RealmObject(), BaseObject { var key = "" var wasHit = false - - constructor(key: String, wasHit: Boolean): this() { + constructor(key: String, wasHit: Boolean) : this() { this.key = key this.wasHit = wasHit } } - diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/SpecialItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/SpecialItem.kt index 79ddc50ca..061955b30 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/SpecialItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/SpecialItem.kt @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.models.inventory - import android.content.Context import com.habitrpg.android.habitica.R import io.realm.RealmObject diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/StableSection.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/StableSection.kt index a8b390a9d..63fc5f5a0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/StableSection.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/StableSection.kt @@ -4,4 +4,4 @@ class StableSection(val key: Any?, val text: String) { var ownedCount = 0 var totalCount = 0 -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/GuildInvite.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/GuildInvite.kt index ddb46cae5..c1ea1009d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/GuildInvite.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/GuildInvite.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.models.invitations import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/Invitations.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/Invitations.kt index e211a1e51..b27a992b6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/Invitations.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/Invitations.kt @@ -1,11 +1,8 @@ package com.habitrpg.android.habitica.models.invitations import com.habitrpg.android.habitica.models.BaseObject -import com.habitrpg.android.habitica.models.user.User - import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/PartyInvite.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/PartyInvite.kt index 697afab0b..51997bda4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/PartyInvite.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/invitations/PartyInvite.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.models.invitations import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/Member.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/Member.kt index 280a9a085..c983e160a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/Member.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/Member.kt @@ -5,7 +5,6 @@ import com.habitrpg.android.habitica.models.Avatar import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.social.UserParty import com.habitrpg.android.habitica.models.user.* - import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -47,7 +46,7 @@ open class Member : RealmObject(), Avatar, BaseObject { get() = this.items?.mounts?.size ?: 0 val username: String? - get() = authentication?.localAuthentication?.username + get() = authentication?.localAuthentication?.username val formattedUsername: String? get() = if (username != null) "@$username" else null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/MemberPreferences.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/MemberPreferences.kt index 7ccc07a2f..452ff4ca9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/MemberPreferences.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/MemberPreferences.kt @@ -1,11 +1,8 @@ package com.habitrpg.android.habitica.models.members - import com.habitrpg.android.habitica.models.AvatarPreferences import com.habitrpg.android.habitica.models.user.Hair - import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -20,14 +17,13 @@ open class MemberPreferences : RealmObject(), AvatarPreferences { override var size: String? = null override var background: String? = null override var chair: String? = null - get() { - return if (field != null && field != "none") { - if (field!!.length > 5 && field?.substring(0, 6) != "chair_") { - field - } else { - "chair_$field" - } - } else null - } - + get() { + return if (field != null && field != "none") { + if (field!!.length > 5 && field?.substring(0, 6) != "chair_") { + field + } else { + "chair_$field" + } + } else null + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/PlayerTier.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/PlayerTier.kt index a33f34233..802a6dc35 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/PlayerTier.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/PlayerTier.kt @@ -9,15 +9,15 @@ class PlayerTier(val title: String, val id: Int) { companion object { fun getTiers(): List { return arrayListOf( - PlayerTier("Tier 1 (Friend)", 1), - PlayerTier("Tier 2 (Friend)", 2), - PlayerTier("Tier 3 (Elite)", 3), - PlayerTier("Tier 4 (Elite)", 4), - PlayerTier("Tier 5 (Champion)", 5), - PlayerTier("Tier 6 (Champion)", 6), - PlayerTier("Tier 7 (Legendary)", 7), - PlayerTier("Moderator (Guardian)", 8), - PlayerTier("Staff (Heroic)", 9) + PlayerTier("Tier 1 (Friend)", 1), + PlayerTier("Tier 2 (Friend)", 2), + PlayerTier("Tier 3 (Elite)", 3), + PlayerTier("Tier 4 (Elite)", 4), + PlayerTier("Tier 5 (Champion)", 5), + PlayerTier("Tier 6 (Champion)", 6), + PlayerTier("Tier 7 (Legendary)", 7), + PlayerTier("Moderator (Guardian)", 8), + PlayerTier("Staff (Heroic)", 9) ) } @@ -36,4 +36,4 @@ class PlayerTier(val title: String, val id: Int) { } } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/FirstDropData.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/FirstDropData.kt index a9104de60..418675e39 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/FirstDropData.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/FirstDropData.kt @@ -4,5 +4,4 @@ open class FirstDropData : NotificationData { var egg: String? = null var hatchingPotion: String? = null - } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/GuildInvitationData.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/GuildInvitationData.kt index 67fc11c6a..fa87bcf28 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/GuildInvitationData.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/GuildInvitationData.kt @@ -5,5 +5,4 @@ import com.habitrpg.android.habitica.models.invitations.GuildInvite open class GuildInvitationData : NotificationData { var invitation: GuildInvite? = null - } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/LoginIncentiveData.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/LoginIncentiveData.kt index 7125e4a38..ea73f11ac 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/LoginIncentiveData.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/LoginIncentiveData.kt @@ -7,5 +7,4 @@ open class LoginIncentiveData : NotificationData { var rewardText: String? = null var rewardKey: List? = null var reward: List? = null - } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/PartyInvitationData.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/PartyInvitationData.kt index 894303781..77e2783e3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/PartyInvitationData.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/PartyInvitationData.kt @@ -5,5 +5,4 @@ import com.habitrpg.android.habitica.models.invitations.PartyInvite open class PartyInvitationData : NotificationData { var invitation: PartyInvite? = null - } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/QuestInvitationData.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/QuestInvitationData.kt index 0b8c4e015..b06ff34e3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/QuestInvitationData.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/QuestInvitationData.kt @@ -3,5 +3,4 @@ package com.habitrpg.android.habitica.models.notifications open class QuestInvitationData : NotificationData { var questKey: String? = null - } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/Reward.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/Reward.kt index 165d46669..563edec1c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/Reward.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/Reward.kt @@ -2,4 +2,4 @@ package com.habitrpg.android.habitica.models.notifications class Reward { var key: String? = null -} \ No newline at end of file +} 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 72eac86e4..d35cb5401 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 @@ -37,12 +37,12 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic override fun promoBackgroundDrawable(context: Context): Drawable { return ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_gray_10) - ?: ShapeDrawable() + ?: ShapeDrawable() } override fun buttonDrawable(context: Context): Drawable { return ContextCompat.getDrawable(context, R.drawable.fall_promo_button_bg) - ?: ShapeDrawable() + ?: ShapeDrawable() } override fun configurePromoMenuView(view: PromoMenuView) { @@ -54,8 +54,8 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic 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_left), + ContextCompat.getDrawable(context, R.drawable.fall_promo_menu_right) ) view.binding.button.backgroundTintList = ContextCompat.getColorStateList(context, R.color.gray_1) @@ -78,9 +78,11 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic binding.promoBannerRightImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.fall_promo_banner_right)) binding.promoBannerTitleImage.setImageDrawable(ContextCompat.getDrawable(context, 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)) + binding.promoBannerDurationView.text = context.getString( + R.string.x_to_y, + formatter.format(startDate), + formatter.format(endDate) + ) binding.promoBannerDurationView.setTextColor(Color.parseColor("#FEE2B6")) } @@ -92,18 +94,20 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic binding.root.background = promoBackgroundDrawable(context) binding.purchaseButton.background = buttonDrawable(context) val colors = listOf( - ContextCompat.getColor(context, R.color.red_10), - ContextCompat.getColor(context, R.color.blue_50), - ContextCompat.getColor(context, R.color.green_50), - ContextCompat.getColor(context, R.color.brand_300) + ContextCompat.getColor(context, R.color.red_10), + ContextCompat.getColor(context, R.color.blue_50), + ContextCompat.getColor(context, R.color.green_50), + ContextCompat.getColor(context, R.color.brand_300) ).shuffled() - val drawable = BitmapDrawable(context.resources, - HabiticaIconsHelper.imageOfFallGemPromoBG( - colors[0], - colors[1], - colors[2], - colors[3] - )) + val drawable = BitmapDrawable( + context.resources, + HabiticaIconsHelper.imageOfFallGemPromoBG( + colors[0], + colors[1], + colors[2], + colors[3] + ) + ) binding.amountBackgroundLeft.background = drawable binding.amountBackgroundRight.background = drawable binding.gemAmount.setTextColor(Color.parseColor("#FEE2B6")) @@ -128,9 +132,11 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic fragment.binding?.promoBannerSubtitleView?.setText(R.string.limited_event) fragment.binding?.promoBannerDurationView?.setTextColor(Color.parseColor("#FEE2B6")) val formatter = SimpleDateFormat("MMM d", Locale.getDefault()) - fragment.binding?.promoBannerDurationView?.text = context.getString(R.string.x_to_y, - formatter.format(startDate), - formatter.format(endDate)) + fragment.binding?.promoBannerDurationView?.text = context.getString( + R.string.x_to_y, + formatter.format(startDate), + formatter.format(endDate) + ) fragment.binding?.promoBannerDurationView?.setTextColor(ContextCompat.getColor(context, R.color.white)) fragment.binding?.promptText?.setText(R.string.fall_promo_info_prompt) fragment.binding?.promptText?.setTextColor(Color.parseColor("#F78E2F")) @@ -143,4 +149,4 @@ class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic val limitationsFormatter = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.LONG, SimpleDateFormat.LONG) fragment.binding?.limitationsDescriptionView?.text = context.getString(R.string.gems_promo_info_limitations, limitationsFormatter.format(startDate), limitationsFormatter.format(endDate)) } -} \ No newline at end of file +} 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 997ce0335..6ac2b16d2 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 @@ -1,8 +1,6 @@ package com.habitrpg.android.habitica.models.promotions import android.content.Context -import android.graphics.Color -import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.ShapeDrawable import android.view.View @@ -16,7 +14,6 @@ import com.habitrpg.android.habitica.extensions.isUsingNightModeResources import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment -import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView import java.text.SimpleDateFormat import java.util.* @@ -39,12 +36,12 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic override fun promoBackgroundDrawable(context: Context): Drawable { return ContextCompat.getDrawable(context, R.drawable.g1g1_promo_background) - ?: ShapeDrawable() + ?: ShapeDrawable() } override fun buttonDrawable(context: Context): Drawable { return ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_content) - ?: ShapeDrawable() + ?: ShapeDrawable() } override fun configurePromoMenuView(view: PromoMenuView) { @@ -54,8 +51,8 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic view.setSubtitleText(context.getString(R.string.promo_g1g1_description)) 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_left), + ContextCompat.getDrawable(context, R.drawable.g1g1_promo_menu_right) ) view.binding.button.backgroundTintList = ContextCompat.getColorStateList(context, R.color.content_background) @@ -113,9 +110,11 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic fragment.binding?.promoBannerTitleText?.text = context.getString(R.string.gift_one_get_one) fragment.binding?.promoBannerSubtitleView?.setText(R.string.limited_event) val formatter = SimpleDateFormat("MMM d", Locale.getDefault()) - fragment.binding?.promoBannerDurationView?.text = context.getString(R.string.x_to_y, - formatter.format(startDate), - formatter.format(endDate)) + fragment.binding?.promoBannerDurationView?.text = context.getString( + R.string.x_to_y, + formatter.format(startDate), + formatter.format(endDate) + ) fragment.binding?.promoBannerDurationView?.setTextColor(ContextCompat.getColor(context, R.color.white)) fragment.binding?.promptText?.setText(R.string.g1g1_promo_info_prompt) fragment.binding?.promptText?.setTextColor(ContextCompat.getColor(context, R.color.text_teal)) @@ -130,4 +129,4 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic val limitationsFormatter = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.LONG, SimpleDateFormat.LONG) fragment.binding?.limitationsDescriptionView?.text = context.getString(R.string.g1g1_promo_info_limitations, limitationsFormatter.format(startDate), limitationsFormatter.format(endDate)) } -} \ No newline at end of file +} 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 0492ca3e3..0c145f841 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 @@ -49,7 +49,6 @@ fun getHabiticaPromotionFromKey(key: String, startDate: Date?, endDate: Date?): } } - interface HabiticaWebPromotion { var url: String? -} \ No newline at end of file +} 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 c37289e1e..7d8f89c5a 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 @@ -37,12 +37,12 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit override fun promoBackgroundDrawable(context: Context): Drawable { return ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_gray_10) - ?: ShapeDrawable() + ?: ShapeDrawable() } override fun buttonDrawable(context: Context): Drawable { return ContextCompat.getDrawable(context, R.drawable.spooky_promo_button_bg) - ?: ShapeDrawable() + ?: ShapeDrawable() } override fun configurePromoMenuView(view: PromoMenuView) { @@ -54,8 +54,8 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit 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_left), + ContextCompat.getDrawable(context, R.drawable.spooky_promo_menu_right) ) view.binding.button.backgroundTintList = ContextCompat.getColorStateList(context, R.color.gray_1) @@ -78,9 +78,11 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit binding.promoBannerRightImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.spooky_promo_banner_right)) binding.promoBannerTitleImage.setImageDrawable(ContextCompat.getDrawable(context, 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)) + binding.promoBannerDurationView.text = context.getString( + R.string.x_to_y, + formatter.format(startDate), + formatter.format(endDate) + ) binding.promoBannerDurationView.setTextColor(ContextCompat.getColor(context, R.color.white)) } @@ -91,8 +93,10 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit val context = binding.root.context binding.root.background = promoBackgroundDrawable(context) binding.purchaseButton.background = buttonDrawable(context) - val drawable = BitmapDrawable(context.resources, - HabiticaIconsHelper.imageOfSpookyGemPromoBG()) + val drawable = BitmapDrawable( + context.resources, + HabiticaIconsHelper.imageOfSpookyGemPromoBG() + ) binding.amountBackgroundLeft.background = drawable binding.amountBackgroundRight.background = drawable binding.gemAmount.setTextColor(Color.parseColor("#FEE2B6")) @@ -117,9 +121,11 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit fragment.binding?.promoBannerSubtitleView?.setText(R.string.limited_event) fragment.binding?.promoBannerDurationView?.setTextColor(ContextCompat.getColor(context, 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)) + fragment.binding?.promoBannerDurationView?.text = context.getString( + R.string.x_to_y, + formatter.format(startDate), + formatter.format(endDate) + ) fragment.binding?.promoBannerDurationView?.setTextColor(ContextCompat.getColor(context, R.color.white)) fragment.binding?.promptText?.setText(R.string.spooky_promo_info_prompt) fragment.binding?.promptText?.setTextColor(ContextCompat.getColor(context, R.color.orange_50)) @@ -130,5 +136,6 @@ class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : Habit fragment.binding?.instructionDescriptionView?.text = context.getString(R.string.spooky_promo_info_instructions, formatter.format(startDate), formatter.format(endDate)) val limitationsFormatter = SimpleDateFormat.getDateTimeInstance() - fragment.binding?.limitationsDescriptionView?.text = context.getString(R.string.gems_promo_info_limitations, limitationsFormatter.format(startDate), limitationsFormatter.format(endDate)) } -} \ No newline at end of file + fragment.binding?.limitationsDescriptionView?.text = context.getString(R.string.gems_promo_info_limitations, limitationsFormatter.format(startDate), limitationsFormatter.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 c401b749a..8cd972ff2 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 @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.promotions import android.content.Context import android.graphics.drawable.Drawable import android.graphics.drawable.ShapeDrawable -import android.view.View import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.FragmentGemPurchaseBinding @@ -35,12 +34,12 @@ class Survey2021Promotion : HabiticaPromotion(), HabiticaWebPromotion { override fun promoBackgroundDrawable(context: Context): Drawable { return ContextCompat.getDrawable(context, R.drawable.g1g1_promo_background) - ?: ShapeDrawable() + ?: ShapeDrawable() } override fun buttonDrawable(context: Context): Drawable { return ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_content) - ?: ShapeDrawable() + ?: ShapeDrawable() } override fun configurePromoMenuView(view: PromoMenuView) { @@ -52,8 +51,8 @@ class Survey2021Promotion : HabiticaPromotion(), HabiticaWebPromotion { view.setSubtitleText(context.getString(R.string.survey_menu_description)) 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_left), + ContextCompat.getDrawable(context, R.drawable.survey_art_right) ) view.binding.button.backgroundTintList = ContextCompat.getColorStateList(context, R.color.white) @@ -79,4 +78,4 @@ class Survey2021Promotion : HabiticaPromotion(), HabiticaWebPromotion { override fun configureInfoFragment(fragment: PromoInfoFragment) { } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/BulkTaskScoringData.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/BulkTaskScoringData.kt index 425b8dfcc..54df94739 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/BulkTaskScoringData.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/BulkTaskScoringData.kt @@ -25,4 +25,4 @@ class BulkTaskScoringData { var hp: Double? = null var tasks: List = listOf() -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/ErrorResponse.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/ErrorResponse.kt index 5a6cb231c..12eed50b1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/ErrorResponse.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/ErrorResponse.kt @@ -13,4 +13,4 @@ class ErrorResponse { } return message ?: "" } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/FeedResponse.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/FeedResponse.kt index 4d9461077..381f53638 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/FeedResponse.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/FeedResponse.kt @@ -3,4 +3,4 @@ package com.habitrpg.android.habitica.models.responses class FeedResponse { var value: Int? = null var message: String? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/HabitResponse.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/HabitResponse.kt index 5f2af06f2..607f69384 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/HabitResponse.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/HabitResponse.kt @@ -7,4 +7,4 @@ class HabitResponse { var notifications: List? = null var success: Boolean? = null var message: String? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/HabiticaError.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/HabiticaError.kt index f22637273..577ff6459 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/HabiticaError.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/HabiticaError.kt @@ -4,4 +4,4 @@ class HabiticaError { var message: String? = null var param: String? = null var value: String? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/SkillResponse.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/SkillResponse.kt index bd35edcd1..b7427e37c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/SkillResponse.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/SkillResponse.kt @@ -10,4 +10,4 @@ class SkillResponse { var hpDiff = 0.0 var goldDiff = 0.0 var damage = 0.0f -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskDirectionData.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskDirectionData.kt index 13c8412bd..44b1db758 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskDirectionData.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskDirectionData.kt @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.models.responses - class TaskDirectionData { var delta: Float = 0.toFloat() var _tmp: TaskDirectionDataTemp? = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskDirectionDataTemp.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskDirectionDataTemp.kt index 3d31263ba..c27e97732 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskDirectionDataTemp.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskDirectionDataTemp.kt @@ -18,5 +18,4 @@ class TaskDirectionDataDrop { var key: String? = null var type: String? = null var dialog: String? = null - -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/VerifyUsernameResponse.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/VerifyUsernameResponse.kt index 4e3a4995c..f34c67c8a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/VerifyUsernameResponse.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/VerifyUsernameResponse.kt @@ -4,5 +4,4 @@ class VerifyUsernameResponse { var isUsable: Boolean = false var issues = emptyList() - } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.kt index e26773221..7e7b78c01 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.models.shops import android.content.Context - import com.habitrpg.android.habitica.R class Shop { 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 cbcd9a5fc..1cca5db5c 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 @@ -2,13 +2,11 @@ package com.habitrpg.android.habitica.models.shops import android.content.Context import android.content.res.Resources - import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.inventory.ItemEvent import com.habitrpg.android.habitica.models.user.User - import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -19,17 +17,17 @@ open class ShopItem : RealmObject(), BaseObject { var notes: String? = "" @SerializedName("class") var imageName: String? = null - get() { - return if (field != null) { - if (field!!.contains(" ")) { - field!!.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1] + get() { + return if (field != null) { + if (field!!.contains(" ")) { + field!!.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1] + } else { + field + } } else { - field + "shop_$key" } - } else { - "shop_$key" } - } var value: Int = 0 var locked: Boolean = false @@ -64,7 +62,7 @@ open class ShopItem : RealmObject(), BaseObject { val canPurchaseBulk: Boolean get() = "eggs" == purchaseType || "hatchingPotions" == purchaseType || "food" == purchaseType || "gems" == purchaseType - fun canAfford(user: User?, quantity: Int): Boolean = when(currency) { + fun canAfford(user: User?, quantity: Int): Boolean = when (currency) { "gold" -> (value * quantity) <= (user?.stats?.gp ?: 0.0) else -> true } 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 b2b8b8d7c..704a18714 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 @@ -3,9 +3,7 @@ package com.habitrpg.android.habitica.models.shops import android.content.Context import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.models.BaseObject - import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -16,14 +14,14 @@ open class ShopItemUnlockCondition : RealmObject(), BaseObject { fun readableUnlockCondition(context: Context): String = when (this.condition) { "party invite" -> context.getString(R.string.party_invite) - "login reward" -> if (incentiveThreshold != null) context.getString(R.string.login_incentive_count, incentiveThreshold) else context.getString(R.string.login_incentive) + "login reward" -> if (incentiveThreshold != null) context.getString(R.string.login_incentive_count, incentiveThreshold) else context.getString(R.string.login_incentive) "create account" -> context.getString(R.string.create_account) else -> "" } fun shortReadableUnlockCondition(context: Context): String = when (this.condition) { "party invite" -> context.getString(R.string.party_invite_short) - "login reward" -> if (incentiveThreshold != null) context.getString(R.string.login_incentive_short_count, incentiveThreshold) else context.getString(R.string.login_incentive_short) + "login reward" -> if (incentiveThreshold != null) context.getString(R.string.login_incentive_short_count, incentiveThreshold) else context.getString(R.string.login_incentive_short) "create account" -> context.getString(R.string.create_account_short) else -> "" } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Challenge.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Challenge.kt index 11d5862c3..7648cd423 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Challenge.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Challenge.kt @@ -40,16 +40,16 @@ open class Challenge : RealmObject(), BaseObject { val map = HashMap>() if (dailyList?.isNotEmpty() == true) { - dailyList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()?.let { map[TASK_ORDER_DAILYS] } - } + dailyList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()?.let { map[TASK_ORDER_DAILYS] } + } if (habitList?.isNotEmpty() == true) { habitList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()?.let { map[TASK_ORDER_HABITS] } - } + } if (rewardList?.isNotEmpty() == true) { rewardList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()?.let { map[TASK_ORDER_REWARDS] } - } + } if (todoList?.isNotEmpty() == true) { todoList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()?.let { map[TASK_ORDER_TODOS] } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChallengeMembership.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChallengeMembership.kt index 529dc0806..10079a2ce 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChallengeMembership.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChallengeMembership.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.social import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -16,4 +15,4 @@ open class ChallengeMembership : RealmObject, BaseObject { } constructor() : super() -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessage.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessage.kt index 6f6496d44..a73d4990d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessage.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessage.kt @@ -62,4 +62,3 @@ open class ChatMessage : RealmObject(), BaseMainObject { return likes?.any { userId == it.id } ?: false } } - diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessageLike.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessageLike.kt index 1256ae442..b71534105 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessageLike.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessageLike.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.social import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Group.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Group.kt index 1d9c299d5..b824c01bb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Group.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Group.kt @@ -6,7 +6,6 @@ import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.tasks.TaskList import com.habitrpg.android.habitica.models.tasks.TasksOrder import com.habitrpg.android.habitica.models.user.User - import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.Ignore @@ -42,7 +41,6 @@ open class Group : RealmObject(), BaseMainObject { var leaderOnlyGetGems: Boolean = false var categories: RealmList? = null - @Ignore var tasksOrder: TasksOrder? = null @Ignore @@ -54,7 +52,6 @@ open class Group : RealmObject(), BaseMainObject { } val group = other as? Group return id == group?.id - } override fun hashCode(): Int { @@ -66,12 +63,12 @@ open class Group : RealmObject(), BaseMainObject { } val hasActiveQuest: Boolean - get() { - return quest?.active ?: false - } + get() { + return quest?.active ?: false + } val gemCount: Int - get() { - return (balance * 4.0).toInt() - } + get() { + return (balance * 4.0).toInt() + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/GroupCategory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/GroupCategory.kt index 9a1385e9f..420172777 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/GroupCategory.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/GroupCategory.kt @@ -5,7 +5,6 @@ import com.habitrpg.android.habitica.models.BaseMainObject import io.realm.RealmModel import io.realm.RealmObject import io.realm.annotations.PrimaryKey -import io.realm.annotations.RealmClass open class GroupCategory : RealmObject(), BaseMainObject { override val realmClass: Class diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/GroupMembership.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/GroupMembership.kt index 5b92d9c33..97d62d659 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/GroupMembership.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/GroupMembership.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.social import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject import io.realm.annotations.PrimaryKey -import io.realm.annotations.RealmClass open class GroupMembership : RealmObject, BaseObject { @PrimaryKey diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/InboxConversation.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/InboxConversation.kt index 37799538c..0277b0a23 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/InboxConversation.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/InboxConversation.kt @@ -11,10 +11,10 @@ open class InboxConversation : RealmObject(), BaseObject { @PrimaryKey var combinedID: String = "" var uuid: String = "" - set(value) { - field = value - combinedID = userID + value - } + set(value) { + field = value + combinedID = userID + value + } var userID: String = "" set(value) { field = value @@ -29,4 +29,4 @@ open class InboxConversation : RealmObject(), BaseObject { val formattedUsername: String? get() = if (username?.isNotEmpty() == true) "@$username" else null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserParty.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserParty.kt index 2342f1ba1..23f0d64a8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserParty.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserParty.kt @@ -3,9 +3,7 @@ package com.habitrpg.android.habitica.models.social import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.inventory.Quest - import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -14,7 +12,6 @@ open class UserParty : RealmObject(), BaseObject { var id: String = "" var quest: Quest? = null @SerializedName("order") - var partyOrder: String? = null//Order to display ppl - var orderAscending: String? = null//Order type - + var partyOrder: String? = null // Order to display ppl + var orderAscending: String? = null // Order type } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserStyles.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserStyles.kt index 265d8db42..c8380e6e1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserStyles.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserStyles.kt @@ -6,7 +6,6 @@ import com.habitrpg.android.habitica.models.user.Outfit import com.habitrpg.android.habitica.models.user.Preferences import com.habitrpg.android.habitica.models.user.Stats import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) 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 e6c9e6646..daec808b6 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 @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.tasks import android.os.Parcel import android.os.Parcelable import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -35,7 +34,7 @@ open class Days() : RealmObject(), Parcelable { s = `in`.readByte().toInt() != 0 su = `in`.readByte().toInt() != 0 } - + override fun describeContents(): Int { return 0 } @@ -49,4 +48,4 @@ open class Days() : RealmObject(), Parcelable { return arrayOfNulls(size) } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/HabitResetOption.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/HabitResetOption.kt index fec7d807b..bffc161c5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/HabitResetOption.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/HabitResetOption.kt @@ -7,4 +7,4 @@ enum class HabitResetOption(val value: String, @StringRes val nameRes: Int) { DAILY("daily", R.string.repeat_daily), WEEKLY("weekly", R.string.weekly), MONTHLY("monthly", R.string.monthly) -} \ No newline at end of file +} 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 154ca9efb..52f9253a8 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 @@ -2,12 +2,9 @@ package com.habitrpg.android.habitica.models.tasks import android.os.Parcel import android.os.Parcelable - -import java.util.Date - import io.realm.RealmObject import io.realm.annotations.PrimaryKey -import io.realm.annotations.RealmClass +import java.util.Date open class RemindersItem : RealmObject, Parcelable { @PrimaryKey @@ -15,7 +12,7 @@ open class RemindersItem : RealmObject, Parcelable { var startDate: Date? = null var time: Date? = null - //Use to store task type before a task is created + // Use to store task type before a task is created var type: String? = null override fun describeContents(): Int { @@ -26,10 +23,9 @@ open class RemindersItem : RealmObject, Parcelable { dest.writeString(id) dest.writeLong(this.startDate?.time ?: -1) dest.writeLong(this.time?.time ?: -1) - } - companion object CREATOR: Parcelable.Creator { + companion object CREATOR : Parcelable.Creator { override fun createFromParcel(source: Parcel): RemindersItem = RemindersItem(source) override fun newArray(size: Int): Array = arrayOfNulls(size) @@ -43,7 +39,6 @@ open class RemindersItem : RealmObject, Parcelable { constructor() - override fun equals(other: Any?): Boolean { return if (other is RemindersItem) { this.id == other.id 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 908c4348d..75b4b782b 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 @@ -7,7 +7,6 @@ import androidx.annotation.StringDef import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.models.BaseMainObject -import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.Tag import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.ui.helpers.MarkdownParser @@ -45,22 +44,22 @@ open class Task : RealmObject, BaseMainObject, Parcelable { var dateCreated: Date? = null var position: Int = 0 var group: TaskGroupPlan? = null - //Habits + // Habits var up: Boolean? = false var down: Boolean? = false var counterUp: Int? = 0 var counterDown: Int? = 0 - //todos/dailies + // todos/dailies var completed: Boolean = false var checklist: RealmList? = RealmList() var reminders: RealmList? = RealmList() - //dailies + // dailies var frequency: String? = null var everyX: Int? = 0 var streak: Int? = 0 var startDate: Date? = null var repeat: Days? = null - //todos + // todos @SerializedName("date") var dueDate: Date? = null // used for buyable items @@ -74,7 +73,7 @@ open class Task : RealmObject, BaseMainObject, Parcelable { var nextDue: RealmList? = null - //Needed for offline creating/updating + // Needed for offline creating/updating var isSaving: Boolean = false var hasErrored: Boolean = false var isCreating: Boolean = false @@ -325,7 +324,6 @@ open class Task : RealmObject, BaseMainObject, Parcelable { this.counterDown = `in`.readInt() } - fun setWeeksOfMonth(weeksOfMonth: List?) { this.weeksOfMonth = weeksOfMonth if ((weeksOfMonth?.size ?: 0) > 0) { @@ -349,7 +347,6 @@ open class Task : RealmObject, BaseMainObject, Parcelable { } catch (e: JSONException) { e.printStackTrace() } - } this.weeksOfMonth = weeksOfMonth.toList() } @@ -362,7 +359,8 @@ open class Task : RealmObject, BaseMainObject, Parcelable { this.daysOfMonthString = this.daysOfMonth?.toString() } else { daysOfMonthString = "[]" - } } + } + } fun getDaysOfMonth(): List? { if (daysOfMonth == null) { @@ -378,7 +376,6 @@ open class Task : RealmObject, BaseMainObject, Parcelable { } catch (e: JSONException) { e.printStackTrace() } - } this.daysOfMonth = daysOfMonth } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskDifficulty.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskDifficulty.kt index b8df82126..395e6fe4d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskDifficulty.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskDifficulty.kt @@ -7,4 +7,4 @@ enum class TaskDifficulty(val value: Float, val nameRes: Int) { EASY(1f, R.string.easy), MEDIUM(1.5f, R.string.medium), HARD(2f, R.string.hard) -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskGroupPlan.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskGroupPlan.kt index 91126a47b..415c34ff6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskGroupPlan.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskGroupPlan.kt @@ -1,11 +1,9 @@ package com.habitrpg.android.habitica.models.tasks - import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass import java.util.* diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskList.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskList.kt index 2b754b324..c3889f3c1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskList.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskList.kt @@ -2,4 +2,4 @@ package com.habitrpg.android.habitica.models.tasks class TaskList { var tasks: MutableMap = mutableMapOf() -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskTag.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskTag.kt index 313921dd5..2e600e579 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskTag.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskTag.kt @@ -3,11 +3,10 @@ package com.habitrpg.android.habitica.models.tasks import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.Tag import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) open class TaskTag : RealmObject(), BaseObject { var tag: Tag? = null var task: Task? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TasksOrder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TasksOrder.kt index e345c1ccc..0f3eca66a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TasksOrder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TasksOrder.kt @@ -5,4 +5,4 @@ class TasksOrder { var dailys: List = listOf() var todos: List = listOf() var rewards: List = listOf() -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/ABTest.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/ABTest.kt index 7596b0562..384845271 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/ABTest.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/ABTest.kt @@ -2,11 +2,10 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) -open class ABTest: RealmObject(), BaseObject { +open class ABTest : RealmObject(), BaseObject { var name: String = "" var group: String = "" -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Authentication.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Authentication.kt index b099a4f6c..3c0c3a45e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Authentication.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Authentication.kt @@ -3,9 +3,7 @@ package com.habitrpg.android.habitica.models.user import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.auth.LocalAuthentication - import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -18,5 +16,4 @@ open class Authentication : RealmObject(), BaseObject { var hasAppleAuth = false var timestamps: AuthenticationTimestamps? = null - } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/AuthenticationTimestamps.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/AuthenticationTimestamps.kt index b09a7b1b3..376b3b49d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/AuthenticationTimestamps.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/AuthenticationTimestamps.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.user import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass import java.util.* diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Backer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Backer.kt index 1d6cf0e07..5349e45a5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Backer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Backer.kt @@ -8,4 +8,4 @@ import io.realm.annotations.RealmClass open class Backer : RealmObject(), BaseObject { var npc: String? = null var tier: Int? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Buffs.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Buffs.kt index f025ce5fa..9bddd0664 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Buffs.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Buffs.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.user import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -25,7 +24,6 @@ open class Buffs : RealmObject(), BaseObject { var streaks: Boolean? = null get() { return field ?: false } - fun merge(stats: Buffs?) { if (stats == null) { return @@ -40,4 +38,4 @@ open class Buffs : RealmObject(), BaseObject { shinySeed = if (stats.shinySeed != null) stats.shinySeed else shinySeed spookySparkles = if (stats.spookySparkles != null) stats.spookySparkles else spookySparkles } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/ContributorInfo.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/ContributorInfo.kt index 8b8532cb4..0b3fa6dab 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/ContributorInfo.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/ContributorInfo.kt @@ -1,11 +1,9 @@ package com.habitrpg.android.habitica.models.user -import io.realm.RealmObject import android.util.SparseIntArray -import com.habitrpg.android.habitica.models.user.ContributorInfo import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.models.BaseObject -import io.realm.annotations.PrimaryKey +import io.realm.RealmObject import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -39,4 +37,4 @@ open class ContributorInfo : RealmObject(), BaseObject { } return rColor } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.kt index 5b145bb84..c8cd2f657 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.kt @@ -4,7 +4,6 @@ import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.TutorialStep import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -24,4 +23,4 @@ open class Flags : RealmObject(), BaseObject { var communityGuidelinesAccepted = false var verifiedUsername = false var isWarnedLowHealth = false -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Gear.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Gear.kt index 111337ba4..a146778f5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Gear.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Gear.kt @@ -4,7 +4,6 @@ import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.inventory.Equipment import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -12,4 +11,4 @@ open class Gear : RealmObject(), BaseObject { var owned: RealmList? = null var equipped: Outfit? = null var costume: Outfit? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Hair.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Hair.kt index 5c90c4bfe..5b6064aca 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Hair.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Hair.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Inbox.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Inbox.kt index 6bc935801..51620f7d2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Inbox.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Inbox.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -11,4 +10,4 @@ open class Inbox : RealmObject(), BaseObject { var optOut: Boolean = false var blocks: RealmList = RealmList() var newMessages: Int = 0 -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.kt index d35b4be8d..c984eedf2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Items.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass import java.util.* @@ -17,10 +16,10 @@ open class Items : RealmObject, BaseObject { } var eggs: RealmList? = null - set(value) { - field = value - field?.forEach { it.itemType = "eggs" } - } + set(value) { + field = value + field?.forEach { it.itemType = "eggs" } + } var food: RealmList? = null set(value) { field = value @@ -43,7 +42,7 @@ open class Items : RealmObject, BaseObject { var lastDrop_count: Int = 0 var lastDrop_date: Date? = null - //private QuestContent quest; + // private QuestContent quest; var gear: Gear? = null var special: SpecialItems? = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Outfit.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Outfit.kt index 3e0f85847..f21cebb92 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Outfit.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Outfit.kt @@ -1,12 +1,9 @@ package com.habitrpg.android.habitica.models.user import android.text.TextUtils - import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.BaseObject - import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedCustomization.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedCustomization.kt index 993f2ee40..6d210b0ce 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedCustomization.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedCustomization.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.models.user import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt index dd656c40f..9acd6066c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt @@ -1,9 +1,7 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseMainObject -import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedMount.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedMount.kt index 723e2e6bf..2330bd411 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedMount.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedMount.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.models.user import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -10,6 +9,5 @@ open class OwnedMount : RealmObject(), OwnedObject { override var userID: String? = null override var key: String? = null - var owned = false } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedObject.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedObject.kt index b275ca930..ae7df2485 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedObject.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedObject.kt @@ -2,7 +2,7 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject -interface OwnedObject: BaseObject { +interface OwnedObject : BaseObject { var userID: String? var key: String? } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedPet.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedPet.kt index b7a624f3f..415e330b6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedPet.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedPet.kt @@ -1,10 +1,8 @@ package com.habitrpg.android.habitica.models.user import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass - @RealmClass(embedded = true) open class OwnedPet : RealmObject(), OwnedObject { override var userID: String? = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Preferences.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Preferences.kt index bfdc8a911..fa2b155be 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Preferences.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Preferences.kt @@ -1,12 +1,9 @@ package com.habitrpg.android.habitica.models.user - import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.AvatarPreferences import com.habitrpg.android.habitica.models.BaseObject - import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass import java.util.* @@ -27,15 +24,15 @@ open class Preferences : RealmObject(), AvatarPreferences, BaseObject { override var size: String? = null override var background: String? = null override var chair: String? = null - get() { - return if (field != null && field != "none") { - if (field?.contains("chair_") == true) { - field - } else { - "chair_" + field!! - } - } else null - } + get() { + return if (field != null && field != "none") { + if (field?.contains("chair_") == true) { + field + } else { + "chair_" + field!! + } + } else null + } var language: String? = null var sound: String? = null var dayStart: Int = 0 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Profile.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Profile.kt index 816a2f277..43bdd1976 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Profile.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Profile.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Purchases.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Purchases.kt index d02ce124b..67099c296 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Purchases.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Purchases.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -12,4 +11,4 @@ open class Purchases : RealmObject(), BaseObject { var customizations: RealmList? = null var user: User? = null var plan: SubscriptionPlan? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SpecialItems.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SpecialItems.kt index ef68bf077..5e615e2dd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SpecialItems.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SpecialItems.kt @@ -1,10 +1,8 @@ package com.habitrpg.android.habitica.models.user - import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Stats.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Stats.kt index 080c02949..64ef5d45e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Stats.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Stats.kt @@ -5,10 +5,8 @@ import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass - @RealmClass(embedded = true) open class Stats : RealmObject(), BaseObject { @SerializedName("con") @@ -53,9 +51,9 @@ open class Stats : RealmObject(), BaseObject { val isBuffed: Boolean get() { return buffs?.str ?: 0f > 0 || - buffs?.con ?: 0f > 0 || - buffs?._int ?: 0f > 0 || - buffs?.per ?: 0f > 0 + buffs?.con ?: 0f > 0 || + buffs?._int ?: 0f > 0 || + buffs?.per ?: 0f > 0 } fun getTranslatedClassName(context: Context): String { @@ -96,7 +94,6 @@ open class Stats : RealmObject(), BaseObject { const val CONSTITUTION = "con" const val PERCEPTION = "per" - const val WARRIOR = "warrior" const val MAGE = "wizard" const val HEALER = "healer" 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 eb62b41d2..da989b026 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 @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.user import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass import java.util.* @@ -53,4 +52,4 @@ open class SubscriptionPlan : RealmObject(), BaseObject { var PLANID_GOOGLE6MONTH = "google_6mo" var PLANID_BASIC12MONTH = "basic_12mo" } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlanConsecutive.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlanConsecutive.kt index 120878996..412a47b0d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlanConsecutive.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlanConsecutive.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -11,4 +10,4 @@ open class SubscriptionPlanConsecutive : RealmObject(), BaseObject { var gemCapExtra = 0 var offset = 0 var count = 0 -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SuppressedModals.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SuppressedModals.kt index 48a341762..74ac091f8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SuppressedModals.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SuppressedModals.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -11,4 +10,4 @@ open class SuppressedModals : RealmObject(), BaseObject { var raisePet: Boolean? = null var hatchPet: Boolean? = null var levelUp: Boolean? = null -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Training.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Training.kt index 03d4e30e7..307593a86 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Training.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Training.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.models.user import com.google.gson.annotations.SerializedName import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -24,4 +23,4 @@ open class Training : RealmObject(), BaseObject { per = stats.per _int = stats._int } -} \ No newline at end of file +} 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 c12997778..e37b07e19 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 @@ -22,7 +22,7 @@ open class User : RealmObject(), BaseMainObject, Avatar, VersionedObject { get() = id override val primaryIdentifierName: String get() = "id" - + @Ignore var tasks: TaskList? = null @@ -82,7 +82,7 @@ open class User : RealmObject(), BaseMainObject, Avatar, VersionedObject { val contributorColor: Int get() = this.contributor?.contributorColor ?: R.color.text_primary val username: String? - get() = authentication?.localAuthentication?.username + get() = authentication?.localAuthentication?.username val formattedUsername: String? get() = if (username != null) "@$username" else null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/UserAchievement.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/UserAchievement.kt index 1cd98e76a..a26565f58 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/UserAchievement.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/UserAchievement.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.user import com.habitrpg.android.habitica.models.BaseObject import io.realm.RealmObject -import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass @RealmClass(embedded = true) @@ -10,4 +9,3 @@ open class UserAchievement : RealmObject(), BaseObject { var key: String? = null var earned: Boolean = false } - 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 537ab0315..c4c22aa16 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 @@ -103,5 +103,4 @@ class AppModule(private val application: Application) { companion object { const val NAMED_USER_ID = "userId" } - -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.kt index 550f23972..a03f27757 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.kt @@ -7,7 +7,7 @@ import dagger.Module import dagger.Provides import javax.inject.Singleton -//provide proxy class for libraries(to avoid 65k limit) +// provide proxy class for libraries(to avoid 65k limit) @Module open class DeveloperModule { @Provides @@ -15,4 +15,4 @@ open class DeveloperModule { open fun provideAnalyticsManager(context: Context): AnalyticsManager { return EmptyAnalyticsManager() } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/AnalyticsManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/AnalyticsManager.kt index fab553812..f4a134001 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/AnalyticsManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/AnalyticsManager.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.proxy import android.os.Bundle - interface AnalyticsManager { fun logException(t: Throwable) fun setUserIdentifier(identifier: String) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/implementation/EmptyAnalyticsManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/implementation/EmptyAnalyticsManager.kt index bcc56edef..459e63550 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/implementation/EmptyAnalyticsManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/implementation/EmptyAnalyticsManager.kt @@ -1,24 +1,23 @@ package com.habitrpg.android.habitica.proxy.implementation - import android.os.Bundle import com.habitrpg.android.habitica.proxy.AnalyticsManager class EmptyAnalyticsManager : AnalyticsManager { override fun logException(e: Throwable) { - //pass + // pass } override fun setUserIdentifier(identifier: String) { - //pass + // pass } override fun logError(msg: String) { - //pass + // pass } override fun logEvent(eventName: String, data: Bundle) { - //pass + // pass } } 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 49941a2ce..b29ce5103 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 @@ -74,9 +74,12 @@ class LocalNotificationActionReceiver : BroadcastReceiver() { context?.getString(R.string.group_message_reply) -> { groupID?.let { getMessageText(context?.getString(R.string.group_message_reply))?.let { message -> - socialRepository.postGroupChat(it, message).subscribe({ - context?.let { c -> NotificationManagerCompat.from(c).cancel(it.hashCode()) } - }, RxErrorHandler.handleEmptyError()) + socialRepository.postGroupChat(it, message).subscribe( + { + context?.let { c -> NotificationManagerCompat.from(c).cancel(it.hashCode()) } + }, + RxErrorHandler.handleEmptyError() + ) } } } 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 b40983d48..5c3ba5c20 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 @@ -6,7 +6,6 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.SharedPreferences -import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat @@ -15,7 +14,6 @@ import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository -import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.helpers.TaskAlarmManager import com.habitrpg.android.habitica.models.tasks.Task @@ -25,9 +23,8 @@ import io.reactivex.rxjava3.functions.BiFunction import java.util.* import javax.inject.Inject - @Suppress("DEPRECATION") -//https://gist.github.com/BrandonSmith/6679223 +// https://gist.github.com/BrandonSmith/6679223 class NotificationPublisher : BroadcastReceiver() { @Inject @@ -48,7 +45,7 @@ class NotificationPublisher : BroadcastReceiver() { } var wasInactive = false - //Show special notification if user hasn't logged in for a week + // Show special notification if user hasn't logged in for a week if (sharedPreferences.getLong("lastAppLaunch", Date().time) < (Date().time - 604800000L)) { wasInactive = true sharedPreferences.edit { putBoolean("preventDailyReminder", true) } @@ -57,21 +54,26 @@ class NotificationPublisher : BroadcastReceiver() { } val checkDailies = intent.getBooleanExtra(CHECK_DAILIES, false) if (checkDailies) { - taskRepository.getTasks(Task.TYPE_DAILY).firstElement().zipWith(userRepository.getUser().firstElement(), BiFunction, User, Pair, User>> { tasks, user -> - return@BiFunction Pair(tasks, user) - }).subscribe({ pair -> - var showNotifications = false - for (task in pair.first) { - if (task.checkIfDue()) { - showNotifications = true - break + taskRepository.getTasks(Task.TYPE_DAILY).firstElement().zipWith( + userRepository.getUser().firstElement(), + BiFunction, User, Pair, User>> { tasks, user -> + return@BiFunction Pair(tasks, user) + } + ).subscribe( + { pair -> + var showNotifications = false + for (task in pair.first) { + if (task.checkIfDue()) { + showNotifications = true + break + } } - } - if (showNotifications) { - notify(intent, buildNotification(wasInactive, pair.second.authentication?.timestamps?.createdAt)) - } - }, RxErrorHandler.handleEmptyError()) - + if (showNotifications) { + notify(intent, buildNotification(wasInactive, pair.second.authentication?.timestamps?.createdAt)) + } + }, + RxErrorHandler.handleEmptyError() + ) } else { notify(intent, buildNotification(wasInactive)) } @@ -93,12 +95,14 @@ class NotificationPublisher : BroadcastReceiver() { val registrationCal = Calendar.getInstance() registrationCal.time = registrationDate val todayCal = Calendar.getInstance() - val isSameDay = (registrationCal.get(Calendar.YEAR) == todayCal.get(Calendar.YEAR) && + 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) && + ) + 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) @@ -120,8 +124,10 @@ class NotificationPublisher : BroadcastReceiver() { notificationIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP - val intent = PendingIntent.getActivity(thisContext, 0, - notificationIntent, 0) + val intent = PendingIntent.getActivity( + thisContext, 0, + notificationIntent, 0 + ) builder.setContentIntent(intent) builder.color = ContextCompat.getColor(thisContext, R.color.brand_300) 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 37e82fc7b..97b060576 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 @@ -22,5 +22,4 @@ class TaskAlarmBootReceiver : BroadcastReceiver() { taskAlarmManager.scheduleAllSavedAlarms(sharedPreferences.getBoolean("preventDailyReminder", 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 4836ba652..85743da84 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 @@ -10,7 +10,6 @@ import androidx.core.app.NotificationManagerCompat import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.TaskRepository -import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.helpers.TaskAlarmManager import com.habitrpg.android.habitica.models.tasks.Task @@ -21,9 +20,6 @@ import io.reactivex.rxjava3.functions.Consumer import java.util.* import javax.inject.Inject - - - class TaskReceiver : BroadcastReceiver() { @Inject @@ -38,20 +34,23 @@ class TaskReceiver : BroadcastReceiver() { val extras = intent.extras if (extras != null) { val taskId = extras.getString(TaskAlarmManager.TASK_ID_INTENT_KEY) - //This will set up the next reminders for dailies + // This will set up the next reminders for dailies if (taskId != null) { taskAlarmManager.addAlarmForTaskId(taskId) } taskRepository.getTask(taskId ?: "") - .firstElement() - .subscribe(Consumer { + .firstElement() + .subscribe( + Consumer { if (!it.isValid || it.completed) { return@Consumer } createNotification(context, it) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } } @@ -64,26 +63,26 @@ class TaskReceiver : BroadcastReceiver() { val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) val notificationBuilder = NotificationCompat.Builder(context, "default") - .setSmallIcon(R.drawable.ic_gryphon_white) - .setContentTitle(task.text) - .setPriority(NotificationCompat.PRIORITY_MAX) - .setSound(soundUri) - .setAutoCancel(true) - .setContentIntent(pendingIntent) + .setSmallIcon(R.drawable.ic_gryphon_white) + .setContentTitle(task.text) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setSound(soundUri) + .setAutoCancel(true) + .setContentIntent(pendingIntent) if (task.type == Task.TYPE_DAILY || task.type == Task.TYPE_TODO) { val completeIntent = Intent(context, LocalNotificationActionReceiver::class.java) completeIntent.action = context.getString(R.string.complete_task_action) completeIntent.putExtra("taskID", task.id) val pendingIntentComplete = PendingIntent.getBroadcast( - context, - 3000, - completeIntent, - PendingIntent.FLAG_UPDATE_CURRENT + context, + 3000, + completeIntent, + PendingIntent.FLAG_UPDATE_CURRENT ) notificationBuilder.addAction(0, context.getString(R.string.complete), pendingIntentComplete) } val notificationManager = NotificationManagerCompat.from(context) notificationManager.notify(task.id.hashCode(), notificationBuilder.build()) } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt index e1a38fa56..5572b178f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.ui import android.content.Context import android.graphics.* import android.graphics.drawable.Drawable -import android.os.Build import android.text.TextUtils import android.util.AttributeSet import android.widget.FrameLayout @@ -12,8 +11,6 @@ import androidx.core.graphics.drawable.toBitmap import androidx.core.view.marginStart import androidx.core.view.marginTop import coil.clear -import coil.decode.GifDecoder -import coil.decode.ImageDecoderDecoder import coil.load import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.R @@ -102,7 +99,8 @@ class AvatarView : FrameLayout { private fun init(attrs: AttributeSet?, defStyle: Int) { // Load attributes val a = context.obtainStyledAttributes( - attrs, R.styleable.AvatarView, defStyle, 0) + attrs, R.styleable.AvatarView, defStyle, 0 + ) try { showBackground = a.getBoolean(R.styleable.AvatarView_showBackground, true) @@ -145,23 +143,27 @@ class AvatarView : FrameLayout { imageView.load(DataBindingUtils.BASE_IMAGE_URL + DataBindingUtils.getFullFilename(layerName)) { allowHardware(false) - target({}, { - onLayerComplete() - }, { - if (imageView.tag != layerName) { - return@target + target( + {}, + { + onLayerComplete() + }, + { + if (imageView.tag != layerName) { + return@target + } + val bounds = getLayerBounds(layerKey, layerName, it) + imageView.setImageDrawable(it) + imageView.imageMatrix = avatarMatrix + val layoutParams = imageView.layoutParams as? LayoutParams + layoutParams?.topMargin = bounds.top + layoutParams?.marginStart = bounds.left + layoutParams?.width = bounds.right + layoutParams?.height = bounds.bottom + imageView.layoutParams = layoutParams + onLayerComplete() } - val bounds = getLayerBounds(layerKey, layerName, it) - imageView.setImageDrawable(it) - imageView.imageMatrix = avatarMatrix - val layoutParams = imageView.layoutParams as? LayoutParams - layoutParams?.topMargin = bounds.top - layoutParams?.marginStart = bounds.left - layoutParams?.width = bounds.right - layoutParams?.height = bounds.bottom - imageView.layoutParams = layoutParams - onLayerComplete() - }) + ) } } while (i < (imageViewHolder.size)) { @@ -375,14 +377,13 @@ class AvatarView : FrameLayout { } } - if (offset != null) { when (layerName) { - "head_special_0" -> offset = PointF(offset.x-3, offset.y-18) - "weapon_special_0" -> offset = PointF(offset.x-12, offset.y+4) - "weapon_special_1" -> offset = PointF(offset.x-12, offset.y+4) - "weapon_special_critical" -> offset = PointF(offset.x-12, offset.y+4) - "head_special_1" -> offset = PointF(offset.x, offset.y+3) + "head_special_0" -> offset = PointF(offset.x - 3, offset.y - 18) + "weapon_special_0" -> offset = PointF(offset.x - 12, offset.y + 4) + "weapon_special_1" -> offset = PointF(offset.x - 12, offset.y + 4) + "weapon_special_critical" -> offset = PointF(offset.x - 12, offset.y + 4) + "head_special_1" -> offset = PointF(offset.x, offset.y + 3) } val translateMatrix = Matrix() @@ -397,8 +398,6 @@ class AvatarView : FrameLayout { return bounds } - - private fun onLayerComplete() { if (numberLayersInProcess.decrementAndGet() == 0) { avatarImageConsumer?.accept(avatarImage) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt index e3b7a2d49..325317186 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt @@ -1,10 +1,8 @@ package com.habitrpg.android.habitica.ui -import android.annotation.TargetApi import android.content.Context import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable -import android.os.Build import android.view.View import android.widget.TextView import androidx.core.os.bundleOf @@ -64,8 +62,10 @@ class AvatarWithBarsViewModel(private val context: Context, private val binding: if (!user.hasClass()) { setUserLevel(context, binding.lvlTv, stats.lvl) } else { - setUserLevelWithClass(context, binding.lvlTv, stats.lvl, - userClass.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }, stats.habitClass) + setUserLevelWithClass( + context, binding.lvlTv, stats.lvl, + userClass.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }, stats.habitClass + ) } setHpBarData(stats.hp?.toFloat() ?: 0.toFloat(), stats.maxHealth ?: 0) @@ -98,7 +98,7 @@ class AvatarWithBarsViewModel(private val context: Context, private val binding: } private fun setXpBarData(value: Float, valueMax: Int) { - if (valueMax != 0) { + if (valueMax != 0) { cachedMaxExp = valueMax } binding.xpBar.set(floor(value.toDouble()), cachedMaxExp.toDouble()) 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 c891c23dd..23026be5a 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 @@ -7,7 +7,6 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding import com.habitrpg.android.habitica.extensions.layoutInflater - class GemPurchaseOptionsView(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs) { var binding: PurchaseGemViewBinding = PurchaseGemViewBinding.inflate(context.layoutInflater, this, true) @@ -15,9 +14,10 @@ class GemPurchaseOptionsView(context: Context, attrs: AttributeSet) : FrameLayou init { val a = context.theme.obtainStyledAttributes( - attrs, - R.styleable.GemPurchaseOptionsView, - 0, 0) + attrs, + R.styleable.GemPurchaseOptionsView, + 0, 0 + ) binding.gemAmount.text = a.getText(R.styleable.GemPurchaseOptionsView_gemAmount) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt index 0daad3ae1..1fa1231e6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt @@ -2,13 +2,12 @@ package com.habitrpg.android.habitica.ui import android.content.Context import android.content.DialogInterface -import androidx.appcompat.app.AlertDialog import android.view.Gravity import android.view.View import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView - +import androidx.appcompat.app.AlertDialog import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper @@ -29,7 +28,8 @@ class ItemDetailDialog(context: Context) : AlertDialog(context) { // Gear Image itemImageView = ImageView(context) val gearImageLayoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT + ) gearImageLayoutParams.gravity = Gravity.CENTER_HORIZONTAL or Gravity.CENTER_VERTICAL gearImageLayoutParams.setMargins(0, 0, 0, 20) @@ -47,7 +47,8 @@ class ItemDetailDialog(context: Context) : AlertDialog(context) { val goldPriceLayout = LinearLayout(context) goldPriceLayout.gravity = Gravity.CENTER_HORIZONTAL val goldPriceLayoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT + ) goldPriceLayoutParams.setMargins(0, 0, 0, 16) goldPriceLayoutParams.gravity = Gravity.CENTER_HORIZONTAL or Gravity.CENTER_VERTICAL @@ -99,7 +100,6 @@ class ItemDetailDialog(context: Context) : AlertDialog(context) { fun setValue(value: Int?) { priceTextView.text = value?.toString() - } fun setImage(imageName: String) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.kt index fb777c35e..4f6621fa9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.kt @@ -1,9 +1,6 @@ package com.habitrpg.android.habitica.ui - -import android.annotation.TargetApi import android.content.Context -import android.os.Build import android.util.AttributeSet import android.util.DisplayMetrics import android.view.WindowManager @@ -40,7 +37,7 @@ class MaxHeightLinearLayout : LinearLayout { private fun init(context: Context, attrs: AttributeSet?) { if (attrs != null) { val styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightLinearLayout) - //200 is a defualt value + // 200 is a defualt value maxHeight = styledAttrs.getFloat(R.styleable.MaxHeightLinearLayout_maxHeightMultiplier, defaultHeight) styledAttrs.recycle() @@ -56,6 +53,5 @@ class MaxHeightLinearLayout : LinearLayout { heightMeasurement = min(heightMeasurement, MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)) super.onMeasure(widthMeasureSpec, heightMeasurement) - } -} \ No newline at end of file +} 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 73fec6b99..647928ab7 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 @@ -8,9 +8,10 @@ import android.util.AttributeSet import android.widget.FrameLayout import androidx.core.graphics.toRectF - class RoundedFrameLayout @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { var radius = 4f @@ -20,10 +21,10 @@ class RoundedFrameLayout @JvmOverloads constructor( override fun onDraw(canvas: Canvas) { clipPath.reset() - val radius = if (isCirclular) (canvas.height/2).toFloat() else radius + val radius = if (isCirclular) (canvas.height / 2).toFloat() else radius canvas.getClipBounds(bounds) clipPath.addRoundRect(bounds.toRectF(), radius, radius, Path.Direction.CW) canvas.clipPath(clipPath) super.onDraw(canvas) } -} \ No newline at end of file +} 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 438bef36b..b8984f893 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui - import android.content.Context import android.util.AttributeSet import android.view.View @@ -15,9 +14,10 @@ class SpeechBubbleView(context: Context, attrs: AttributeSet) : FrameLayout(cont init { val attributes = context.theme.obtainStyledAttributes( - attrs, - R.styleable.SpeechBubbleView, - 0, 0) + attrs, + R.styleable.SpeechBubbleView, + 0, 0 + ) binding.namePlate.text = attributes.getString(R.styleable.SpeechBubbleView_namePlate) binding.textView.text = attributes.getString(R.styleable.SpeechBubbleView_text) 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 1eb0795d6..8aea401b0 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 @@ -21,11 +21,9 @@ import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import javax.inject.Inject - class AdventureGuideActivity : BaseActivity() { private lateinit var binding: ActivityAdventureGuideBinding - private lateinit var achievementTitles: Map private lateinit var achievementDescriptions: Map @@ -51,18 +49,18 @@ class AdventureGuideActivity : BaseActivity() { setupToolbar(binding.toolbar) achievementTitles = mapOf( - Pair("createdTask", getString(R.string.create_task_title)), - 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("createdTask", getString(R.string.create_task_title)), + 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)) ) achievementDescriptions = mapOf( - Pair("createdTask", getString(R.string.create_task_description)), - 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("createdTask", getString(R.string.create_task_description)), + 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)) ) val descriptionText = getString(R.string.adventure_guide_description) @@ -83,9 +81,14 @@ class AdventureGuideActivity : BaseActivity() { override fun onStart() { super.onStart() - compositeSubscription.add(userRepository.getUser().subscribe({ - updateUser(it) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getUser().subscribe( + { + updateUser(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) } private fun updateUser(user: User) { @@ -125,5 +128,4 @@ class AdventureGuideActivity : BaseActivity() { } } } - -} \ No newline at end of file +} 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 7dd8daa58..62a584a0d 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 @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.ui.activities import android.content.Context -import android.content.Intent import android.content.SharedPreferences import android.content.res.Configuration import android.content.res.Resources @@ -31,7 +30,6 @@ import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import java.util.* - abstract class BaseActivity : AppCompatActivity() { private var currentTheme: String? = null private var isNightMode: Boolean = false @@ -90,7 +88,6 @@ abstract class BaseActivity : AppCompatActivity() { loadTheme(PreferenceManager.getDefaultSharedPreferences(this)) } - override fun onPause() { isActivityVisible = false super.onPause() @@ -118,28 +115,32 @@ abstract class BaseActivity : AppCompatActivity() { val modernHeaderStyle = overrideModernHeader ?: sharedPreferences.getBoolean("modern_header_style", true) if (theme != currentTheme || forced) { if (forcedIsNight ?: isNightMode) { - setTheme(when (theme) { - "maroon" -> R.style.MainAppTheme_Maroon_Dark - "red" -> R.style.MainAppTheme_Red_Dark - "orange" -> R.style.MainAppTheme_Orange_Dark - "yellow" -> R.style.MainAppTheme_Yellow_Dark - "green" -> R.style.MainAppTheme_Green_Dark - "teal" -> R.style.MainAppTheme_Teal_Dark - "blue" -> R.style.MainAppTheme_Blue_Dark - else -> R.style.MainAppTheme_Dark - }) + setTheme( + when (theme) { + "maroon" -> R.style.MainAppTheme_Maroon_Dark + "red" -> R.style.MainAppTheme_Red_Dark + "orange" -> R.style.MainAppTheme_Orange_Dark + "yellow" -> R.style.MainAppTheme_Yellow_Dark + "green" -> R.style.MainAppTheme_Green_Dark + "teal" -> R.style.MainAppTheme_Teal_Dark + "blue" -> R.style.MainAppTheme_Blue_Dark + else -> R.style.MainAppTheme_Dark + } + ) } else { - setTheme(when (theme) { - "maroon" -> R.style.MainAppTheme_Maroon - "red" -> R.style.MainAppTheme_Red - "orange" -> R.style.MainAppTheme_Orange - "yellow" -> R.style.MainAppTheme_Yellow - "green" -> R.style.MainAppTheme_Green - "teal" -> R.style.MainAppTheme_Teal - "blue" -> R.style.MainAppTheme_Blue - "taskform" -> R.style.MainAppTheme_TaskForm - else -> R.style.MainAppTheme - }) + setTheme( + when (theme) { + "maroon" -> R.style.MainAppTheme_Maroon + "red" -> R.style.MainAppTheme_Red + "orange" -> R.style.MainAppTheme_Orange + "yellow" -> R.style.MainAppTheme_Yellow + "green" -> R.style.MainAppTheme_Green + "teal" -> R.style.MainAppTheme_Teal + "blue" -> R.style.MainAppTheme_Blue + "taskform" -> R.style.MainAppTheme_TaskForm + else -> R.style.MainAppTheme + } + ) } } 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 17d02bc52..8bf2cd6ec 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 @@ -37,7 +37,6 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaProgressDialog import io.reactivex.rxjava3.core.Flowable import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.lang.NumberFormatException @@ -47,7 +46,6 @@ import javax.inject.Named class ChallengeFormActivity : BaseActivity() { - private lateinit var binding: ActivityCreateChallengeBinding @Inject @@ -121,7 +119,6 @@ class ChallengeFormActivity : BaseActivity() { component?.inject(this) } - override fun onCreateOptionsMenu(menu: Menu): Boolean { val inflater = menuInflater inflater.inflate(R.menu.menu_create_challenge, menu) @@ -140,26 +137,31 @@ class ChallengeFormActivity : BaseActivity() { createChallenge() } - compositeSubscription.add(observable + compositeSubscription.add( + observable .flatMap { challengeId = it.id challengeRepository.retrieveChallenges(0, true) } - .subscribe({ - dialog?.dismiss() - savingInProgress = false - finish() - if (!editMode) { - lifecycleScope.launch(context = Dispatchers.Main) { - delay(500L) - MainNavigationController.navigate(ChallengesOverviewFragmentDirections.openChallengeDetail(challengeId ?: "")) + .subscribe( + { + dialog?.dismiss() + savingInProgress = false + finish() + if (!editMode) { + lifecycleScope.launch(context = Dispatchers.Main) { + delay(500L) + MainNavigationController.navigate(ChallengesOverviewFragmentDirections.openChallengeDetail(challengeId ?: "")) + } } + }, + { throwable -> + dialog?.dismiss() + savingInProgress = false + RxErrorHandler.reportError(throwable) } - }, { throwable -> - dialog?.dismiss() - savingInProgress = false - RxErrorHandler.reportError(throwable) - })) + ) + ) } else if (item.itemId == android.R.id.home) { finish() return true @@ -219,15 +221,18 @@ class ChallengeFormActivity : BaseActivity() { val intent = intent val bundle = intent.extras - ChallengeTasksRecyclerViewAdapter(null, 0, this, "", + ChallengeTasksRecyclerViewAdapter( + null, 0, this, "", openTaskDisabled = false, taskActionsDisabled = true ).also { challengeTasks = it } - compositeSubscription.add(challengeTasks.taskOpenEvents.subscribe { - if (it.isValid) { - openNewTaskActivity(it.type, it) + compositeSubscription.add( + challengeTasks.taskOpenEvents.subscribe { + if (it.isValid) { + openNewTaskActivity(it.type, it) + } } - }) + ) locationAdapter = GroupArrayAdapter(this) if (bundle != null) { @@ -247,7 +252,6 @@ class ChallengeFormActivity : BaseActivity() { binding.challengeRemoveGemBtn.setOnClickListener { onRemoveGem() } } - public override fun onDestroy() { socialRepository.close() challengeRepository.close() @@ -333,29 +337,37 @@ class ChallengeFormActivity : BaseActivity() { } locationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - compositeSubscription.add(socialRepository.getUserGroups("guild").zipWith(userRepository.getUser() - .map { it.party?.id ?: "" } - .distinctUntilChanged() - .flatMap { - if (it.isBlank()) { - return@flatMap Flowable.empty() - } - socialRepository.retrieveGroup(it) - }, { user, groups -> Pair(user, groups) }) - .subscribe({ groups -> - val mutableGroups = groups.first.toMutableList() - if (groups.first.firstOrNull { it.id == "00000000-0000-4000-A000-000000000000" } == null) { - val tavern = Group() - tavern.id = "00000000-0000-4000-A000-000000000000" - tavern.name = getString(R.string.public_challenge) - mutableGroups.add(0, tavern) - } - if (groups.second != null) { - mutableGroups.add(groups.second) - } - locationAdapter.clear() - locationAdapter.addAll(mutableGroups) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + socialRepository.getUserGroups("guild").zipWith( + userRepository.getUser() + .map { it.party?.id ?: "" } + .distinctUntilChanged() + .flatMap { + if (it.isBlank()) { + return@flatMap Flowable.empty() + } + socialRepository.retrieveGroup(it) + }, + { user, groups -> Pair(user, groups) } + ) + .subscribe( + { groups -> + val mutableGroups = groups.first.toMutableList() + if (groups.first.firstOrNull { it.id == "00000000-0000-4000-A000-000000000000" } == null) { + val tavern = Group() + tavern.id = "00000000-0000-4000-A000-000000000000" + tavern.name = getString(R.string.public_challenge) + mutableGroups.add(0, tavern) + } + if (groups.second != null) { + mutableGroups.add(groups.second) + } + locationAdapter.clear() + locationAdapter.addAll(mutableGroups) + }, + RxErrorHandler.handleEmptyError() + ) + ) binding.challengeLocationSpinner.adapter = locationAdapter binding.challengeLocationSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { @@ -376,7 +388,6 @@ class ChallengeFormActivity : BaseActivity() { addTodo = createTask(resources.getString(R.string.add_todo)) addReward = createTask(resources.getString(R.string.add_reward)) - val taskList = ArrayList() addHabit?.let { taskList.add(it) } addDaily?.let { taskList.add(it) } @@ -384,14 +395,19 @@ class ChallengeFormActivity : BaseActivity() { addReward?.let { taskList.add(it) } challengeTasks.setTasks(taskList) - compositeSubscription.add(challengeTasks.addItemObservable().subscribe({ t -> - when (t) { - addHabit -> openNewTaskActivity(Task.TYPE_HABIT, null) - addDaily -> openNewTaskActivity(Task.TYPE_DAILY, null) - addTodo -> openNewTaskActivity(Task.TYPE_TODO, null) - addReward -> openNewTaskActivity(Task.TYPE_REWARD, null) - } - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + challengeTasks.addItemObservable().subscribe( + { t -> + when (t) { + addHabit -> openNewTaskActivity(Task.TYPE_HABIT, null) + addDaily -> openNewTaskActivity(Task.TYPE_DAILY, null) + addTodo -> openNewTaskActivity(Task.TYPE_TODO, null) + addReward -> openNewTaskActivity(Task.TYPE_REWARD, null) + } + }, + RxErrorHandler.handleEmptyError() + ) + ) binding.createChallengeTaskList.addOnItemTouchListener(object : androidx.recyclerview.widget.RecyclerView.SimpleOnItemTouchListener() { override fun onInterceptTouchEvent(rv: androidx.recyclerview.widget.RecyclerView, e: MotionEvent): Boolean { @@ -405,30 +421,36 @@ class ChallengeFormActivity : BaseActivity() { private fun fillControlsByChallenge() { challengeId?.let { - challengeRepository.getChallenge(it).subscribe({ challenge -> - groupID = challenge.groupId - editMode = true - binding.createChallengeTitle.setText(challenge.name) - binding.createChallengeDescription.setText(challenge.description) - binding.createChallengeTag.setText(challenge.shortName) - binding.createChallengePrize.setText(challenge.prize.toString()) - binding.challengeCreationViews.visibility = View.GONE + challengeRepository.getChallenge(it).subscribe( + { challenge -> + groupID = challenge.groupId + editMode = true + binding.createChallengeTitle.setText(challenge.name) + binding.createChallengeDescription.setText(challenge.description) + binding.createChallengeTag.setText(challenge.shortName) + binding.createChallengePrize.setText(challenge.prize.toString()) + binding.challengeCreationViews.visibility = View.GONE - for (i in 0 until locationAdapter.count) { - val group = locationAdapter.getItem(i) + for (i in 0 until locationAdapter.count) { + val group = locationAdapter.getItem(i) - if (group != null && challenge.groupId == group.id) { - binding.challengeLocationSpinner.setSelection(i) - break + if (group != null && challenge.groupId == group.id) { + binding.challengeLocationSpinner.setSelection(i) + break + } } - } - checkPrizeAndMinimumForTavern() - }, RxErrorHandler.handleEmptyError()) - challengeRepository.getChallengeTasks(it).subscribe({ tasks -> - tasks.forEach { task -> - addOrUpdateTaskInList(task, true) - } - }, RxErrorHandler.handleEmptyError()) + checkPrizeAndMinimumForTavern() + }, + RxErrorHandler.handleEmptyError() + ) + challengeRepository.getChallengeTasks(it).subscribe( + { tasks -> + tasks.forEach { task -> + addOrUpdateTaskInList(task, true) + } + }, + RxErrorHandler.handleEmptyError() + ) } } @@ -480,9 +502,10 @@ class ChallengeFormActivity : BaseActivity() { taskList.remove(addTodo) taskList.remove(addReward) - return challengeRepository.updateChallenge(c, taskList, ArrayList(addedTasks.values), - ArrayList(updatedTasks.values), - ArrayList(removedTasks.keys) + return challengeRepository.updateChallenge( + c, taskList, ArrayList(addedTasks.values), + ArrayList(updatedTasks.values), + ArrayList(removedTasks.keys) ) } @@ -494,7 +517,7 @@ class ChallengeFormActivity : BaseActivity() { Task.TYPE_TODO -> addTodo else -> addReward } - if(!isExistingTask){ + if (!isExistingTask) { // If the task is new we create a unique id for it // Doing it we solve the issue #1278 task.id = UUID.randomUUID().toString() 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 d19d82ef4..4cd9c5a03 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.activities -import android.app.ProgressDialog import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.os.Bundle @@ -27,22 +26,22 @@ class ClassSelectionActivity : BaseActivity(), Consumer { private lateinit var binding: ActivityClassSelectionBinding private var currentClass: String? = null private var newClass: String = "healer" - set(value) { - field = value - when (value) { - "healer" -> healerSelected() - "wizard" -> mageSelected() - "mage" -> mageSelected() - "rogue" -> rogueSelected() - "warrior" -> warriorSelected() + set(value) { + field = value + when (value) { + "healer" -> healerSelected() + "wizard" -> mageSelected() + "mage" -> mageSelected() + "rogue" -> rogueSelected() + "warrior" -> warriorSelected() + } } - } private var className: String? = null - set(value) { - field = value - binding.selectedTitleTextView.text = getString(R.string.x_class, className) - binding.selectedButton.text = getString(R.string.become_x, className) - } + set(value) { + field = value + binding.selectedTitleTextView.text = getString(R.string.x_class, className) + binding.selectedButton.text = getString(R.string.become_x, className) + } private var isInitialSelection: Boolean = false private var classWasUnset: Boolean? = false private var shouldFinish: Boolean? = false @@ -73,17 +72,24 @@ class ClassSelectionActivity : BaseActivity(), Consumer { newClass = currentClass ?: "healer" - compositeSubscription.add(userRepository.getUser().firstElement().subscribe({ - it.preferences?.let {preferences -> - val unmanagedPrefs = userRepository.getUnmanagedCopy(preferences) - unmanagedPrefs.costume = false - setAvatarViews(unmanagedPrefs) - } - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getUser().firstElement().subscribe( + { + it.preferences?.let { preferences -> + val unmanagedPrefs = userRepository.getUnmanagedCopy(preferences) + unmanagedPrefs.costume = false + setAvatarViews(unmanagedPrefs) + } + }, + RxErrorHandler.handleEmptyError() + ) + ) if (!isInitialSelection) { - compositeSubscription.add(userRepository.changeClass() - .subscribe({ classWasUnset = true }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.changeClass() + .subscribe({ classWasUnset = true }, RxErrorHandler.handleEmptyError()) + ) } binding.healerWrapper.setOnClickListener { newClass = "healer" } @@ -93,7 +99,6 @@ class ClassSelectionActivity : BaseActivity(), Consumer { binding.selectedButton.setOnClickListener { displayConfirmationDialogForClass() } } - override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.class_selection, menu) return true @@ -167,7 +172,7 @@ class ClassSelectionActivity : BaseActivity(), Consumer { binding.selectedTitleTextView.setTextColor(ContextCompat.getColor(this, R.color.dark_brown)) binding.selectedDescriptionTextView.setTextColor(ContextCompat.getColor(this, 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)) + updateButtonBackgrounds(binding.healerButton, ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_yellow_border)) } private fun mageSelected() { @@ -177,7 +182,7 @@ class ClassSelectionActivity : BaseActivity(), Consumer { binding.selectedTitleTextView.setTextColor(ContextCompat.getColor(this, R.color.white)) binding.selectedDescriptionTextView.setTextColor(ContextCompat.getColor(this, 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)) + updateButtonBackgrounds(binding.mageButton, ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_blue_border)) } private fun rogueSelected() { @@ -187,7 +192,7 @@ class ClassSelectionActivity : BaseActivity(), Consumer { binding.selectedTitleTextView.setTextColor(ContextCompat.getColor(this, R.color.white)) binding.selectedDescriptionTextView.setTextColor(ContextCompat.getColor(this, 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)) + updateButtonBackgrounds(binding.rogueButton, ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_brand_border)) } private fun warriorSelected() { @@ -197,7 +202,7 @@ class ClassSelectionActivity : BaseActivity(), Consumer { binding.selectedTitleTextView.setTextColor(ContextCompat.getColor(this, R.color.white)) binding.selectedDescriptionTextView.setTextColor(ContextCompat.getColor(this, 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)) + updateButtonBackgrounds(binding.warriorButton, ContextCompat.getDrawable(this, R.drawable.layout_rounded_bg_window_red_border)) } private fun updateButtonBackgrounds(selectedButton: TextView, background: Drawable?) { @@ -225,9 +230,9 @@ class ClassSelectionActivity : BaseActivity(), Consumer { alert.setTitle(getString(R.string.change_class_confirmation)) alert.setMessage(getString(R.string.change_class_equipment_warning, currentClass)) alert.addButton(R.string.choose_class, true) { _, _ -> - selectClass(newClass) - displayClassChanged() - } + selectClass(newClass) + displayClassChanged() + } alert.addButton(R.string.dialog_go_back, false) alert.show() } else { 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 5604383b8..3b0ed2a82 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.activities -import android.app.ProgressDialog import android.graphics.PorterDuff import android.os.Bundle import android.view.Menu @@ -22,7 +21,7 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaProgressDialog import javax.inject.Inject import javax.inject.Named -class FixCharacterValuesActivity: BaseActivity() { +class FixCharacterValuesActivity : BaseActivity() { private lateinit var binding: ActivityFixcharacterBinding @Inject @@ -48,9 +47,14 @@ class FixCharacterValuesActivity: BaseActivity() { setTitle(R.string.fix_character_values) setupToolbar(binding.toolbar) - compositeSubscription.add(repository.getUser(userId).firstElement().subscribe({ - user = it - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + repository.getUser(userId).firstElement().subscribe( + { + user = it + }, + RxErrorHandler.handleEmptyError() + ) + ) setIconBackground(binding.healthIconBackgroundView, ContextCompat.getColor(this, R.color.red_500)) setIconBackground(binding.experienceIconBackgroundView, ContextCompat.getColor(this, R.color.yellow_500)) @@ -82,12 +86,17 @@ class FixCharacterValuesActivity: BaseActivity() { userInfo["stats.mp"] = binding.manaEditText.getDoubleValue() userInfo["stats.lvl"] = binding.levelEditText.getDoubleValue().toInt() userInfo["achievements.streak"] = binding.streakEditText.getDoubleValue().toInt() - compositeSubscription.add(repository.updateUser(userInfo) + compositeSubscription.add( + repository.updateUser(userInfo) .flatMap { repository.retrieveUser(false, true, true) } - .subscribe({}, RxErrorHandler.handleEmptyError(), { - dialog?.dismiss() - finish() - })) + .subscribe( + {}, RxErrorHandler.handleEmptyError(), + { + dialog?.dismiss() + finish() + } + ) + ) return true } @@ -95,12 +104,12 @@ class FixCharacterValuesActivity: BaseActivity() { } private var user: User? = null - set(value) { - field = value - if (value != null) { - updateFields(value) + set(value) { + field = value + if (value != null) { + updateFields(value) + } } - } private fun updateFields(user: User) { val stats = user.stats ?: return @@ -146,5 +155,4 @@ class FixCharacterValuesActivity: BaseActivity() { 0.0 } } - -} \ No newline at end of file +} 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 333c284f8..ce10ecf80 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 @@ -7,7 +7,6 @@ import android.view.* import android.widget.* import androidx.core.content.ContextCompat import androidx.core.os.bundleOf -import androidx.lifecycle.lifecycleScope import coil.load import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent @@ -95,10 +94,15 @@ class FullProfileActivity : BaseActivity() { binding.sendMessageButton.setOnClickListener { showSendMessageToUserDialog() } binding.giftGemsButton.setOnClickListener { MainNavigationController.navigate(R.id.giftGemsActivity, bundleOf(Pair("userID", userID), Pair("username", null))) } binding.giftSubscriptionButton.setOnClickListener { MainNavigationController.navigate(R.id.giftSubscriptionActivity, bundleOf(Pair("userID", userID), Pair("username", null))) } - compositeSubscription.add(userRepository.getUser().subscribe({ - blocks = it.inbox?.blocks ?: listOf() - binding.blockedDisclaimerView.visibility = if (isUserBlocked()) View.VISIBLE else View.GONE - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getUser().subscribe( + { + blocks = it.inbox?.blocks ?: listOf() + binding.blockedDisclaimerView.visibility = if (isUserBlocked()) View.VISIBLE else View.GONE + }, + RxErrorHandler.handleEmptyError() + ) + ) } override fun onDestroy() { @@ -132,16 +136,20 @@ class FullProfileActivity : BaseActivity() { val clipboard = this.getSystemService(Context.CLIPBOARD_SERVICE) as? android.content.ClipboardManager val clip = android.content.ClipData.newPlainText(username, username) clipboard?.setPrimaryClip(clip) - HabiticaSnackbar.showSnackbar(this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup, - String.format(getString(R.string.username_copied), userDisplayName), SnackbarDisplayType.NORMAL) + HabiticaSnackbar.showSnackbar( + this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup, + String.format(getString(R.string.username_copied), userDisplayName), SnackbarDisplayType.NORMAL + ) true } R.id.copy_userid -> { val clipboard = this.getSystemService(Context.CLIPBOARD_SERVICE) as? android.content.ClipboardManager val clip = android.content.ClipData.newPlainText(userID, userID) clipboard?.setPrimaryClip(clip) - HabiticaSnackbar.showSnackbar(this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup, - String.format(getString(R.string.id_copied), userDisplayName), SnackbarDisplayType.NORMAL) + HabiticaSnackbar.showSnackbar( + this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup, + String.format(getString(R.string.id_copied), userDisplayName), SnackbarDisplayType.NORMAL + ) true } R.id.block_user -> { @@ -157,11 +165,16 @@ class FullProfileActivity : BaseActivity() { } private fun useBlock() { - compositeSubscription.add(socialRepository.blockMember(userID).flatMap { - userRepository.retrieveUser() - }.subscribe({ - invalidateOptionsMenu() - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + socialRepository.blockMember(userID).flatMap { + userRepository.retrieveUser() + }.subscribe( + { + invalidateOptionsMenu() + }, + RxErrorHandler.handleEmptyError() + ) + ) } private fun showBlockDialog() { @@ -218,7 +231,6 @@ class FullProfileActivity : BaseActivity() { binding.costumeCard.visibility = View.GONE } - // Load the members achievements now compositeSubscription.add(socialRepository.getMemberAchievements(this.userID).subscribe({ this.fillAchievements(it) }, RxErrorHandler.handleEmptyError())) } @@ -312,12 +324,12 @@ class FullProfileActivity : BaseActivity() { } table.addView(gearRow) - } private fun addLevelAttributes(user: Member) { val byLevelStat = min((user.stats?.lvl ?: 0) / 2.0f, 50f) - addAttributeRow(getString(R.string.profile_level), byLevelStat, byLevelStat, byLevelStat, byLevelStat, + addAttributeRow( + getString(R.string.profile_level), byLevelStat, byLevelStat, byLevelStat, byLevelStat, roundDown = true, isSummary = false ) @@ -371,12 +383,17 @@ class FullProfileActivity : BaseActivity() { private fun addNormalAddBuffAttributes(stats: Stats) { val buffs = stats.buffs - addAttributeRow(getString(R.string.profile_allocated), stats.strength?.toFloat() ?: 0f, stats.intelligence?.toFloat() ?: 0f, stats.constitution?.toFloat() ?: 0f, stats.per?.toFloat() ?: 0f, + addAttributeRow( + getString(R.string.profile_allocated), stats.strength?.toFloat() ?: 0f, stats.intelligence?.toFloat() ?: 0f, stats.constitution?.toFloat() ?: 0f, stats.per?.toFloat() ?: 0f, roundDown = true, isSummary = false ) - addAttributeRow(getString(R.string.buffs), buffs?.str - ?: 0f, buffs?._int ?: 0f, buffs?.con ?: 0f, buffs?.per ?: 0f, roundDown = true, isSummary = false) + addAttributeRow( + getString(R.string.buffs), + buffs?.str + ?: 0f, + buffs?._int ?: 0f, buffs?.con ?: 0f, buffs?.per ?: 0f, roundDown = true, isSummary = false + ) // Summary row addAttributeRow("", attributeStrSum, attributeIntSum, attributeConSum, attributePerSum, roundDown = false, isSummary = true) @@ -399,7 +416,6 @@ class FullProfileActivity : BaseActivity() { val perTextView = tableRow.findViewById(R.id.tv_attribute_per) perTextView?.text = getFloorValueString(perVal, roundDown) - if (isSummary) { strTextView?.setTypeface(null, Typeface.BOLD) intTextView?.setTypeface(null, Typeface.BOLD) @@ -415,23 +431,26 @@ class FullProfileActivity : BaseActivity() { } binding.attributesTableLayout.addView(tableRow) - } private fun toggleAttributeDetails() { attributeDetailsHidden = !attributeDetailsHidden - binding.attributesCollapseIcon.setImageDrawable(ContextCompat.getDrawable(this, if (attributeDetailsHidden) - R.drawable.ic_keyboard_arrow_right_black_24dp - else - R.drawable.ic_keyboard_arrow_down_black_24dp)) + binding.attributesCollapseIcon.setImageDrawable( + ContextCompat.getDrawable( + this, + if (attributeDetailsHidden) + R.drawable.ic_keyboard_arrow_right_black_24dp + else + R.drawable.ic_keyboard_arrow_down_black_24dp + ) + ) for (row in attributeRows) { row.visibility = if (attributeDetailsHidden) View.GONE else View.VISIBLE } } - // endregion // region Navigation @@ -475,5 +494,4 @@ class FullProfileActivity : BaseActivity() { } // endregion - } 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 de7421a03..df45d1046 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.activities - import android.content.Intent import android.os.Bundle import android.view.MenuItem @@ -94,9 +93,9 @@ class GemPurchaseActivity : BaseActivity() { } fragment.setPurchaseHandler(purchaseHandler) supportFragmentManager - .beginTransaction() - .replace(R.id.fragment_container, fragment as Fragment) - .commit() + .beginTransaction() + .replace(R.id.fragment_container, fragment as Fragment) + .commit() this.fragment = fragment } 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 ea982fa21..7b0a654f5 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 @@ -21,7 +21,6 @@ import com.habitrpg.android.habitica.proxy.AnalyticsManager import com.habitrpg.android.habitica.ui.fragments.purchases.GiftBalanceGemsFragment import com.habitrpg.android.habitica.ui.fragments.purchases.GiftPurchaseGemsFragment import com.habitrpg.android.habitica.ui.views.CurrencyView -import com.habitrpg.android.habitica.ui.views.CurrencyViews import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import org.greenrobot.eventbus.Subscribe import javax.inject.Inject @@ -46,7 +45,6 @@ class GiftGemsActivity : BaseActivity() { private var purchaseHandler: PurchaseHandler? = null - private var giftedUsername: String? = null private var giftedUserID: String? = null @@ -73,7 +71,6 @@ class GiftGemsActivity : BaseActivity() { setSupportActionBar(binding.toolbar) binding.toolbarAccessoryContainer.addView(currencyView) - purchaseHandler = PurchaseHandler(this, analyticsManager) supportActionBar?.setDisplayHomeAsUpEnabled(true) @@ -88,16 +85,26 @@ class GiftGemsActivity : BaseActivity() { setViewPagerAdapter() - compositeSubscription.add(socialRepository.getMember(giftedUsername ?: giftedUserID).firstElement().subscribe({ - giftedUserID = it.id - giftedUsername = it.username - purchaseFragment?.giftedMember = it - balanceFragment?.giftedMember = it - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + socialRepository.getMember(giftedUsername ?: giftedUserID).firstElement().subscribe( + { + giftedUserID = it.id + giftedUsername = it.username + purchaseFragment?.giftedMember = it + balanceFragment?.giftedMember = it + }, + RxErrorHandler.handleEmptyError() + ) + ) - compositeSubscription.add(userRepository.getUser().subscribe({ - currencyView.value = it.gemCount.toDouble() - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getUser().subscribe( + { + currencyView.value = it.gemCount.toDouble() + }, + RxErrorHandler.handleEmptyError() + ) + ) } override fun onStart() { @@ -130,13 +137,13 @@ class GiftGemsActivity : BaseActivity() { override fun getItem(position: Int): Fragment { return if (position == 0) { - val fragment = GiftPurchaseGemsFragment() + val fragment = GiftPurchaseGemsFragment() fragment.setPurchaseHandler(purchaseHandler) fragment.setupCheckout() purchaseFragment = fragment fragment } else { - val fragment = GiftBalanceGemsFragment() + val fragment = GiftBalanceGemsFragment() fragment.onCompleted = { displayConfirmationDialog() } @@ -182,4 +189,4 @@ class GiftGemsActivity : BaseActivity() { } alert.enqueue() } -} \ No newline at end of file +} 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 b7876d5e0..3b51ae453 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 @@ -25,7 +25,6 @@ import org.solovyev.android.checkout.Inventory import org.solovyev.android.checkout.Sku import javax.inject.Inject - class GiftSubscriptionActivity : BaseActivity() { private lateinit var binding: ActivityGiftSubscriptionBinding @@ -79,14 +78,19 @@ class GiftSubscriptionActivity : BaseActivity() { selectedSubscriptionSku?.let { sku -> purchaseSubscription(sku) } } - compositeSubscription.add(socialRepository.getMember(giftedUsername ?: giftedUserID).subscribe({ - binding.avatarView.setAvatar(it) - binding.displayNameTextView.username = it.profile?.name - binding.displayNameTextView.tier = it.contributor?.level ?: 0 - binding.usernameTextView.text = "@${it.username}" - giftedUserID = it.id - giftedUsername = it.username - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + socialRepository.getMember(giftedUsername ?: giftedUserID).subscribe( + { + binding.avatarView.setAvatar(it) + binding.displayNameTextView.username = it.profile?.name + binding.displayNameTextView.tier = it.contributor?.level ?: 0 + binding.usernameTextView.text = "@${it.username}" + giftedUserID = it.id + giftedUsername = it.username + }, + RxErrorHandler.handleEmptyError() + ) + ) if (appConfigManager.activePromo()?.identifier == "g1g1") { binding.giftSubscriptionContainer.visibility = View.VISIBLE @@ -185,7 +189,6 @@ class GiftSubscriptionActivity : BaseActivity() { purchaseHandler?.purchaseNoRenewSubscription(sku) } - @Subscribe fun onConsumablePurchased(event: ConsumablePurchasedEvent) { purchaseHandler?.consumePurchase(event.purchase) @@ -205,18 +208,21 @@ class GiftSubscriptionActivity : BaseActivity() { } private fun displayConfirmationDialog() { - val message = getString(if (appConfigManager.activePromo()?.identifier == "g1g1") { - R.string.gift_confirmation_text_sub_g1g1 - } else { - R.string.gift_confirmation_text_sub - }, giftedUsername, selectedDurationString()) + val message = getString( + if (appConfigManager.activePromo()?.identifier == "g1g1") { + R.string.gift_confirmation_text_sub_g1g1 + } else { + R.string.gift_confirmation_text_sub + }, + giftedUsername, selectedDurationString() + ) val alert = HabiticaAlertDialog(this) alert.setTitle(R.string.gift_confirmation_title) alert.setMessage(message) alert.addOkButton { dialog, _ -> - dialog.dismiss() - finish() - } + dialog.dismiss() + finish() + } alert.enqueue() } -} \ No newline at end of file +} 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 4ac6a5e35..5a28d94a9 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 @@ -8,7 +8,6 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.ActivityGroupFormBinding import com.habitrpg.android.habitica.ui.helpers.AutocompleteAdapter -import com.habitrpg.android.habitica.ui.helpers.AutocompleteTokenizer import com.habitrpg.android.habitica.ui.helpers.MarkdownParser import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard @@ -37,7 +36,7 @@ class GroupFormActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - intent.extras?.let {bundle -> + intent.extras?.let { bundle -> groupID = bundle.getString("groupID") groupType = bundle.getString("groupType") groupName = bundle.getString("name") @@ -66,7 +65,6 @@ class GroupFormActivity : BaseActivity() { } } - override fun injectActivity(component: UserComponent?) { component?.inject(this) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt index 2b59fc38e..d37f79f7f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt @@ -14,8 +14,6 @@ import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.databinding.ActivityPartyInviteBinding import com.habitrpg.android.habitica.extensions.runDelayed -import com.habitrpg.android.habitica.helpers.RxErrorHandler -import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard @@ -26,7 +24,6 @@ import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Named - class GroupInviteActivity : BaseActivity() { private lateinit var binding: ActivityPartyInviteBinding 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 914f32a30..e5ba51b91 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 @@ -11,8 +11,7 @@ import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader - -class GuidelinesActivity: BaseActivity() { +class GuidelinesActivity : BaseActivity() { override fun getLayoutResId(): Int = R.layout.activity_guidelines override fun injectActivity(component: UserComponent?) { /* no-on */ } @@ -51,4 +50,4 @@ class GuidelinesActivity: BaseActivity() { else -> super.onOptionsItemSelected(item) } } -} \ No newline at end of file +} 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 34ffbc798..9deee0e04 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 @@ -69,9 +69,11 @@ class HabitButtonWidgetActivity : BaseActivity() { } adapter = SkillTasksRecyclerViewAdapter() - adapter?.getTaskSelectionEvents()?.subscribe({ task -> taskSelected(task.id) }, - RxErrorHandler.handleEmptyError()) - ?.let { compositeSubscription.add(it) } + adapter?.getTaskSelectionEvents()?.subscribe( + { task -> taskSelected(task.id) }, + RxErrorHandler.handleEmptyError() + ) + ?.let { compositeSubscription.add(it) } binding.recyclerView.adapter = adapter compositeSubscription.add(taskRepository.getTasks(Task.TYPE_HABIT, userId).subscribe({ adapter?.data = it }, RxErrorHandler.handleEmptyError())) 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 e1fa54372..c5086066e 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 @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.ui.activities import android.content.Intent -import android.os.Build import android.os.Bundle import android.view.View import android.view.ViewGroup @@ -21,7 +20,6 @@ import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment import com.viewpagerindicator.IconPagerAdapter import javax.inject.Inject - class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChangeListener { private lateinit var binding: ActivityIntroBinding @@ -48,7 +46,6 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan compositeSubscription.add(contentRepository.retrieveContent(this).subscribe({ }, RxErrorHandler.handleEmptyError())) - window.statusBarColor = ContextCompat.getColor(this, R.color.black_20_alpha) window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) } 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 3b58033bb..833359ed6 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 @@ -23,7 +23,11 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.preference.PreferenceManager -import com.facebook.* +import com.facebook.AccessToken +import com.facebook.CallbackManager +import com.facebook.FacebookCallback +import com.facebook.FacebookException +import com.facebook.FacebookSdk import com.facebook.login.LoginManager import com.facebook.login.LoginResult import com.google.android.gms.auth.GoogleAuthException @@ -100,11 +104,13 @@ class LoginActivity : BaseActivity(), Consumer { return@OnClickListener } apiClient.registerUser(username, email, password, confirmPassword) - .subscribe(this@LoginActivity, - { - hideProgress() - RxErrorHandler.reportError(it) - }) + .subscribe( + this@LoginActivity, + { + hideProgress() + RxErrorHandler.reportError(it) + } + ) } else { val username: String = binding.username.text.toString().trim { it <= ' ' } val password: String = binding.password.text.toString() @@ -112,11 +118,13 @@ class LoginActivity : BaseActivity(), Consumer { showValidationError(R.string.login_validation_error_fieldsmissing) return@OnClickListener } - apiClient.connectUser(username, password).subscribe(this@LoginActivity, - { - hideProgress() - RxErrorHandler.reportError(it) - }) + apiClient.connectUser(username, password).subscribe( + this@LoginActivity, + { + hideProgress() + RxErrorHandler.reportError(it) + } + ) } } @@ -132,8 +140,8 @@ class LoginActivity : BaseActivity(), Consumer { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - supportActionBar?.hide() - //Set default values to avoid null-responses when requesting unedited settings + supportActionBar?.hide() + // Set default values to avoid null-responses when requesting unedited settings PreferenceManager.setDefaultValues(this, R.xml.preferences_fragment, false) setupFacebookLogin() @@ -164,9 +172,9 @@ class LoginActivity : BaseActivity(), Consumer { binding.googleLoginButton.setOnClickListener { handleGoogleLogin() } binding.appleLoginButton.setOnClickListener { val configuration = SignInWithAppleConfiguration( - clientId = BuildConfig.APPLE_AUTH_CLIENT_ID, - redirectUri = "${hostConfig.address}/api/v4/user/auth/apple", - scope = "name email" + clientId = BuildConfig.APPLE_AUTH_CLIENT_ID, + redirectUri = "${hostConfig.address}/api/v4/user/auth/apple", + scope = "name email" ) val fragmentTag = "SignInWithAppleButton-SignInWebViewDialogFragment" @@ -190,21 +198,24 @@ class LoginActivity : BaseActivity(), Consumer { private fun setupFacebookLogin() { callbackManager = CallbackManager.Factory.create() - loginManager.registerCallback(callbackManager, - object : FacebookCallback { - override fun onSuccess(loginResult: LoginResult) { - val accessToken = AccessToken.getCurrentAccessToken() - compositeSubscription.add(apiClient.connectSocial("facebook", accessToken.userId, accessToken.token) - .subscribe(this@LoginActivity, RxErrorHandler.handleEmptyError())) - } + loginManager.registerCallback( + callbackManager, + object : FacebookCallback { + override fun onSuccess(loginResult: LoginResult) { + val accessToken = AccessToken.getCurrentAccessToken() + compositeSubscription.add( + apiClient.connectSocial("facebook", accessToken?.userId ?: "", accessToken?.token ?: "") + .subscribe(this@LoginActivity, RxErrorHandler.handleEmptyError()) + ) + } - override fun onCancel() { /* no-on */ } - - override fun onError(exception: FacebookException) { - exception.printStackTrace() - } - }) + override fun onCancel() { /* no-on */ } + override fun onError(exception: FacebookException) { + exception.printStackTrace() + } + } + ) } override fun onBackPressed() { @@ -286,11 +297,13 @@ class LoginActivity : BaseActivity(), Consumer { callbackManager.onActivityResult(requestCode, resultCode, data) if (requestCode == FacebookSdk.getCallbackRequestCodeOffset()) { - //This is necessary because the regular login callback is not called for some reason + // This is necessary because the regular login callback is not called for some reason val accessToken = AccessToken.getCurrentAccessToken() if (accessToken != null && accessToken.token != null) { - compositeSubscription.add(apiClient.connectSocial("facebook", accessToken.userId, accessToken.token) - .subscribe(this@LoginActivity, { hideProgress() })) + compositeSubscription.add( + apiClient.connectSocial("facebook", accessToken.userId, accessToken.token) + .subscribe(this@LoginActivity, { hideProgress() }) + ) } } } @@ -307,20 +320,19 @@ class LoginActivity : BaseActivity(), Consumer { this.apiClient.updateAuthenticationCredentials(user, api) sharedPrefs.edit { putString(getString(R.string.SP_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(getString(R.string.SP_APIToken), api) + 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(getString(R.string.SP_APIToken), api) + } } } @@ -358,15 +370,20 @@ class LoginActivity : BaseActivity(), Consumer { FirebaseAnalytics.getInstance(this).logEvent("user_registered", null) } - compositeSubscription.add(userRepository.retrieveUser(withTasks = true, forced = true) - .subscribe({ - if (userAuthResponse.newUser) { - this.startSetupActivity() - } else { - this.startMainActivity() - AmplitudeManager.sendEvent("login", AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, AmplitudeManager.EVENT_HITTYPE_EVENT) - } - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.retrieveUser(withTasks = true, forced = true) + .subscribe( + { + if (userAuthResponse.newUser) { + this.startSetupActivity() + } else { + this.startMainActivity() + AmplitudeManager.sendEvent("login", AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, AmplitudeManager.EVENT_HITTYPE_EVENT) + } + }, + RxErrorHandler.handleEmptyError() + ) + ) } private fun handleFacebookLogin() { @@ -378,8 +395,10 @@ class LoginActivity : BaseActivity(), Consumer { return } val accountTypes = arrayOf("com.google") - val intent = AccountManager.newChooseAccountIntent(null, null, - accountTypes, true, null, null, null, null) + val intent = AccountManager.newChooseAccountIntent( + null, null, + accountTypes, true, null, null, null, null + ) try { pickAccountResult.launch(intent) } catch (e: ActivityNotFoundException) { @@ -401,31 +420,34 @@ class LoginActivity : BaseActivity(), Consumer { private fun handleGoogleLoginResult() { val scopesString = Scopes.PROFILE + " " + Scopes.EMAIL val scopes = "oauth2:$scopesString" - compositeSubscription.add(Flowable.defer { - try { - @Suppress("Deprecation") - return@defer Flowable.just(GoogleAuthUtil.getToken(this, googleEmail, scopes)) - } catch (e: IOException) { - throw Exceptions.propagate(e) - } catch (e: GoogleAuthException) { - throw Exceptions.propagate(e) + compositeSubscription.add( + Flowable.defer { + try { + @Suppress("Deprecation") + return@defer Flowable.just(GoogleAuthUtil.getToken(this, googleEmail, scopes)) + } catch (e: IOException) { + throw Exceptions.propagate(e) + } catch (e: GoogleAuthException) { + throw Exceptions.propagate(e) + } catch (e: UserRecoverableException) { + return@defer Flowable.empty() + } } - catch (e: UserRecoverableException) { - return@defer Flowable.empty() - } - } .subscribeOn(Schedulers.io()) .flatMap { token -> apiClient.connectSocial("google", googleEmail ?: "", token) } - .subscribe(this@LoginActivity, { throwable -> - throwable.printStackTrace() - hideProgress() - throwable.cause?.let { - if (GoogleAuthException::class.java.isAssignableFrom(it.javaClass)) { - handleGoogleAuthException(throwable.cause as GoogleAuthException) + .subscribe( + this@LoginActivity, + { throwable -> + throwable.printStackTrace() + hideProgress() + throwable.cause?.let { + if (GoogleAuthException::class.java.isAssignableFrom(it.javaClass)) { + handleGoogleAuthException(throwable.cause as GoogleAuthException) + } } } - - })) + ) + ) } private fun handleGoogleAuthException(e: Exception) { @@ -434,13 +456,14 @@ class LoginActivity : BaseActivity(), Consumer { // Show a dialog created by Google Play services that allows // the user to update the APK val statusCode = e - .connectionStatusCode + .connectionStatusCode GoogleApiAvailability.getInstance() @Suppress("DEPRECATION") - GooglePlayServicesUtil.showErrorDialogFragment(statusCode, - this@LoginActivity, - REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR) { - + GooglePlayServicesUtil.showErrorDialogFragment( + statusCode, + this@LoginActivity, + REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR + ) { } } else if (e is UserRecoverableAuthException) { // Unable to authenticate, such as when the user has not yet granted @@ -488,7 +511,6 @@ class LoginActivity : BaseActivity(), Consumer { } } - private fun showForm() { isShowingForm = true val panAnimation = ObjectAnimator.ofInt(binding.backgroundContainer, "scrollY", 0).setDuration(1000) @@ -578,16 +600,17 @@ class LoginActivity : BaseActivity(), Consumer { } input.inputType = InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS val lp = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT) + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) input.layoutParams = lp val alertDialog = HabiticaAlertDialog(this) alertDialog.setTitle(R.string.forgot_password_title) alertDialog.setMessage(R.string.forgot_password_description) alertDialog.setAdditionalContentView(input) alertDialog.addButton(R.string.send, true) { _, _ -> - userRepository.sendPasswordResetEmail(input.text.toString()).subscribe({ showPasswordEmailConfirmation() }, RxErrorHandler.handleEmptyError()) - } + userRepository.sendPasswordResetEmail(input.text.toString()).subscribe({ showPasswordEmailConfirmation() }, RxErrorHandler.handleEmptyError()) + } alertDialog.addCancelButton() alertDialog.show() } @@ -609,7 +632,6 @@ class LoginActivity : BaseActivity(), Consumer { private const val REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR = 1001 private const val PLAY_SERVICES_RESOLUTION_REQUEST = 9000 - fun show(v: View) { v.visibility = View.VISIBLE } 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 a6847701b..ee94c3086 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 @@ -71,8 +71,8 @@ import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider import com.habitrpg.android.habitica.widget.DailiesWidgetProvider import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider import com.habitrpg.android.habitica.widget.TodoListWidgetProvider -import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.schedulers.Schedulers import io.realm.kotlin.isValid @@ -124,10 +124,9 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { lateinit var binding: ActivityMainBinding val snackbarContainer: ViewGroup - get() = binding.snackbarContainer + get() = binding.snackbarContainer var user: User? = null - private var avatarInHeader: AvatarWithBarsViewModel? = null var notificationsViewModel: NotificationsViewModel? = null private var faintDialog: HabiticaAlertDialog? = null @@ -145,7 +144,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { val isAppBarExpanded: Boolean get() = binding.appbar.height - binding.appbar.bottom == 0 - override fun getLayoutResId(): Int { return R.layout.activity_main } @@ -161,12 +159,10 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { try { launchTrace = FirebasePerformance.getInstance().newTrace("MainActivityLaunch") } catch (_: IllegalStateException) { - } launchTrace?.start() super.onCreate(savedInstanceState) - if (!HabiticaBaseApplication.checkUserAuthentication(this, hostConfig)) { return } @@ -177,14 +173,21 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { avatarInHeader = AvatarWithBarsViewModel(this, binding.avatarWithBars, userRepository) sideAvatarView = AvatarView(this, showBackground = true, showMount = false, showPet = false) - compositeSubscription.add(userRepository.getUser() - .subscribe({ newUser -> - this@MainActivity.user = newUser - this@MainActivity.setUserData() - }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(userRepository.getUserQuestStatus().subscribeWithErrorHandler { - userQuestStatus = it - }) + compositeSubscription.add( + userRepository.getUser() + .subscribe( + { newUser -> + this@MainActivity.user = newUser + this@MainActivity.setUserData() + }, + RxErrorHandler.handleEmptyError() + ) + ) + compositeSubscription.add( + userRepository.getUserQuestStatus().subscribeWithErrorHandler { + userQuestStatus = it + } + ) val viewModel = ViewModelProvider(this).get(NotificationsViewModel::class.java) notificationsViewModel = viewModel @@ -196,10 +199,10 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { drawerFragment?.setUp(R.id.navigation_drawer, drawerLayout, viewModel) drawerToggle = object : ActionBarDrawerToggle( - this, /* host Activity */ - drawerLayout, /* DrawerLayout object */ - R.string.navigation_drawer_open, /* "open drawer" description */ - R.string.navigation_drawer_close /* "close drawer" description */ + this, /* host Activity */ + drawerLayout, /* DrawerLayout object */ + R.string.navigation_drawer_open, /* "open drawer" description */ + R.string.navigation_drawer_close /* "close drawer" description */ ) {} drawerToggle?.drawerArrowDrawable = drawerIcon // Set the drawer toggle as the DrawerListener @@ -240,7 +243,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { } override fun onDrawerStateChanged(newState: Int) { - } }) @@ -277,14 +279,19 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { "" } if (destination.id == R.id.petDetailRecyclerFragment || destination.id == R.id.mountDetailRecyclerFragment) { - compositeSubscription.add(inventoryRepository.getItem("egg", arguments?.getString("type") ?: "").firstElement().subscribe({ - if (!it.isValid()) return@subscribe - binding.toolbarTitle.text = if (destination.id == R.id.petDetailRecyclerFragment) { - (it as? Egg)?.text - } else { - (it as? Egg)?.mountText - } - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + inventoryRepository.getItem("egg", arguments?.getString("type") ?: "").firstElement().subscribe( + { + if (!it.isValid()) return@subscribe + binding.toolbarTitle.text = if (destination.id == R.id.petDetailRecyclerFragment) { + (it as? Egg)?.text + } else { + (it as? Egg)?.mountText + } + }, + RxErrorHandler.handleEmptyError() + ) + ) } drawerFragment?.setSelection(destination.id, null, false) } @@ -299,9 +306,10 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channelId = "default" val channel = NotificationChannel( - channelId, - "Habitica Notifications", - NotificationManager.IMPORTANCE_DEFAULT) + channelId, + "Habitica Notifications", + NotificationManager.IMPORTANCE_DEFAULT + ) val manager = getSystemService(NotificationManager::class.java) manager?.createNotificationChannel(channel) } @@ -362,13 +370,13 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { } launchScreen = null - if(!resumeFromActivity){ + if (!resumeFromActivity) { retrieveUser() this.checkMaintenance() } resumeFromActivity = false - //Track when the app was last opened, so that we can use this to send out special reminders after a week of inactivity + // 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) @@ -394,7 +402,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { launchTrace?.stop() launchTrace = null - if (binding.toolbarTitle.text?.isNotBlank() != true) { navigationController.currentDestination?.let { updateToolbarTitle(it, null) } } @@ -456,11 +463,16 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { val quest = user?.party?.quest if (quest?.completed?.isNotBlank() == true) { - compositeSubscription.add(inventoryRepository.getQuestContent(user?.party?.quest?.completed ?: "").firstElement().subscribe({ - QuestCompletedDialog.showWithQuest(this, it) + compositeSubscription.add( + inventoryRepository.getQuestContent(user?.party?.quest?.completed ?: "").firstElement().subscribe( + { + QuestCompletedDialog.showWithQuest(this, it) - userRepository.updateUser("party.quest.completed", "").subscribe({}, RxErrorHandler.handleEmptyError()) - }, RxErrorHandler.handleEmptyError())) + userRepository.updateUser("party.quest.completed", "").subscribe({}, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) + ) } if (user?.flags?.welcomed == false) { @@ -517,34 +529,39 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { return } val pet = event.usingPet - compositeSubscription.add(this.inventoryRepository.feedPet(event.usingPet, event.usingFood) - .subscribe({ feedResponse -> - HabiticaSnackbar.showSnackbar(snackbarContainer, feedResponse.message, SnackbarDisplayType.NORMAL) - if (feedResponse.value == -1) { - val mountWrapper = View.inflate(this, R.layout.pet_imageview, null) as? FrameLayout - val mountImageView = mountWrapper?.findViewById(R.id.pet_imageview) as? ImageView + compositeSubscription.add( + this.inventoryRepository.feedPet(event.usingPet, event.usingFood) + .subscribe( + { feedResponse -> + HabiticaSnackbar.showSnackbar(snackbarContainer, feedResponse.message, SnackbarDisplayType.NORMAL) + if (feedResponse.value == -1) { + val mountWrapper = View.inflate(this, R.layout.pet_imageview, null) as? FrameLayout + val mountImageView = mountWrapper?.findViewById(R.id.pet_imageview) as? ImageView - DataBindingUtils.loadImage(mountImageView, "Mount_Icon_" + event.usingPet.key) - val dialog = HabiticaAlertDialog(this@MainActivity) - dialog.setTitle(getString(R.string.evolved_pet_title, pet.text)) - dialog.setAdditionalContentView(mountWrapper) - dialog.addButton(R.string.onwards, true) - dialog.addButton(R.string.share, false) { hatchingDialog, _ -> - val event1 = ShareEvent() - event1.identifier = "raisedPet" - event1.sharedMessage = getString(R.string.share_raised, pet.text) - val mountImageSideLength = 99 - val sharedImage = Bitmap.createBitmap(mountImageSideLength, mountImageSideLength, Bitmap.Config.ARGB_8888) - val canvas = Canvas(sharedImage) - mountImageView?.drawable?.setBounds(0, 0, mountImageSideLength, mountImageSideLength) - mountImageView?.drawable?.draw(canvas) - event1.shareImage = sharedImage - EventBus.getDefault().post(event1) - hatchingDialog.dismiss() - } - dialog.enqueue() - } - }, RxErrorHandler.handleEmptyError())) + DataBindingUtils.loadImage(mountImageView, "Mount_Icon_" + event.usingPet.key) + val dialog = HabiticaAlertDialog(this@MainActivity) + dialog.setTitle(getString(R.string.evolved_pet_title, pet.text)) + dialog.setAdditionalContentView(mountWrapper) + dialog.addButton(R.string.onwards, true) + dialog.addButton(R.string.share, false) { hatchingDialog, _ -> + val event1 = ShareEvent() + event1.identifier = "raisedPet" + event1.sharedMessage = getString(R.string.share_raised, pet.text) + val mountImageSideLength = 99 + val sharedImage = Bitmap.createBitmap(mountImageSideLength, mountImageSideLength, Bitmap.Config.ARGB_8888) + val canvas = Canvas(sharedImage) + mountImageView?.drawable?.setBounds(0, 0, mountImageSideLength, mountImageSideLength) + mountImageView?.drawable?.draw(canvas) + event1.shareImage = sharedImage + EventBus.getDefault().post(event1) + hatchingDialog.dismiss() + } + dialog.enqueue() + } + }, + RxErrorHandler.handleEmptyError() + ) + ) } // endregion @@ -555,20 +572,27 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { UserQuestStatus.QUEST_BOSS -> data.questDamage else -> 0.0 } - compositeSubscription.add(notifyUserUseCase.observable(NotifyUserUseCase.RequestValues(this, snackbarContainer, - user, data.experienceDelta, data.healthDelta, data.goldDelta, data.manaDelta, damageValue, data.hasLeveledUp, data.level)) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + notifyUserUseCase.observable( + NotifyUserUseCase.RequestValues( + this, snackbarContainer, + user, data.experienceDelta, data.healthDelta, data.goldDelta, data.manaDelta, damageValue, data.hasLeveledUp, data.level + ) + ) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } val showItemsFound = when (userQuestStatus) { UserQuestStatus.QUEST_COLLECT -> true else -> false } - compositeSubscription.add(displayItemDropUseCase.observable(DisplayItemDropUseCase.RequestValues(data, this, snackbarContainer, showItemsFound)) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + displayItemDropUseCase.observable(DisplayItemDropUseCase.RequestValues(data, this, snackbarContainer, showItemsFound)) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } - private fun displayDeathDialogIfNeeded() { if (user?.stats?.hp ?: 1.0 > 0) { return @@ -591,17 +615,16 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { faintDialog?.setTitle(R.string.faint_header) faintDialog?.setAdditionalContentView(customView) faintDialog?.addButton(R.string.faint_button, true) { _, _ -> - faintDialog = null - user?.let { - userRepository.revive(it).subscribe({ }, RxErrorHandler.handleEmptyError()) - } - } + faintDialog = null + user?.let { + userRepository.revive(it).subscribe({ }, RxErrorHandler.handleEmptyError()) + } + } soundManager.loadAndPlayAudio(SoundManager.SoundDeath) this.faintDialog?.enqueue() } } - override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { if (keyCode == KeyEvent.KEYCODE_MENU) { drawerFragment?.openDrawer() @@ -615,18 +638,19 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { if (hostConfig.hasAuthentication()) { compositeSubscription.add( contentRepository.retrieveWorldState(this) - .flatMap { userRepository.retrieveUser(true, forced) } - .doOnNext { user1 -> - FirebaseAnalytics.getInstance(this).setUserProperty("has_party", if (user1.party?.id?.isNotEmpty() == true) "true" else "false") - FirebaseAnalytics.getInstance(this).setUserProperty("is_subscribed", if (user1.isSubscribed) "true" else "false") - FirebaseAnalytics.getInstance(this).setUserProperty("checkin_count", user1.loginIncentives.toString()) - FirebaseAnalytics.getInstance(this).setUserProperty("level", user1.stats?.lvl?.toString() ?: "") - pushNotificationManager.setUser(user1) - pushNotificationManager.addPushDeviceUsingStoredToken() - } - .flatMap { userRepository.retrieveTeamPlans() } - .flatMap { contentRepository.retrieveContent(this) } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .flatMap { userRepository.retrieveUser(true, forced) } + .doOnNext { user1 -> + FirebaseAnalytics.getInstance(this).setUserProperty("has_party", if (user1.party?.id?.isNotEmpty() == true) "true" else "false") + FirebaseAnalytics.getInstance(this).setUserProperty("is_subscribed", if (user1.isSubscribed) "true" else "false") + FirebaseAnalytics.getInstance(this).setUserProperty("checkin_count", user1.loginIncentives.toString()) + FirebaseAnalytics.getInstance(this).setUserProperty("level", user1.stats?.lvl?.toString() ?: "") + pushNotificationManager.setUser(user1) + pushNotificationManager.addPushDeviceUsingStoredToken() + } + .flatMap { userRepository.retrieveTeamPlans() } + .flatMap { contentRepository.retrieveContent(this) } + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } } @@ -663,8 +687,10 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { } override fun onTutorialCompleted(step: TutorialStep) { - compositeSubscription.add(userRepository.updateUser("flags.tutorial." + step.tutorialGroup + "." + step.identifier, true) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.updateUser("flags.tutorial." + step.tutorialGroup + "." + step.identifier, true) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) binding.overlayFrameLayout.removeView(this.activeTutorialView) this.removeActiveTutorialView() @@ -695,7 +721,8 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { sharingIntent.putExtra(Intent.EXTRA_TEXT, event.sharedMessage) BitmapUtils.clearDirectoryContent("$filesDir/shared_images") val f = event.shareImage?.let { - BitmapUtils.saveToShareableFile("$filesDir/shared_images", "${Date()}.png", + BitmapUtils.saveToShareableFile( + "$filesDir/shared_images", "${Date()}.png", it ) } @@ -712,32 +739,36 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { } private fun checkMaintenance() { - compositeSubscription.add(this.maintenanceService.maintenanceStatus + compositeSubscription.add( + this.maintenanceService.maintenanceStatus .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(Consumer { maintenanceResponse -> - if (maintenanceResponse == null) { - return@Consumer - } - if (maintenanceResponse.activeMaintenance) { - val intent = createMaintenanceIntent(maintenanceResponse, false) - startActivity(intent) - } else { - if (maintenanceResponse.minBuild != null) { - try { - val packageInfo = packageManager.getPackageInfo(packageName, 0) - @Suppress("DEPRECATION") - if (packageInfo.versionCode < maintenanceResponse.minBuild) { - val intent = createMaintenanceIntent(maintenanceResponse, true) - startActivity(intent) - } - } catch (e: PackageManager.NameNotFoundException) { - e.printStackTrace() - } - + .subscribe( + Consumer { maintenanceResponse -> + if (maintenanceResponse == null) { + return@Consumer } - } - }, RxErrorHandler.handleEmptyError())) + if (maintenanceResponse.activeMaintenance) { + val intent = createMaintenanceIntent(maintenanceResponse, false) + startActivity(intent) + } else { + if (maintenanceResponse.minBuild != null) { + try { + val packageInfo = packageManager.getPackageInfo(packageName, 0) + @Suppress("DEPRECATION") + if (packageInfo.versionCode < maintenanceResponse.minBuild) { + val intent = createMaintenanceIntent(maintenanceResponse, true) + startActivity(intent) + } + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + } + } + }, + RxErrorHandler.handleEmptyError() + ) + ) } private fun createMaintenanceIntent(maintenanceResponse: MaintenanceResponse, isDeprecationNotice: Boolean): Intent { @@ -788,7 +819,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { alert.setTitle(title) alert.addButton(R.string.see_you_tomorrow, true) { _, _ -> apiClient.readNotification(event.notification.id) - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .subscribe({ }, RxErrorHandler.handleEmptyError()) } alert.show() } @@ -803,7 +834,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { dialog.setType(event.type, event.message, event.text) dialog.enqueue() apiClient.readNotification(event.id) - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .subscribe({ }, RxErrorHandler.handleEmptyError()) } } @@ -827,7 +858,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { dialog.configure(event.data) dialog.enqueue() apiClient.readNotification(event.id) - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .subscribe({ }, RxErrorHandler.handleEmptyError()) } } @@ -837,45 +868,52 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { } else { binding.connectionIssueTextview.visibility = View.VISIBLE binding.connectionIssueTextview.text = event.message - compositeSubscription.add(Observable.just("") + compositeSubscription.add( + Observable.just("") .delay(500, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()) - .subscribe( { - binding.connectionIssueTextview.visibility = View.GONE - }, {})) + .subscribe( + { + binding.connectionIssueTextview.visibility = View.GONE + }, + {} + ) + ) } } fun hatchPet(potion: HatchingPotion, egg: Egg) { - compositeSubscription.add(this.inventoryRepository.hatchPet(egg, potion) { - val petWrapper = View.inflate(this, R.layout.pet_imageview, null) as? FrameLayout - val petImageView = petWrapper?.findViewById(R.id.pet_imageview) as? ImageView + compositeSubscription.add( + this.inventoryRepository.hatchPet(egg, potion) { + val petWrapper = View.inflate(this, R.layout.pet_imageview, null) as? FrameLayout + val petImageView = petWrapper?.findViewById(R.id.pet_imageview) as? ImageView - DataBindingUtils.loadImage(petImageView, "stable_Pet-" + egg.key + "-" + potion.key) - val potionName = potion.text - val eggName = egg.text - val dialog = HabiticaAlertDialog(this) - dialog.setTitle(getString(R.string.hatched_pet_title, potionName, eggName)) - dialog.setAdditionalContentView(petWrapper) - dialog.addButton(R.string.equip, true) { _, _ -> - inventoryRepository.equip(user, "pet", egg.key + "-" + potion.key) + DataBindingUtils.loadImage(petImageView, "stable_Pet-" + egg.key + "-" + potion.key) + val potionName = potion.text + val eggName = egg.text + val dialog = HabiticaAlertDialog(this) + dialog.setTitle(getString(R.string.hatched_pet_title, potionName, eggName)) + dialog.setAdditionalContentView(petWrapper) + dialog.addButton(R.string.equip, true) { _, _ -> + inventoryRepository.equip(user, "pet", egg.key + "-" + potion.key) .subscribe({}, RxErrorHandler.handleEmptyError()) - } - dialog.addButton(R.string.share, false) { hatchingDialog, _ -> - val event1 = ShareEvent() - event1.sharedMessage = getString(R.string.share_hatched, potionName, eggName) - event1.identifier = "hatchedPet" - val petImageSideLength = 140 - val sharedImage = Bitmap.createBitmap(petImageSideLength, petImageSideLength, Bitmap.Config.ARGB_8888) - val canvas = Canvas(sharedImage) - petImageView?.drawable?.setBounds(0, 0, petImageSideLength, petImageSideLength) - petImageView?.drawable?.draw(canvas) - event1.shareImage = sharedImage - EventBus.getDefault().post(event1) - hatchingDialog.dismiss() - } - dialog.setExtraCloseButtonVisibility(View.VISIBLE) - dialog.enqueue() - }.subscribe({ }, RxErrorHandler.handleEmptyError())) + } + dialog.addButton(R.string.share, false) { hatchingDialog, _ -> + val event1 = ShareEvent() + event1.sharedMessage = getString(R.string.share_hatched, potionName, eggName) + event1.identifier = "hatchedPet" + val petImageSideLength = 140 + val sharedImage = Bitmap.createBitmap(petImageSideLength, petImageSideLength, Bitmap.Config.ARGB_8888) + val canvas = Canvas(sharedImage) + petImageView?.drawable?.setBounds(0, 0, petImageSideLength, petImageSideLength) + petImageView?.drawable?.draw(canvas) + event1.shareImage = sharedImage + EventBus.getDefault().post(event1) + hatchingDialog.dismiss() + } + dialog.setExtraCloseButtonVisibility(View.VISIBLE) + dialog.enqueue() + }.subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } @Suppress("UNUSED_PARAMETER") 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 7471602d1..86f864825 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 @@ -66,14 +66,19 @@ class MaintenanceActivity : BaseActivity() { override fun onResume() { super.onResume() if (!isDeprecationNotice) { - compositeSubscription.add(this.maintenanceService.maintenanceStatus + compositeSubscription.add( + this.maintenanceService.maintenanceStatus .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ maintenanceResponse -> - if (!maintenanceResponse.activeMaintenance) { - finish() - } - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { maintenanceResponse -> + if (!maintenanceResponse.activeMaintenance) { + finish() + } + }, + RxErrorHandler.handleEmptyError() + ) + ) } } @@ -84,6 +89,5 @@ class MaintenanceActivity : BaseActivity() { } catch (anfe: android.content.ActivityNotFoundException) { startActivity(Intent(Intent.ACTION_VIEW, "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 b78a29e6b..d274c3c5f 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 @@ -52,10 +52,15 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget viewModel = ViewModelProvider(this).get(NotificationsViewModel::class.java) - compositeSubscription.add(viewModel.getNotifications().subscribe({ - this.setNotifications(it) - viewModel.markNotificationsAsSeen(it) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + viewModel.getNotifications().subscribe( + { + this.setNotifications(it) + viewModel.markNotificationsAsSeen(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) binding.notificationsRefreshLayout.setOnRefreshListener(this) } @@ -75,9 +80,14 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget override fun onRefresh() { binding.notificationsRefreshLayout.isRefreshing = true - compositeSubscription.add(viewModel.refreshNotifications().subscribe({ - binding.notificationsRefreshLayout.isRefreshing = false - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + viewModel.refreshNotifications().subscribe( + { + binding.notificationsRefreshLayout.isRefreshing = false + }, + RxErrorHandler.handleEmptyError() + ) + ) } private fun setNotifications(notifications: List) { @@ -102,7 +112,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget binding.notificationItems.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE or LinearLayout.SHOW_DIVIDER_END binding.notificationItems.addView( - createNotificationsHeaderView(notifications.count()) + createNotificationsHeaderView(notifications.count()) ) notifications.map { @@ -143,8 +153,8 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget val stringId = if (viewModel.isPartyMessage(data)) R.string.new_msg_party else R.string.new_msg_guild return createDismissableNotificationItem( - notification, - fromHtml(getString(stringId, data?.group?.name)) + notification, + fromHtml(getString(stringId, data?.group?.name)) ) } @@ -157,9 +167,9 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget } return createDismissableNotificationItem( - notification, - text, - R.drawable.notifications_bailey + notification, + text, + R.drawable.notifications_bailey ) } @@ -167,17 +177,17 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget val data = notification.data as? UnallocatedPointsData return createDismissableNotificationItem( - notification, - fromHtml(getString(R.string.unallocated_stats_points, data?.points.toString())), - R.drawable.notification_stat_sparkles + notification, + fromHtml(getString(R.string.unallocated_stats_points, data?.points.toString())), + R.drawable.notification_stat_sparkles ) } private fun createMysteryItemsNotification(notification: Notification): View? { return createDismissableNotificationItem( - notification, - fromHtml(getString(R.string.new_subscriber_item)), - R.drawable.notification_mystery_item + notification, + fromHtml(getString(R.string.new_subscriber_item)), + R.drawable.notification_mystery_item ) } @@ -186,10 +196,10 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget val message = convertGroupMessageHtml(data?.message ?: "") return createDismissableNotificationItem( - notification, - fromHtml(message), - null, - R.color.yellow_5 + notification, + fromHtml(message), + null, + R.color.yellow_5 ) } @@ -198,10 +208,10 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget val message = convertGroupMessageHtml(data?.message ?: "") return createDismissableNotificationItem( - notification, - fromHtml(message), - null, - R.color.green_10 + notification, + fromHtml(message), + null, + R.color.green_10 ) } @@ -210,10 +220,10 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget val message = convertGroupMessageHtml(data?.message ?: "") val item = createActionableNotificationItem( - notification, - fromHtml(message) + notification, + fromHtml(message) ) - //Hide for now + // Hide for now item?.visibility = View.GONE return item } @@ -232,10 +242,10 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget } private fun createDismissableNotificationItem( - notification: Notification, - messageText: CharSequence, - imageResourceId: Int? = null, - textColor: Int? = null + notification: Notification, + messageText: CharSequence, + imageResourceId: Int? = null, + textColor: Int? = null ): View? { val item = inflater?.inflate(R.layout.notification_item, binding.notificationItems, false) @@ -270,8 +280,8 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget val data = notification.data as? PartyInvitationData return createActionableNotificationItem( - notification, - fromHtml(getString(R.string.invited_to_party_notification, data?.invitation?.name)) + notification, + fromHtml(getString(R.string.invited_to_party_notification, data?.invitation?.name)) ) } @@ -280,9 +290,9 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget val stringId = if (data?.invitation?.publicGuild == false) R.string.invited_to_private_guild else R.string.invited_to_public_guild return createActionableNotificationItem( - notification, - fromHtml(getString(stringId, data?.invitation?.name)), - data?.invitation?.publicGuild == true + notification, + fromHtml(getString(stringId, data?.invitation?.name)), + data?.invitation?.publicGuild == true ) } @@ -294,11 +304,16 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget // hide view until we have loaded quest data and populated the values view?.visibility = View.GONE - compositeSubscription.add(inventoryRepository.getQuestContent(data?.questKey ?: "") + compositeSubscription.add( + inventoryRepository.getQuestContent(data?.questKey ?: "") .firstElement() - .subscribe({ - updateQuestInvitationView(view, it) - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + updateQuestInvitationView(view, it) + }, + RxErrorHandler.handleEmptyError() + ) + ) return view } @@ -334,9 +349,10 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget } private fun createActionableNotificationItem( - notification: Notification, - messageText: CharSequence, - openable: Boolean = false): View? { + notification: Notification, + messageText: CharSequence, + openable: Boolean = false + ): View? { val item = inflater?.inflate(R.layout.notification_item_actionable, binding.notificationItems, false) if (openable) { @@ -368,4 +384,4 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget private fun fromHtml(text: String): CharSequence { return text.fromHtml() } -} \ No newline at end of file +} 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 8e188ceef..8cfa2adde 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 @@ -20,8 +20,8 @@ class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStart setupToolbar(findViewById(R.id.toolbar)) supportFragmentManager.beginTransaction() - .add(R.id.fragment_container, PreferencesFragment()) - .commit() + .add(R.id.fragment_container, PreferencesFragment()) + .commit() } override fun injectActivity(component: UserComponent?) { @@ -36,17 +36,19 @@ class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStart return super.onSupportNavigateUp() } - override fun onPreferenceStartScreen(preferenceFragment: PreferenceFragmentCompat, - preferenceScreen: PreferenceScreen): Boolean { + override fun onPreferenceStartScreen( + preferenceFragment: PreferenceFragmentCompat, + preferenceScreen: PreferenceScreen + ): Boolean { val fragment = createNextPage(preferenceScreen) if (fragment != null) { val arguments = Bundle() arguments.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.key) fragment.arguments = arguments supportFragmentManager.beginTransaction() - .replace(R.id.fragment_container, fragment) - .addToBackStack(null) - .commit() + .replace(R.id.fragment_container, fragment) + .addToBackStack(null) + .commit() return true } return false @@ -58,13 +60,12 @@ class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStart } private fun createNextPage(preferenceScreen: PreferenceScreen): PreferenceFragmentCompat? = - when (preferenceScreen.key) { - "profile" -> ProfilePreferencesFragment() - "authentication" -> AuthenticationPreferenceFragment() - "api" -> APIPreferenceFragment() - "pushNotifications" -> PushNotificationsPreferencesFragment() - "emailNotifications" -> EmailNotificationsPreferencesFragment() - else -> null - } + when (preferenceScreen.key) { + "profile" -> ProfilePreferencesFragment() + "authentication" -> AuthenticationPreferenceFragment() + "api" -> APIPreferenceFragment() + "pushNotifications" -> PushNotificationsPreferencesFragment() + "emailNotifications" -> EmailNotificationsPreferencesFragment() + else -> 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 aef01c53c..3afc76926 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 @@ -21,7 +21,6 @@ import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.android.habitica.ui.helpers.setMarkdown import javax.inject.Inject - class ReportMessageActivity : BaseActivity() { private lateinit var binding: ActivityReportMessageBinding @@ -61,30 +60,35 @@ class ReportMessageActivity : BaseActivity() { binding.reportExplanationTextview.setMarkdown(getString(R.string.report_explanation)) BottomSheetBehavior.from(binding.bottomSheet) - .addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { - @SuppressLint("SwitchIntDef") - override fun onStateChanged(bottomSheet: View, newState: Int) { - when (newState) { - BottomSheetBehavior.STATE_HIDDEN -> finish() - BottomSheetBehavior.STATE_EXPANDED -> setStatusBarDim(false) - else -> setStatusBarDim(true) - } + .addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { + @SuppressLint("SwitchIntDef") + override fun onStateChanged(bottomSheet: View, newState: Int) { + when (newState) { + BottomSheetBehavior.STATE_HIDDEN -> finish() + BottomSheetBehavior.STATE_EXPANDED -> setStatusBarDim(false) + else -> setStatusBarDim(true) } + } - override fun onSlide(bottomSheet: View, slideOffset: Float) { - // no op - } - }) + override fun onSlide(bottomSheet: View, slideOffset: Float) { + // no op + } + }) val args = navArgs().value messageID = args.messageID binding.titleTextView.text = getString(R.string.report_message_title, args.profileName) binding.messageTextView.text = args.text - messageID?.let {messageID -> - compositeSubscription.add(socialRepository.getChatmessage(messageID).subscribe({ - chatMessage = it - }, RxErrorHandler.handleEmptyError())) + messageID?.let { messageID -> + compositeSubscription.add( + socialRepository.getChatmessage(messageID).subscribe( + { + chatMessage = it + }, + RxErrorHandler.handleEmptyError() + ) + ) } binding.reportButton.setOnClickListener { reportMessage() } @@ -103,10 +107,13 @@ class ReportMessageActivity : BaseActivity() { chatMessage?.let { isReporting = true socialRepository.flagMessage(it, binding.additionalInfoEdittext.text.toString()) - .doOnError { isReporting = false } - .subscribe({ - finish() - }, RxErrorHandler.handleEmptyError()) + .doOnError { isReporting = false } + .subscribe( + { + finish() + }, + RxErrorHandler.handleEmptyError() + ) } } 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 a32b6df70..123431f60 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 @@ -80,8 +80,10 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { val currentDeviceLanguage = Locale.getDefault().language for (language in resources.getStringArray(R.array.LanguageValues)) { if (language == currentDeviceLanguage) { - compositeSubscription.add(apiClient.registrationLanguage(currentDeviceLanguage) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + apiClient.registrationLanguage(currentDeviceLanguage) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } } @@ -203,12 +205,17 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { additionalData["status"] = "completed" AmplitudeManager.sendEvent("setup", AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, AmplitudeManager.EVENT_HITTYPE_EVENT, additionalData) - compositeSubscription.add(userRepository.updateUser("flags.welcomed", true).subscribe({ - if (!compositeSubscription.isDisposed) { - compositeSubscription.dispose() - } - startMainActivity() - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.updateUser("flags.welcomed", true).subscribe( + { + if (!compositeSubscription.isDisposed) { + compositeSubscription.dispose() + } + startMainActivity() + }, + RxErrorHandler.handleEmptyError() + ) + ) return } this.user = user @@ -227,9 +234,11 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { } private fun confirmNames(displayName: String, username: String) { - compositeSubscription.add(userRepository.updateUser("profile.name", displayName) + compositeSubscription.add( + userRepository.updateUser("profile.name", displayName) .flatMap { userRepository.updateLoginName(username).toFlowable() } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } private inner class ViewPageAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT), IconPagerAdapter { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt index 58b91aad9..2361f16d0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt @@ -45,16 +45,21 @@ class SkillMemberActivity : BaseActivity() { private fun loadMemberList() { binding.recyclerView.layoutManager = LinearLayoutManager(this) viewAdapter = PartyMemberRecyclerViewAdapter() - viewAdapter?.getUserClickedEvents()?.subscribe({ userId -> - val resultIntent = Intent() - resultIntent.putExtra("member_id", userId) - setResult(Activity.RESULT_OK, resultIntent) - finish() - }, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) } + viewAdapter?.getUserClickedEvents()?.subscribe( + { userId -> + val resultIntent = Intent() + resultIntent.putExtra("member_id", userId) + setResult(Activity.RESULT_OK, resultIntent) + finish() + }, + RxErrorHandler.handleEmptyError() + )?.let { compositeSubscription.add(it) } binding.recyclerView.adapter = viewAdapter - compositeSubscription.add(userRepository.getUser() + compositeSubscription.add( + userRepository.getUser() .flatMap { user -> socialRepository.getGroupMembers(user.party?.id ?: "") } - .subscribe({ viewAdapter?.data = it }, RxErrorHandler.handleEmptyError())) + .subscribe({ viewAdapter?.data = it }, RxErrorHandler.handleEmptyError()) + ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt index dbdbbffcc..2cf46f45d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt @@ -99,7 +99,6 @@ class SkillTasksActivity : BaseActivity() { } } - binding.tabLayout.setupWithViewPager(binding.viewPager) } @@ -120,4 +119,3 @@ class SkillTasksActivity : BaseActivity() { } } } - 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 315f03ade..07730ea4a 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 @@ -31,7 +31,6 @@ import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.helpers.TaskAlarmManager import com.habitrpg.android.habitica.models.Tag import com.habitrpg.android.habitica.models.social.Challenge -import com.habitrpg.android.habitica.models.tasks.ChecklistItem import com.habitrpg.android.habitica.models.tasks.HabitResetOption import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.user.Stats @@ -41,7 +40,6 @@ import io.realm.RealmList import java.util.* import javax.inject.Inject - class TaskFormActivity : BaseActivity() { private lateinit var binding: ActivityTaskFormBinding @@ -71,22 +69,22 @@ class TaskFormActivity : BaseActivity() { private var preselectedTags: ArrayList? = null private var hasPreselectedTags = false private var selectedStat = Stats.STRENGTH - set(value) { - field = value - setSelectedAttribute(value) - } + set(value) { + field = value + setSelectedAttribute(value) + } private var canSave: Boolean = false private var tintColor: Int = 0 - set(value) { - field = value - binding.taskDifficultyButtons.tintColor = value - binding.habitScoringButtons.tintColor = value - binding.habitResetStreakButtons.tintColor = value - binding.taskSchedulingControls.tintColor = value - updateTagViewsColors() - } + set(value) { + field = value + binding.taskDifficultyButtons.tintColor = value + binding.habitScoringButtons.tintColor = value + binding.habitResetStreakButtons.tintColor = value + binding.taskSchedulingControls.tintColor = value + updateTagViewsColors() + } override fun getLayoutResId(): Int { return R.layout.activity_task_form @@ -139,27 +137,37 @@ class TaskFormActivity : BaseActivity() { supportActionBar?.setBackgroundDrawable(ColorDrawable(upperTintColor)) binding.upperTextWrapper.setBackgroundColor(upperTintColor) - isChallengeTask = bundle.getBoolean(IS_CHALLENGE_TASK, false) taskType = bundle.getString(TASK_TYPE_KEY) ?: Task.TYPE_HABIT preselectedTags = bundle.getStringArrayList(SELECTED_TAGS_KEY) - compositeSubscription.add(tagRepository.getTags() + compositeSubscription.add( + tagRepository.getTags() .map { tagRepository.getUnmanagedCopy(it) } - .subscribe({ - tags = it - setTagViews() - }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(userRepository.getUser().subscribe({ - usesTaskAttributeStats = it.preferences?.allocationMode == "taskbased" && it.preferences?.automaticAllocation == true - configureForm() - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + tags = it + setTagViews() + }, + RxErrorHandler.handleEmptyError() + ) + ) + compositeSubscription.add( + userRepository.getUser().subscribe( + { + usesTaskAttributeStats = it.preferences?.allocationMode == "taskbased" && it.preferences?.automaticAllocation == true + configureForm() + }, + RxErrorHandler.handleEmptyError() + ) + ) - - binding.textEditText.addTextChangedListener(OnChangeTextWatcher { _, _, _, _ -> - checkCanSave() - }) + binding.textEditText.addTextChangedListener( + OnChangeTextWatcher { _, _, _, _ -> + checkCanSave() + } + ) binding.textEditText.onFocusChangeListener = View.OnFocusChangeListener { _, isFocused -> binding.textInputLayout.alpha = if (isFocused) 0.8f else 0.6f window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) @@ -185,32 +193,47 @@ class TaskFormActivity : BaseActivity() { when { taskId != null -> { isCreating = false - compositeSubscription.add(taskRepository.getUnmanagedTask(taskId).firstElement().subscribe({ - if (!it.isValid) return@subscribe - task = it - //tintColor = ContextCompat.getColor(this, it.mediumTaskColor) - fillForm(it) - it.challengeID?.let { challengeID -> - compositeSubscription.add(challengeRepository.retrieveChallenge(challengeID) - .subscribe({ challenge -> - this.challenge = challenge - binding.challengeNameView.text = getString(R.string.challenge_task_name, challenge.name) - binding.challengeNameView.visibility = View.VISIBLE - }, RxErrorHandler.handleEmptyError())) - } - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + taskRepository.getUnmanagedTask(taskId).firstElement().subscribe( + { + if (!it.isValid) return@subscribe + task = it + // tintColor = ContextCompat.getColor(this, it.mediumTaskColor) + fillForm(it) + it.challengeID?.let { challengeID -> + compositeSubscription.add( + challengeRepository.retrieveChallenge(challengeID) + .subscribe( + { challenge -> + this.challenge = challenge + binding.challengeNameView.text = getString(R.string.challenge_task_name, challenge.name) + binding.challengeNameView.visibility = View.VISIBLE + }, + RxErrorHandler.handleEmptyError() + ) + ) + } + }, + RxErrorHandler.handleEmptyError() + ) + ) } bundle.containsKey(PARCELABLE_TASK) -> { isCreating = false task = bundle.getParcelable(PARCELABLE_TASK) task?.let { fillForm(it) } } - else -> title = getString(R.string.create_task, getString(when (taskType) { - Task.TYPE_DAILY -> R.string.daily - Task.TYPE_TODO -> R.string.todo - Task.TYPE_REWARD -> R.string.reward - else -> R.string.habit - })) + else -> title = getString( + R.string.create_task, + getString( + when (taskType) { + Task.TYPE_DAILY -> R.string.daily + Task.TYPE_TODO -> R.string.todo + Task.TYPE_REWARD -> R.string.reward + else -> R.string.habit + } + ) + ) } configureForm() } @@ -384,10 +407,10 @@ class TaskFormActivity : BaseActivity() { private fun setSelectedAttribute(attributeName: String) { if (!usesTaskAttributeStats) return - configureStatsButton(binding.statStrengthButton, attributeName == Stats.STRENGTH ) - configureStatsButton(binding.statIntelligenceButton, attributeName == Stats.INTELLIGENCE ) - configureStatsButton(binding.statConstitutionButton, attributeName == Stats.CONSTITUTION ) - configureStatsButton(binding.statPerceptionButton, attributeName == Stats.PERCEPTION ) + configureStatsButton(binding.statStrengthButton, attributeName == Stats.STRENGTH) + configureStatsButton(binding.statIntelligenceButton, attributeName == Stats.INTELLIGENCE) + configureStatsButton(binding.statConstitutionButton, attributeName == Stats.CONSTITUTION) + configureStatsButton(binding.statPerceptionButton, attributeName == Stats.PERCEPTION) } private fun configureStatsButton(button: TextView, isSelected: Boolean) { @@ -405,10 +428,11 @@ class TaskFormActivity : BaseActivity() { binding.tagsWrapper.children.forEach { view -> val tagView = view as? AppCompatCheckBox val colorStateList = ColorStateList( - arrayOf(intArrayOf(-android.R.attr.state_checked), // unchecked - intArrayOf(android.R.attr.state_checked) // checked - ), - intArrayOf(ContextCompat.getColor(this, R.color.text_dimmed), tintColor) + arrayOf( + intArrayOf(-android.R.attr.state_checked), // unchecked + intArrayOf(android.R.attr.state_checked) // checked + ), + intArrayOf(ContextCompat.getColor(this, R.color.text_dimmed), tintColor) ) tagView?.buttonTintList = colorStateList } @@ -480,14 +504,17 @@ class TaskFormActivity : BaseActivity() { taskAlarmManager.scheduleAlarmsForTask(thisTask) } } else { - resultIntent.putExtra(PARCELABLE_TASK, thisTask) + resultIntent.putExtra(PARCELABLE_TASK, thisTask) } val mainHandler = Handler(this.mainLooper) - mainHandler.postDelayed({ - setResult(Activity.RESULT_OK, resultIntent) - finish() - }, 500) + mainHandler.postDelayed( + { + setResult(Activity.RESULT_OK, resultIntent) + finish() + }, + 500 + ) } private fun deleteTask() { @@ -502,7 +529,7 @@ class TaskFormActivity : BaseActivity() { alert.setTitle(R.string.are_you_sure) alert.addButton(R.string.delete_task, true) { _, _ -> if (task?.isValid != true) return@addButton - task?.id?.let { taskRepository.deleteTask(it).subscribe({ }, RxErrorHandler.handleEmptyError()) } + task?.id?.let { taskRepository.deleteTask(it).subscribe({ }, RxErrorHandler.handleEmptyError()) } finish() } alert.addCancelButton() @@ -510,33 +537,48 @@ class TaskFormActivity : BaseActivity() { } private fun showChallengeDeleteTask() { - compositeSubscription.add(taskRepository.getTasksForChallenge(task?.challengeID).firstElement().subscribe({ tasks -> - val taskCount = tasks.size - val alert = HabiticaAlertDialog(this) - alert.setTitle(getString(R.string.delete_challenge_task_title)) - alert.setMessage(getString(R.string.delete_challenge_task_description, taskCount, challenge?.name ?: "")) - alert.addButton(R.string.leave_delete_task, isPrimary = true, isDestructive = true) { _, _ -> - challenge?.let { - compositeSubscription.add(challengeRepository.leaveChallenge(it, "keep-all") - .flatMap { taskRepository.deleteTask(task?.id ?: "") } - .flatMap { userRepository.retrieveUser(true) } - .subscribe({ - finish() - }, RxErrorHandler.handleEmptyError())) - } - } - alert.addButton(getString(R.string.leave_delete_x_tasks, taskCount), isPrimary = false, isDestructive = true) { _, _ -> - challenge?.let { - compositeSubscription.add(challengeRepository.leaveChallenge(it, "remove-all") - .flatMap { userRepository.retrieveUser(true) } - .subscribe({ - finish() - }, RxErrorHandler.handleEmptyError())) - } - } - alert.setExtraCloseButtonVisibility(View.VISIBLE) - alert.show() - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + taskRepository.getTasksForChallenge(task?.challengeID).firstElement().subscribe( + { tasks -> + val taskCount = tasks.size + val alert = HabiticaAlertDialog(this) + alert.setTitle(getString(R.string.delete_challenge_task_title)) + alert.setMessage(getString(R.string.delete_challenge_task_description, taskCount, challenge?.name ?: "")) + alert.addButton(R.string.leave_delete_task, isPrimary = true, isDestructive = true) { _, _ -> + challenge?.let { + compositeSubscription.add( + challengeRepository.leaveChallenge(it, "keep-all") + .flatMap { taskRepository.deleteTask(task?.id ?: "") } + .flatMap { userRepository.retrieveUser(true) } + .subscribe( + { + finish() + }, + RxErrorHandler.handleEmptyError() + ) + ) + } + } + alert.addButton(getString(R.string.leave_delete_x_tasks, taskCount), isPrimary = false, isDestructive = true) { _, _ -> + challenge?.let { + compositeSubscription.add( + challengeRepository.leaveChallenge(it, "remove-all") + .flatMap { userRepository.retrieveUser(true) } + .subscribe( + { + finish() + }, + RxErrorHandler.handleEmptyError() + ) + ) + } + } + alert.setExtraCloseButtonVisibility(View.VISIBLE) + alert.show() + }, + RxErrorHandler.handleEmptyError() + ) + ) } private fun showBrokenChallengeDialog() { @@ -544,27 +586,37 @@ class TaskFormActivity : BaseActivity() { if (!task.isValid) { return } - compositeSubscription.add(taskRepository.getTasksForChallenge(task.challengeID).subscribe({ tasks -> - val taskCount = tasks.size - val dialog = HabiticaAlertDialog(this) - dialog.setTitle(R.string.broken_challenge) - dialog.setMessage(this.getString(R.string.broken_challenge_description, taskCount)) - dialog.addButton(this.getString(R.string.keep_x_tasks, taskCount), true) { _, _ -> - taskRepository.unlinkAllTasks(task.challengeID, "keep-all").subscribe({ - finish() - }, RxErrorHandler.handleEmptyError()) - } - dialog.addButton(this.getString(R.string.delete_x_tasks, taskCount), false, true) { _, _ -> - taskRepository.unlinkAllTasks(task.challengeID, "remove-all").subscribe({ - finish() - }, RxErrorHandler.handleEmptyError()) - } - dialog.setExtraCloseButtonVisibility(View.VISIBLE) - dialog.show() - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + taskRepository.getTasksForChallenge(task.challengeID).subscribe( + { tasks -> + val taskCount = tasks.size + val dialog = HabiticaAlertDialog(this) + dialog.setTitle(R.string.broken_challenge) + dialog.setMessage(this.getString(R.string.broken_challenge_description, taskCount)) + dialog.addButton(this.getString(R.string.keep_x_tasks, taskCount), true) { _, _ -> + taskRepository.unlinkAllTasks(task.challengeID, "keep-all").subscribe( + { + finish() + }, + RxErrorHandler.handleEmptyError() + ) + } + dialog.addButton(this.getString(R.string.delete_x_tasks, taskCount), false, true) { _, _ -> + taskRepository.unlinkAllTasks(task.challengeID, "remove-all").subscribe( + { + finish() + }, + RxErrorHandler.handleEmptyError() + ) + } + dialog.setExtraCloseButtonVisibility(View.VISIBLE) + dialog.show() + }, + RxErrorHandler.handleEmptyError() + ) + ) } - override fun finish() { dismissKeyboard() super.finish() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/VerifyUsernameActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/VerifyUsernameActivity.kt index 327bf8478..f540990b0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/VerifyUsernameActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/VerifyUsernameActivity.kt @@ -21,7 +21,7 @@ import io.reactivex.rxjava3.subjects.PublishSubject import java.util.concurrent.TimeUnit import javax.inject.Inject -class VerifyUsernameActivity: BaseActivity() { +class VerifyUsernameActivity : BaseActivity() { private lateinit var binding: ActivityVerifyUsernameBinding @Inject @@ -58,58 +58,73 @@ class VerifyUsernameActivity: BaseActivity() { binding.confirmUsernameButton.setOnClickListener { confirmNames() } - binding.displayNameEditText.addTextChangedListener(OnChangeTextWatcher { p0, _, _, _ -> - displayNameVerificationEvents.onNext(p0.toString()) - }) - binding.usernameEditText.addTextChangedListener(OnChangeTextWatcher { p0, _, _, _ -> - usernameVerificationEvents.onNext(p0.toString()) - }) + binding.displayNameEditText.addTextChangedListener( + OnChangeTextWatcher { p0, _, _, _ -> + displayNameVerificationEvents.onNext(p0.toString()) + } + ) + binding.usernameEditText.addTextChangedListener( + OnChangeTextWatcher { p0, _, _, _ -> + usernameVerificationEvents.onNext(p0.toString()) + } + ) - compositeSubscription.add(Flowable.combineLatest( + compositeSubscription.add( + Flowable.combineLatest( displayNameVerificationEvents.toFlowable(BackpressureStrategy.DROP) - .map { it.length in 1..30 } - .doOnNext { - if (it) { - binding.displayNameEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, checkmarkIcon, null) - binding.issuesTextView.visibility = View.GONE - } else { - binding.displayNameEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, alertIcon, null) - binding.issuesTextView.visibility = View.VISIBLE - binding.issuesTextView.text = getString(R.string.display_name_length_error) - } - }, + .map { it.length in 1..30 } + .doOnNext { + if (it) { + binding.displayNameEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, checkmarkIcon, null) + binding.issuesTextView.visibility = View.GONE + } else { + binding.displayNameEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, alertIcon, null) + binding.issuesTextView.visibility = View.VISIBLE + binding.issuesTextView.text = getString(R.string.display_name_length_error) + } + }, usernameVerificationEvents.toFlowable(BackpressureStrategy.DROP) - .throttleLast(1, TimeUnit.SECONDS) - .flatMap { userRepository.verifyUsername(binding.usernameEditText.text.toString()) } - .doOnNext { - if (it.isUsable) { - binding.usernameEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, checkmarkIcon, null) - binding.issuesTextView.visibility = View.GONE - } else { - binding.usernameEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, alertIcon, null) - binding.issuesTextView.visibility = View.VISIBLE - binding.issuesTextView.text = it.issues.joinToString("\n") - } - }, { displayNameUsable, usernameUsable -> displayNameUsable && usernameUsable.isUsable}) - .subscribe({ - binding.confirmUsernameButton.isEnabled = it - }, RxErrorHandler.handleEmptyError())) + .throttleLast(1, TimeUnit.SECONDS) + .flatMap { userRepository.verifyUsername(binding.usernameEditText.text.toString()) } + .doOnNext { + if (it.isUsable) { + binding.usernameEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, checkmarkIcon, null) + binding.issuesTextView.visibility = View.GONE + } else { + binding.usernameEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, alertIcon, null) + binding.issuesTextView.visibility = View.VISIBLE + binding.issuesTextView.text = it.issues.joinToString("\n") + } + }, + { displayNameUsable, usernameUsable -> displayNameUsable && usernameUsable.isUsable } + ) + .subscribe( + { + binding.confirmUsernameButton.isEnabled = it + }, + RxErrorHandler.handleEmptyError() + ) + ) - compositeSubscription.add(userRepository.getUser().firstElement().subscribe { - binding.displayNameEditText.setText(it.profile?.name) - displayNameVerificationEvents.onNext(it.profile?.name ?: "") - binding.usernameEditText.setText(it.authentication?.localAuthentication?.username) - usernameVerificationEvents.onNext(it.username ?: "") - }) + compositeSubscription.add( + userRepository.getUser().firstElement().subscribe { + binding.displayNameEditText.setText(it.profile?.name) + displayNameVerificationEvents.onNext(it.profile?.name ?: "") + binding.usernameEditText.setText(it.authentication?.localAuthentication?.username) + usernameVerificationEvents.onNext(it.username ?: "") + } + ) } private fun confirmNames() { binding.confirmUsernameButton.isClickable = false - compositeSubscription.add(userRepository.updateUser("profile.name", binding.displayNameEditText.text.toString()) + compositeSubscription.add( + userRepository.updateUser("profile.name", binding.displayNameEditText.text.toString()) .flatMap { userRepository.updateLoginName(binding.usernameEditText.text.toString()).toFlowable() } .doOnComplete { showConfirmationAndFinish() } .doOnEach { binding.confirmUsernameButton.isClickable = true } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } private fun showConfirmationAndFinish() { @@ -122,4 +137,4 @@ class VerifyUsernameActivity: BaseActivity() { override fun onBackPressed() { moveTaskToBack(true) } -} \ No newline at end of file +} 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 441ff4c03..e99026c70 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 @@ -15,7 +15,7 @@ import com.habitrpg.android.habitica.models.QuestAchievement import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.views.dialogs.AchievementDetailDialog -class AchievementsAdapter: RecyclerView.Adapter() { +class AchievementsAdapter : RecyclerView.Adapter() { var useGridLayout: Boolean = false var entries = listOf() @@ -25,11 +25,13 @@ class AchievementsAdapter: RecyclerView.Adapter() { 0 -> SectionViewHolder(parent.inflate(R.layout.achievement_section_header)) 3 -> QuestAchievementViewHolder(parent.inflate(R.layout.achievement_quest_item)) 4 -> ChallengeAchievementViewHolder(parent.inflate(R.layout.achievement_challenge_item)) - else -> AchievementViewHolder(if (useGridLayout) { - parent.inflate(R.layout.achievement_grid_item) - } else { - parent.inflate(R.layout.achievement_list_item) - }) + else -> AchievementViewHolder( + if (useGridLayout) { + parent.inflate(R.layout.achievement_grid_item) + } else { + parent.inflate(R.layout.achievement_list_item) + } + ) } } @@ -60,7 +62,7 @@ class AchievementsAdapter: RecyclerView.Adapter() { } } - class SectionViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { + class SectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private var binding = AchievementSectionHeaderBinding.bind(itemView) fun bind(category: Pair<*, *>) { @@ -69,7 +71,7 @@ class AchievementsAdapter: RecyclerView.Adapter() { } } - class AchievementViewHolder(itemView: View): RecyclerView.ViewHolder(itemView), View.OnClickListener { + class AchievementViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { private var achievement: Achievement? = null private val achievementContainer: ViewGroup? @@ -113,7 +115,7 @@ class AchievementsAdapter: RecyclerView.Adapter() { } } - class QuestAchievementViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { + class QuestAchievementViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private var binding = AchievementQuestItemBinding.bind(itemView) private var achievement: QuestAchievement? = null @@ -124,7 +126,7 @@ class AchievementsAdapter: RecyclerView.Adapter() { } } - class ChallengeAchievementViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { + class ChallengeAchievementViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private var binding = AchievementChallengeItemBinding.bind(itemView) fun bind(challengeName: String) { 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 df91df44b..f409464d5 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 @@ -2,13 +2,13 @@ package com.habitrpg.android.habitica.ui.adapter import androidx.recyclerview.widget.RecyclerView -abstract class BaseRecyclerViewAdapter: RecyclerView.Adapter() { +abstract class BaseRecyclerViewAdapter : RecyclerView.Adapter() { var data: List = emptyList() - set(value) { - field = value - notifyDataSetChanged() - } + set(value) { + field = value + notifyDataSetChanged() + } override fun getItemCount(): Int { return data.size 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 ff465910c..2b32bfde8 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 @@ -24,17 +24,17 @@ import java.util.* class CustomizationEquipmentRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerView.Adapter() { var gemBalance: Int = 0 - var equipmentList - : MutableList = ArrayList() - set(value) { - field = value - notifyDataSetChanged() - } + var equipmentList: MutableList = + ArrayList() + set(value) { + field = value + notifyDataSetChanged() + } var activeEquipment: String? = null - set(value) { - field = value - this.notifyDataSetChanged() - } + set(value) { + field = value + this.notifyDataSetChanged() + } private val selectCustomizationEvents = PublishSubject.create() private val unlockCustomizationEvents = PublishSubject.create() 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 104ee2bd6..6dd1ebf58 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 @@ -33,16 +33,16 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler var gemBalance: Int = 0 var unsortedCustomizations: List = ArrayList() var customizationList: MutableList = ArrayList() - set(value) { - field = value - notifyDataSetChanged() - } + set(value) { + field = value + notifyDataSetChanged() + } var additionalSetItems: List = ArrayList() var activeCustomization: String? = null - set(value) { - field = value - this.notifyDataSetChanged() - } + set(value) { + field = value + this.notifyDataSetChanged() + } var ownedCustomizations: List = listOf() @@ -59,7 +59,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder { return if (viewType == 0) { val view = LayoutInflater.from(parent.context) - .inflate(R.layout.customization_section_header, parent, false) + .inflate(R.layout.customization_section_header, parent, false) SectionViewHolder(view) } else { val viewID: Int = if (customizationType == "background") { @@ -71,7 +71,6 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler val view = LayoutInflater.from(parent.context).inflate(viewID, parent, false) CustomizationViewHolder(view) } - } override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) { @@ -80,7 +79,6 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler (holder as SectionViewHolder).bind(obj as CustomizationSet) } else { (holder as CustomizationViewHolder).bind(customizationList[position] as Customization) - } } @@ -261,25 +259,25 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler val dialog = HabiticaAlertDialog(context) dialog.addButton(R.string.purchase_button, true) { _, _ -> - if (set?.price ?: 0 > gemBalance) { - MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", false))) - return@addButton - } - set?.customizations = ArrayList() - customizationList - .filter { Customization::class.java.isAssignableFrom(it.javaClass) } - .map { it as Customization } - .filter { it.customizationSet != null && it.customizationSet == set?.identifier } - .forEach { set?.customizations?.add(it) } - if (additionalSetItems.isNotEmpty()) { - additionalSetItems - .filter { !it.isUsable(ownedCustomizations.contains(it.id)) && it.customizationSet == set?.identifier } - .forEach { set?.customizations?.add(it) } - } - set?.let { - unlockSetEvents.onNext(it) - } - } + if (set?.price ?: 0 > gemBalance) { + MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", false))) + return@addButton + } + set?.customizations = ArrayList() + customizationList + .filter { Customization::class.java.isAssignableFrom(it.javaClass) } + .map { it as Customization } + .filter { it.customizationSet != null && it.customizationSet == set?.identifier } + .forEach { set?.customizations?.add(it) } + if (additionalSetItems.isNotEmpty()) { + additionalSetItems + .filter { !it.isUsable(ownedCustomizations.contains(it.id)) && it.customizationSet == set?.identifier } + .forEach { set?.customizations?.add(it) } + } + set?.let { + unlockSetEvents.onNext(it) + } + } dialog.setTitle(context.getString(R.string.purchase_set_title, set?.text)) dialog.setAdditionalContentView(dialogContent) dialog.addButton(R.string.reward_dialog_dismiss, false) 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 582234ad4..2897dadff 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 @@ -22,8 +22,7 @@ import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.PublishSubject - -class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): RecyclerView.Adapter() { +class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int) : RecyclerView.Adapter() { var tintColor: Int = tintColor set(value) { @@ -37,7 +36,6 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle notifyDataSetChanged() } - internal val items: MutableList = ArrayList() var selectedItem: Int? = null set(value) { @@ -54,10 +52,10 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle fun getPromoCloseEvents(): Flowable = promoClosedSubject.toFlowable(BackpressureStrategy.DROP) fun getItemWithIdentifier(identifier: String): HabiticaDrawerItem? = - items.find { it.identifier == identifier } + items.find { it.identifier == identifier } private fun getItemPosition(identifier: String): Int = - items.indexOfFirst { it.identifier == identifier } + items.indexOfFirst { it.identifier == identifier } fun updateItem(item: HabiticaDrawerItem) { val position = getItemPosition(item.identifier) @@ -83,7 +81,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle } } if (teamHeaderIndex != -1 && nextHeaderIndex != -1) { - for (x in nextHeaderIndex-1 downTo teamHeaderIndex+1) { + for (x in nextHeaderIndex - 1 downTo teamHeaderIndex + 1) { items.removeAt(x) } for ((index, team) in teams.withIndex()) { @@ -141,24 +139,24 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle 2 -> { val itemView = SubscriptionBuyGemsPromoView(parent.context) itemView.layoutParams = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - 148.dpToPx(parent.context) + ViewGroup.LayoutParams.MATCH_PARENT, + 148.dpToPx(parent.context) ) SubscriptionBuyGemsPromoViewHolder(itemView) } 4 -> { val itemView = AdventureGuideMenuBanner(parent.context) itemView.layoutParams = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - 104.dpToPx(parent.context) + ViewGroup.LayoutParams.MATCH_PARENT, + 104.dpToPx(parent.context) ) SubscriptionBuyGemsPromoViewHolder(itemView) } 5 -> { val promoView = PromoMenuView(parent.context) promoView.layoutParams = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - 148.dpToPx(parent.context) + ViewGroup.LayoutParams.MATCH_PARENT, + 148.dpToPx(parent.context) ) PromoMenuViewHolder(promoView) } @@ -206,7 +204,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle } else { pillView?.visibility = View.GONE } - if (drawerItem.subtitle != null){ + if (drawerItem.subtitle != null) { additionalInfoView?.let { additionalInfoView -> additionalInfoView.text = drawerItem.subtitle additionalInfoView.visibility = View.VISIBLE @@ -228,4 +226,4 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle itemView.setBackgroundColor(backgroundTintColor) } } -} \ No newline at end of file +} 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 43912d36d..aaf581734 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 @@ -21,5 +21,4 @@ class SimpleSpinnerAdapter(context: Context, resource: Int) : ArrayAdapter() { private val taskSelectionEvents = PublishSubject.create() @@ -28,7 +27,7 @@ class SkillTasksRecyclerViewAdapter : BaseRecyclerViewAdapter = emptyList() fun setSkillList(skillList: List) { @@ -125,7 +125,6 @@ class SkillsRecyclerViewAdapter : RecyclerView.Adapter) : ArrayAdapter(context, resource, R.id.textView, objects) { override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup?): View = - createView(position, convertView ?: parent?.inflate(R.layout.class_spinner_dropdown_item, false)) + createView(position, convertView ?: parent?.inflate(R.layout.class_spinner_dropdown_item, false)) override fun getView(position: Int, convertView: View?, parent: ViewGroup): View = - createView(position, convertView ?: parent.inflate(R.layout.class_spinner_dropdown_item_selected, false)) + createView(position, convertView ?: parent.inflate(R.layout.class_spinner_dropdown_item_selected, false)) private fun createView(position: Int, row: View?): View { val textView: TextView? = row?.findViewById(R.id.textView) @@ -54,4 +53,4 @@ class HabiticaClassArrayAdapter(context: Context, resource: Int, objects: List? = null private var ownedPets: Map? = null var items: Map? = null - set(value) { - field = value - notifyDataSetChanged() - } + set(value) { + field = value + notifyDataSetChanged() + } private val sellItemEvents = PublishSubject.create() private val questInvitationEvents = PublishSubject.create() @@ -191,11 +190,11 @@ class ItemRecyclerAdapter(val context: Context) : BaseRecyclerViewAdapter if (firstItem is Egg) { - (hatchingItem as? HatchingPotion)?.let {potion -> + (hatchingItem as? HatchingPotion)?.let { potion -> hatchPetSubject.onNext(Pair(potion, firstItem)) } } else if (firstItem is HatchingPotion) { - (hatchingItem as? Egg)?.let {egg -> + (hatchingItem as? Egg)?.let { egg -> hatchPetSubject.onNext(Pair(firstItem, egg)) } } 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 fc0f54bbc..462627480 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 @@ -29,15 +29,15 @@ class MountDetailRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Ada } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder = - when (viewType) { - 1 -> SectionViewHolder(parent) - else -> MountViewHolder(parent, equipEvents) - } + when (viewType) { + 1 -> SectionViewHolder(parent) + else -> MountViewHolder(parent, equipEvents) + } override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) { when (val obj = this.itemList[position]) { is StableSection -> (holder as? SectionViewHolder)?.bind(obj) - is Mount -> (holder as? MountViewHolder)?.bind(obj, ownedMounts?.get(obj.key ?: "")?.owned == true, user) + is Mount -> (holder as? MountViewHolder)?.bind(obj, ownedMounts?.get(obj.key ?: "")?.owned == true, user) } } 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 1925cdbc4..21369a5e5 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 @@ -68,16 +68,17 @@ class PetDetailRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapt (holder as? SectionViewHolder)?.bind(obj) } is Pet -> { - (holder as? PetViewHolder)?.bind(obj, - ownedPets?.get(obj.key ?: "")?.trained ?: 0, - eggCount(obj), - potionCount(obj), - canRaiseToMount(obj), - ownsSaddles, - ownedItems?.get(obj.animal + "-eggs") != null, - ownedItems?.get(obj.color + "-hatchingPotions") != null, - ownedMounts?.containsKey(obj.key) == true, - user + (holder as? PetViewHolder)?.bind( + obj, + ownedPets?.get(obj.key ?: "")?.trained ?: 0, + eggCount(obj), + potionCount(obj), + canRaiseToMount(obj), + ownsSaddles, + ownedItems?.get(obj.animal + "-eggs") != null, + ownedItems?.get(obj.color + "-hatchingPotions") != null, + ownedMounts?.containsKey(obj.key) == true, + user ) } } 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 531671e3c..c3dd8cceb 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 @@ -19,44 +19,42 @@ import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder import com.habitrpg.android.habitica.ui.viewHolders.ShopItemViewHolder - class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter() { private val items: MutableList = ArrayList() private var shopIdentifier: String? = null private var ownedItems: Map = HashMap() - var shopSpriteSuffix: String = "" - set(value) { - field = value - if (items.size > 0) { - notifyItemChanged(0) + set(value) { + field = value + if (items.size > 0) { + notifyItemChanged(0) + } } - } var context: Context? = null var user: User? = null - set(value) { - field = value - if (items.size > 0) { - this.notifyDataSetChanged() + set(value) { + field = value + if (items.size > 0) { + this.notifyDataSetChanged() + } } - } private var pinnedItemKeys: List = ArrayList() var gearCategories: MutableList = ArrayList() - set(value) { - field = value - notifyDataSetChanged() - } - - internal var selectedGearCategory: String = "" - set(value) { - field = value - if (field != "" && items.size > 0) { + set(value) { + field = value notifyDataSetChanged() } - } + + internal var selectedGearCategory: String = "" + set(value) { + field = value + if (field != "" && items.size > 0) { + notifyDataSetChanged() + } + } private val emptyViewResource: Int get() = when (this.shopIdentifier) { @@ -85,17 +83,17 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter ShopHeaderViewHolder(parent) - 1 -> SectionViewHolder(parent.inflate(R.layout.shop_section_header)) - 2 -> EmptyStateViewHolder(parent.inflate(emptyViewResource)) - else -> { - val view = parent.inflate(R.layout.row_shopitem) - val viewHolder = ShopItemViewHolder(view) - viewHolder.shopIdentifier = shopIdentifier - viewHolder - } + when (viewType) { + 0 -> ShopHeaderViewHolder(parent) + 1 -> SectionViewHolder(parent.inflate(R.layout.shop_section_header)) + 2 -> EmptyStateViewHolder(parent.inflate(emptyViewResource)) + else -> { + val view = parent.inflate(R.layout.row_shopitem) + val viewHolder = ShopItemViewHolder(view) + viewHolder.shopIdentifier = shopIdentifier + viewHolder } + } @Suppress("ReturnCount") override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) { @@ -108,7 +106,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter + context?.let { context -> val adapter = HabiticaClassArrayAdapter(context, R.layout.class_spinner_dropdown_item, gearCategories.map { it.identifier }) sectionHolder.spinnerAdapter = adapter sectionHolder.selectedItem = gearCategories.indexOf(category) @@ -132,7 +130,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter { val item = obj as? ShopItem ?: return val itemHolder = holder as? ShopItemViewHolder ?: return - val numberOwned = ownedItems[item.key+"-"+item.purchaseType]?.numberOwned ?: 0 + val numberOwned = ownedItems[item.key + "-" + item.purchaseType]?.numberOwned ?: 0 itemHolder.bind(item, item.canAfford(user, 1), numberOwned) itemHolder.isPinned = pinnedItemKeys.contains(item.key) } @@ -156,19 +154,19 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter return context?.getString(R.string.equipment_empty) - else -> getSelectedShopCategory()?.items?.get(position-2) + getSelectedShopCategory()?.items?.size ?: 0 <= position - 2 -> return context?.getString(R.string.equipment_empty) + else -> getSelectedShopCategory()?.items?.get(position - 2) } } else { val itemPosition = position - getGearItemCount() - if (itemPosition > items.size-1) { + if (itemPosition > items.size - 1) { return null } return items[itemPosition] } } - override fun getItemViewType(position: Int): Int = when(getItem(position)?.javaClass) { + override fun getItemViewType(position: Int): Int = when (getItem(position)?.javaClass) { Shop::class.java -> 0 ShopCategory::class.java -> 1 ShopItem::class.java -> 3 @@ -191,7 +189,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter) { this.ownedItems = ownedItems @@ -230,7 +228,6 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter() { var shopSpriteSuffix: String? = null @@ -43,7 +42,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { return equipEvents.toFlowable(BackpressureStrategy.DROP) } - fun setUser(user: User){ + fun setUser(user: User) { this.user = user notifyDataSetChanged() } @@ -88,14 +87,14 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = - when (viewType) { - 1 -> SectionViewHolder(parent) - 4 -> StableViewHolder(parent.inflate(R.layout.pet_overview_item)) - 5 -> StableViewHolder(parent.inflate(R.layout.mount_overview_item)) - 2 -> PetViewHolder(parent, equipEvents, animalIngredientsRetriever) - 3 -> MountViewHolder(parent, equipEvents) - else -> StableHeaderViewHolder(parent) - } + when (viewType) { + 1 -> SectionViewHolder(parent) + 4 -> StableViewHolder(parent.inflate(R.layout.pet_overview_item)) + 5 -> StableViewHolder(parent.inflate(R.layout.mount_overview_item)) + 2 -> PetViewHolder(parent, equipEvents, animalIngredientsRetriever) + 3 -> MountViewHolder(parent, equipEvents) + else -> StableHeaderViewHolder(parent) + } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (val item = this.itemList[position]) { 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 0e9301c54..afcd17483 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 @@ -131,7 +131,6 @@ internal class CustomizationSetupAdapter : RecyclerView.Adapter() notifyItemChanged(position) } } - } 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 96c2cf00e..9f99ed247 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 @@ -10,11 +10,11 @@ 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.helpers.EmojiParser import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.PublishSubject -import com.habitrpg.android.habitica.ui.helpers.EmojiParser import io.realm.OrderedRealmCollection class ChallengesListViewAdapter(private val viewUserChallengesOnly: Boolean, private val userId: String) : BaseRecyclerViewAdapter() { 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 c53691ed7..89eaefcc4 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 @@ -1,19 +1,15 @@ package com.habitrpg.android.habitica.ui.adapter.social -import android.os.Build import android.view.View import android.view.ViewGroup import android.widget.TextView -import androidx.annotation.RequiresApi import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.databinding.ChatItemBinding import com.habitrpg.android.habitica.databinding.SystemChatMessageBinding import com.habitrpg.android.habitica.extensions.inflate 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.viewHolders.BindableViewHolder import com.habitrpg.android.habitica.ui.viewHolders.ChatRecyclerMessageViewHolder import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable @@ -21,10 +17,10 @@ import io.reactivex.rxjava3.subjects.PublishSubject class ChatRecyclerViewAdapter(user: User?, private val isTavern: Boolean) : BaseRecyclerViewAdapter() { internal var user = user - set(value) { - field = value - uuid = user?.id ?: "" - } + set(value) { + field = value + uuid = user?.id ?: "" + } private var uuid: String = "" private var expandedMessageId: String? = null @@ -50,16 +46,20 @@ class ChatRecyclerViewAdapter(user: User?, private val isTavern: Boolean) : Base override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (data[position].isSystemMessage) { val sysChatHolder = holder as? SystemChatMessageViewHolder ?: return - sysChatHolder.bind(data[position], - expandedMessageId == data[position].id) - sysChatHolder.onShouldExpand = { expandMessage(data[position].id, position)} + sysChatHolder.bind( + data[position], + expandedMessageId == data[position].id + ) + sysChatHolder.onShouldExpand = { expandMessage(data[position].id, position) } } else { val chatHolder = holder as? ChatRecyclerMessageViewHolder ?: return val message = data[position] - chatHolder.bind(message, - uuid, - user, - expandedMessageId == message.id) + chatHolder.bind( + message, + uuid, + user, + expandedMessageId == message.id + ) chatHolder.onShouldExpand = { expandMessage(message.id, position) } chatHolder.onLikeMessage = { likeMessageEvents.onNext(it) } chatHolder.onOpenProfile = { userLabelClickEvents.onNext(it) } @@ -117,7 +117,7 @@ class SystemChatMessageViewHolder(itemView: View) : RecyclerView.ViewHolder(item var onShouldExpand: (() -> Unit)? = null - init{ + init { textView.setOnClickListener { onShouldExpand?.invoke() } @@ -126,11 +126,10 @@ class SystemChatMessageViewHolder(itemView: View) : RecyclerView.ViewHolder(item fun bind(chatMessage: ChatMessage?, isExpanded: Boolean) { textView.text = chatMessage?.text?.removePrefix("`")?.removeSuffix("`") timestamp.text = dateTime.format(chatMessage?.timestamp?.let { java.util.Date(it) }) - if(isExpanded) { + if (isExpanded) { binding.systemMessageTimestamp.visibility = View.VISIBLE } else { binding.systemMessageTimestamp.visibility = View.GONE } } - -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/GuildListAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/GuildListAdapter.kt index 0cebe5937..99c863f56 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/GuildListAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/GuildListAdapter.kt @@ -70,12 +70,12 @@ class GuildListAdapter : BaseRecyclerViewAdapter unfilteredData?.let { if (constraint.isNotEmpty() && it is OrderedRealmCollection) { data = it.where() - .beginGroup() - .contains("name", constraint.toString(), Case.INSENSITIVE) - .or() - .contains("summary", constraint.toString(), Case.INSENSITIVE) - .endGroup() - .findAll() + .beginGroup() + .contains("name", constraint.toString(), Case.INSENSITIVE) + .or() + .contains("summary", constraint.toString(), Case.INSENSITIVE) + .endGroup() + .findAll() } else { data = it } @@ -97,11 +97,13 @@ class GuildListAdapter : BaseRecyclerViewAdapter } val formattedNumber = NumberAbbreviator.abbreviate(itemView.context, guild.memberCount.toDouble(), number) binding.guildBadgeView.setImageBitmap( - HabiticaIconsHelper.imageOfGuildCrest(itemView.context, - false, - false, - guild.memberCount.toFloat(), - formattedNumber) + HabiticaIconsHelper.imageOfGuildCrest( + itemView.context, + false, + false, + guild.memberCount.toFloat(), + formattedNumber + ) ) } } 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 3571e3953..9da8459db 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 @@ -5,17 +5,17 @@ import androidx.paging.PagedListAdapter import androidx.recyclerview.widget.DiffUtil import com.habitrpg.android.habitica.R import com.habitrpg.android.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.ChatRecyclerViewHolder 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 io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.PublishSubject -import com.habitrpg.android.habitica.models.members.Member -class InboxAdapter(private var user: User?, private var replyToUser : Member) : PagedListAdapter(DIFF_CALLBACK) { +class InboxAdapter(private var user: User?, private var replyToUser: Member) : PagedListAdapter(DIFF_CALLBACK) { private val FIRST_MESSAGE = 0 private val NORMAL_MESSAGE = 1 @@ -27,7 +27,7 @@ class InboxAdapter(private var user: User?, private var replyToUser : Member) : private val replyMessageEvents = PublishSubject.create() private val copyMessageEvents = PublishSubject.create() - private fun isPositionIntroMessage(position: Int) : Boolean { + private fun isPositionIntroMessage(position: Int): Boolean { return (position == super.getItemCount() - 1) } @@ -39,7 +39,7 @@ class InboxAdapter(private var user: User?, private var replyToUser : Member) : return if (isPositionIntroMessage(position)) -1 else super.getItemId(position) } - override fun getItem(position: Int) : ChatMessage? { + override fun getItem(position: Int): ChatMessage? { return if (isPositionIntroMessage(position)) ChatMessage() else super.getItem(position) } @@ -49,19 +49,20 @@ class InboxAdapter(private var user: User?, private var replyToUser : Member) : } override fun onBindViewHolder(holder: ChatRecyclerViewHolder, position: Int) { - val firstMessage : Boolean = getItemViewType(position) == FIRST_MESSAGE + val firstMessage: Boolean = getItemViewType(position) == FIRST_MESSAGE if (firstMessage) { val introHolder = holder as ChatRecyclerIntroViewHolder introHolder.bind(replyToUser) introHolder.onOpenProfile = { userLabelClickEvents.onNext(it) } - } - else { - val message : ChatMessage = getItem(position) ?: return + } else { + val message: ChatMessage = getItem(position) ?: return val messageHolder = holder as ChatRecyclerMessageViewHolder - messageHolder.bind(message, + messageHolder.bind( + message, user?.id ?: "", user, - expandedMessageId == message.id) + expandedMessageId == message.id + ) messageHolder.onShouldExpand = { expandMessage(message.id, position) } messageHolder.onLikeMessage = { likeMessageEvents.onNext(it) } messageHolder.onOpenProfile = { userLabelClickEvents.onNext(it) } @@ -101,14 +102,18 @@ class InboxAdapter(private var user: User?, private var replyToUser : Member) : companion object { private val DIFF_CALLBACK = object : - DiffUtil.ItemCallback() { + DiffUtil.ItemCallback() { // Concert details may have changed if reloaded from the database, // but ID is fixed. - override fun areItemsTheSame(oldConcert: ChatMessage, - newConcert: ChatMessage) = oldConcert.id == newConcert.id + override fun areItemsTheSame( + oldConcert: ChatMessage, + newConcert: ChatMessage + ) = oldConcert.id == newConcert.id - override fun areContentsTheSame(oldConcert: ChatMessage, - newConcert: ChatMessage) = oldConcert.text == newConcert.text + override fun areContentsTheSame( + oldConcert: ChatMessage, + newConcert: ChatMessage + ) = oldConcert.text == newConcert.text } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt index 9c370c77f..8a21ace35 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt @@ -16,9 +16,14 @@ import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.PublishSubject -class ChallengeTasksRecyclerViewAdapter(taskFilterHelper: TaskFilterHelper?, layoutResource: Int, - newContext: Context, userID: String, - private val openTaskDisabled: Boolean, private val taskActionsDisabled: Boolean) : BaseTasksRecyclerViewAdapter>("", taskFilterHelper, layoutResource, newContext, userID) { +class ChallengeTasksRecyclerViewAdapter( + taskFilterHelper: TaskFilterHelper?, + layoutResource: Int, + newContext: Context, + userID: String, + private val openTaskDisabled: Boolean, + private val taskActionsDisabled: Boolean +) : BaseTasksRecyclerViewAdapter>("", taskFilterHelper, layoutResource, newContext, userID) { private val addItemSubject = PublishSubject.create() @@ -79,7 +84,6 @@ class ChallengeTasksRecyclerViewAdapter(taskFilterHelper: TaskFilterHelper?, lay return viewHolder } - /** * @param task * @return true if task found&updated 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 0b3f291e1..da0cb77c0 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 @@ -11,7 +11,6 @@ import java.util.* class ChallengesFilterRecyclerViewAdapter(entries: List) : RecyclerView.Adapter() { - private val entries: List private val holderList: MutableList val checkedEntries: List @@ -35,7 +34,7 @@ class ChallengesFilterRecyclerViewAdapter(entries: List) : RecyclerView.A override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChallengeViewHolder { val view = LayoutInflater.from(parent.context) - .inflate(R.layout.dialog_challenge_filter_group_item, parent, false) + .inflate(R.layout.dialog_challenge_filter_group_item, parent, false) val challengeViewHolder = ChallengeViewHolder(view) holderList.add(challengeViewHolder) @@ -80,4 +79,4 @@ class ChallengesFilterRecyclerViewAdapter(entries: List) : RecyclerView.A checkbox.text = group.name } } -} \ No newline at end of file +} 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 19677ccb7..b9afeecf5 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 @@ -7,20 +7,21 @@ import android.view.ViewGroup import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.TaskRepository -import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.helpers.TaskFilterHelper import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.proxy.AnalyticsManager import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter import com.habitrpg.android.habitica.ui.viewHolders.BindableViewHolder -import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.schedulers.Schedulers import java.util.* import javax.inject.Inject -abstract class BaseTasksRecyclerViewAdapter>(var taskType: String, private val taskFilterHelper: TaskFilterHelper?, private val layoutResource: Int, - newContext: Context, private val userID: String?) : BaseRecyclerViewAdapter() { +abstract class BaseTasksRecyclerViewAdapter>( + var taskType: String, + private val taskFilterHelper: TaskFilterHelper?, + private val layoutResource: Int, + newContext: Context, + private val userID: String? +) : BaseRecyclerViewAdapter() { @Inject lateinit var analyticsManager: AnalyticsManager @Inject @@ -53,7 +54,7 @@ abstract class BaseTasksRecyclerViewAdapter>(var t internal fun getContentView(parent: ViewGroup): View = getContentView(parent, layoutResource) protected fun getContentView(parent: ViewGroup, layoutResource: Int): View = - LayoutInflater.from(parent.context).inflate(layoutResource, parent, false) + LayoutInflater.from(parent.context).inflate(layoutResource, parent, false) private fun updateTask(task: Task) { if (taskType != task.type) 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 953d36b4a..82d29b47a 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 @@ -1,18 +1,21 @@ package com.habitrpg.android.habitica.ui.adapter.tasks import android.view.ViewGroup - import com.habitrpg.android.habitica.helpers.TaskFilterHelper -import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.ui.viewHolders.tasks.DailyViewHolder class DailiesRecyclerViewHolder(layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter(layoutResource, taskFilterHelper) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DailyViewHolder = - DailyViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) }, - { task, item -> checklistItemScoreSubject.onNext(Pair(task, item))}, { - task -> taskOpenEventsSubject.onNext(task) - }) { - task -> brokenTaskEventsSubject.onNext(task) + DailyViewHolder( + getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) }, + { task, item -> checklistItemScoreSubject.onNext(Pair(task, item)) }, + { + task -> + taskOpenEventsSubject.onNext(task) } + ) { + task -> + brokenTaskEventsSubject.onNext(task) + } } 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 3a83a8f2a..9f704269d 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 @@ -2,15 +2,19 @@ package com.habitrpg.android.habitica.ui.adapter.tasks import android.view.ViewGroup import com.habitrpg.android.habitica.helpers.TaskFilterHelper -import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.ui.viewHolders.tasks.HabitViewHolder class HabitsRecyclerViewAdapter(layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter(layoutResource, taskFilterHelper) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HabitViewHolder = - HabitViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) }, { - task -> taskOpenEventsSubject.onNext(task) - }) { - task -> brokenTaskEventsSubject.onNext(task) + HabitViewHolder( + getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) }, + { + task -> + taskOpenEventsSubject.onNext(task) } -} \ No newline at end of file + ) { + task -> + brokenTaskEventsSubject.onNext(task) + } +} 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 5b98e4485..7198f4ff3 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 @@ -16,19 +16,19 @@ import io.reactivex.rxjava3.subjects.PublishSubject import io.realm.OrderedRealmCollection abstract class RealmBaseTasksRecyclerViewAdapter( - private val layoutResource: Int, - private val taskFilterHelper: TaskFilterHelper? + private val layoutResource: Int, + private val taskFilterHelper: TaskFilterHelper? ) : BaseRecyclerViewAdapter(), TaskRecyclerViewAdapter { override var canScoreTasks = true private var unfilteredData: List? = null override var taskDisplayMode: String = "standard" - set(value) { - if (field != value) { - field = value - notifyDataSetChanged() + set(value) { + if (field != value) { + field = value + notifyDataSetChanged() + } } - } private var errorButtonEventsSubject: PublishSubject = PublishSubject.create() override val errorButtonEvents: Flowable = errorButtonEventsSubject.toFlowable(BackpressureStrategy.DROP) @@ -63,7 +63,7 @@ abstract class RealmBaseTasksRecyclerViewAdapter( internal fun getContentView(parent: ViewGroup): View = getContentView(parent, layoutResource) private fun getContentView(parent: ViewGroup, layoutResource: Int): View = - LayoutInflater.from(parent.context).inflate(layoutResource, parent, false) + LayoutInflater.from(parent.context).inflate(layoutResource, parent, false) final override fun filter() { val unfilteredData = this.unfilteredData ?: return 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 b9b8cf26b..b52543b87 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.adapter.tasks - import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -20,13 +19,13 @@ import io.reactivex.rxjava3.subjects.PublishSubject class RewardsRecyclerViewAdapter(private var customRewards: List?, private val layoutResource: Int) : BaseRecyclerViewAdapter(), TaskRecyclerViewAdapter { var user: User? = null - set(value) { - if (field?.versionNumber == value?.versionNumber) { - return + set(value) { + if (field?.versionNumber == value?.versionNumber) { + return + } + field = value + notifyDataSetChanged() } - field = value - notifyDataSetChanged() - } override var canScoreTasks = true private var inAppRewards: List? = null @@ -43,7 +42,6 @@ class RewardsRecyclerViewAdapter(private var customRewards: List?, private private var purchaseCardSubject: PublishSubject = PublishSubject.create() val purchaseCardEvents: Flowable = purchaseCardSubject.toFlowable(BackpressureStrategy.LATEST) - override var taskDisplayMode: String = "standard" set(value) { if (field != value) { @@ -54,13 +52,13 @@ class RewardsRecyclerViewAdapter(private var customRewards: List?, private private val inAppRewardCount: Int get() { - //if (inAppRewards?.isValid != true) return 0 + // if (inAppRewards?.isValid != true) return 0 return inAppRewards?.size ?: 0 } private val customRewardCount: Int get() { - //if (customRewards?.isValid != true) return 0 + // if (customRewards?.isValid != true) return 0 return customRewards?.size ?: 0 } @@ -70,14 +68,20 @@ class RewardsRecyclerViewAdapter(private var customRewards: List?, private override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return if (viewType == VIEWTYPE_CUSTOM_REWARD) { - RewardViewHolder(getContentView(parent), { task, direction -> - if (task.value <= (user?.stats?.gp ?: 0.0)) { - taskScoreEventsSubject.onNext(Pair(task, direction)) + RewardViewHolder( + getContentView(parent), + { task, direction -> + if (task.value <= (user?.stats?.gp ?: 0.0)) { + taskScoreEventsSubject.onNext(Pair(task, direction)) + } + }, + { + task -> + taskOpenEventsSubject.onNext(task) } - }, { - task -> taskOpenEventsSubject.onNext(task) - }) { - task -> brokenTaskEventsSubject.onNext(task) + ) { + task -> + brokenTaskEventsSubject.onNext(task) } } else { val viewHolder = ShopItemViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.row_shopitem, parent, false)) @@ -130,7 +134,7 @@ class RewardsRecyclerViewAdapter(private var customRewards: List?, private fun updateItemRewards(items: List) { if (items.isNotEmpty()) { if (Task::class.java.isAssignableFrom(items.first().javaClass)) { - //this catches a weird bug where the observable gets a list of tasks for no apparent reason. + // this catches a weird bug where the observable gets a list of tasks for no apparent reason. return } } 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 840bb02a2..385fe8bff 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 @@ -1,19 +1,21 @@ package com.habitrpg.android.habitica.ui.adapter.tasks import android.view.ViewGroup - import com.habitrpg.android.habitica.helpers.TaskFilterHelper -import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.ui.viewHolders.tasks.TodoViewHolder class TodosRecyclerViewAdapter(layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter(layoutResource, taskFilterHelper) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder = - TodoViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) }, - { task, item -> checklistItemScoreSubject.onNext(Pair(task, item))}, { - task -> taskOpenEventsSubject.onNext(task) - }) { - task -> brokenTaskEventsSubject.onNext(task) + TodoViewHolder( + getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) }, + { task, item -> checklistItemScoreSubject.onNext(Pair(task, item)) }, + { + task -> + taskOpenEventsSubject.onNext(task) } - + ) { + task -> + brokenTaskEventsSubject.onNext(task) + } } 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 ef316ad2f..59f135d96 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 @@ -22,7 +22,6 @@ import com.plattysoft.leonids.ParticleSystem import javax.inject.Inject import javax.inject.Named - class AboutFragment : BaseMainFragment() { @field:[Inject Named(AppModule.NAMED_USER_ID)] @@ -128,39 +127,39 @@ class AboutFragment : BaseMainFragment() { private fun doTheThing() { val context = context ?: return FirebaseAnalytics.getInstance(context).logEvent("found_easter_egg", null) - DataBindingUtils.loadImage(context,"Pet-Sabretooth-Base") {bitmap -> + DataBindingUtils.loadImage(context, "Pet-Sabretooth-Base") { bitmap -> activity?.runOnUiThread { activity?.let { ParticleSystem(it, 50, bitmap, 3000) - .setAcceleration(0.00013f, 90) - .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) - .setFadeOut(200, AccelerateInterpolator()) - .setRotationSpeed(100f) - .emitWithGravity(binding?.anchor, Gravity.BOTTOM, 20, 10000) + .setAcceleration(0.00013f, 90) + .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) + .setFadeOut(200, AccelerateInterpolator()) + .setRotationSpeed(100f) + .emitWithGravity(binding?.anchor, Gravity.BOTTOM, 20, 10000) } } } - DataBindingUtils.loadImage(context,"Pet-Sabretooth-Golden") {bitmap -> + DataBindingUtils.loadImage(context, "Pet-Sabretooth-Golden") { bitmap -> activity?.runOnUiThread { activity?.let { ParticleSystem(it, 50, bitmap, 3000) - .setAcceleration(0.00013f, 90) - .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) - .setFadeOut(200, AccelerateInterpolator()) - .setRotationSpeed(100f) - .emitWithGravity(binding?.anchor, Gravity.BOTTOM, 20, 10000) + .setAcceleration(0.00013f, 90) + .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) + .setFadeOut(200, AccelerateInterpolator()) + .setRotationSpeed(100f) + .emitWithGravity(binding?.anchor, Gravity.BOTTOM, 20, 10000) } } } - DataBindingUtils.loadImage(context, "Pet-Sabretooth-Red") {bitmap -> + DataBindingUtils.loadImage(context, "Pet-Sabretooth-Red") { bitmap -> activity?.runOnUiThread { activity?.let { ParticleSystem(it, 50, bitmap, 3000) - .setAcceleration(0.00013f, 90) - .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) - .setFadeOut(200, AccelerateInterpolator()) - .setRotationSpeed(100f) - .emitWithGravity(binding?.anchor, Gravity.BOTTOM, 20, 10000) + .setAcceleration(0.00013f, 90) + .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) + .setFadeOut(200, AccelerateInterpolator()) + .setRotationSpeed(100f) + .emitWithGravity(binding?.anchor, Gravity.BOTTOM, 20, 10000) } } } 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 41215ddbe..640535294 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 @@ -18,7 +18,7 @@ import io.reactivex.rxjava3.kotlin.Flowables import io.reactivex.rxjava3.kotlin.combineLatest import javax.inject.Inject -class AchievementsFragment: BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { +class AchievementsFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @Inject lateinit var inventoryRepository: InventoryRepository @@ -32,12 +32,11 @@ class AchievementsFragment: BaseMainFragment private var menuID: Int = 0 private lateinit var adapter: AchievementsAdapter private var useGridLayout = false - set(value) { - field = value - adapter.useGridLayout = value - adapter.notifyDataSetChanged() - } - + set(value) { + field = value + adapter.useGridLayout = value + adapter.notifyDataSetChanged() + } override fun injectFragment(component: UserComponent) { component.inject(this) @@ -81,48 +80,63 @@ class AchievementsFragment: BaseMainFragment binding?.refreshLayout?.setOnRefreshListener(this) - compositeSubscription.add(userRepository.getAchievements().map { achievements -> - achievements.sortedBy { - if (it.category == "onboarding") { - it.index - } else { - (it.category?.first()?.toInt() ?: 2) * it.index + compositeSubscription.add( + userRepository.getAchievements().map { achievements -> + achievements.sortedBy { + if (it.category == "onboarding") { + it.index + } else { + (it.category?.first()?.toInt() ?: 2) * it.index + } } - } - }.combineLatest(Flowables.combineLatest(userRepository.getQuestAchievements(), userRepository.getQuestAchievements() - .map { it.mapNotNull { achievement -> achievement.questKey } } - .flatMap { inventoryRepository.getQuestContent(it) })).subscribe({ - val achievements = it.first - val entries = mutableListOf() - var lastCategory = "" - achievements.forEach { achievement -> - val categoryIdentifier = achievement.category ?: "" - if (categoryIdentifier != lastCategory) { - val category = Pair(categoryIdentifier, achievements.count { check -> - check.category == categoryIdentifier && check.earned - }) - entries.add(category) - lastCategory = categoryIdentifier - } - entries.add(achievement) - } - val questAchievements = it.second - entries.add(Pair("Quests completed", questAchievements.first.size)) - entries.addAll(questAchievements.first.map { achievement -> - val questContent = questAchievements.second.firstOrNull { achievement.questKey == it.key } - achievement.title = questContent?.text - achievement - }) + }.combineLatest( + Flowables.combineLatest( + userRepository.getQuestAchievements(), + userRepository.getQuestAchievements() + .map { it.mapNotNull { achievement -> achievement.questKey } } + .flatMap { inventoryRepository.getQuestContent(it) } + ) + ).subscribe( + { + val achievements = it.first + val entries = mutableListOf() + var lastCategory = "" + achievements.forEach { achievement -> + val categoryIdentifier = achievement.category ?: "" + if (categoryIdentifier != lastCategory) { + val category = Pair( + categoryIdentifier, + achievements.count { check -> + check.category == categoryIdentifier && check.earned + } + ) + entries.add(category) + lastCategory = categoryIdentifier + } + entries.add(achievement) + } + val questAchievements = it.second + entries.add(Pair("Quests completed", questAchievements.first.size)) + entries.addAll( + questAchievements.first.map { achievement -> + val questContent = questAchievements.second.firstOrNull { achievement.questKey == it.key } + achievement.title = questContent?.text + achievement + } + ) - val challengeAchievementCount = user?.challengeAchievements?.size ?: 0 - if (challengeAchievementCount > 0) { - entries.add(Pair("Challenges won", challengeAchievementCount)) - user?.challengeAchievements?.let { it1 -> entries.addAll(it1) } - } + val challengeAchievementCount = user?.challengeAchievements?.size ?: 0 + if (challengeAchievementCount > 0) { + entries.add(Pair("Challenges won", challengeAchievementCount)) + user?.challengeAchievements?.let { it1 -> entries.addAll(it1) } + } - adapter.entries = entries - adapter.notifyDataSetChanged() - }, RxErrorHandler.handleEmptyError())) + adapter.entries = entries + adapter.notifyDataSetChanged() + }, + RxErrorHandler.handleEmptyError() + ) + ) } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { @@ -132,7 +146,6 @@ class AchievementsFragment: BaseMainFragment menuItem?.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) menuItem?.setIcon(R.drawable.ic_round_view_list_24px) tintMenuIcon(menuItem) - } else { val menuItem = menu.add(R.string.switch_to_grid_view) menuID = menuItem?.itemId ?: 0 @@ -155,8 +168,12 @@ class AchievementsFragment: BaseMainFragment } override fun onRefresh() { - compositeSubscription.add(userRepository.retrieveAchievements().subscribe({ - }, RxErrorHandler.handleEmptyError(), { binding?.refreshLayout?.isRefreshing = false })) + compositeSubscription.add( + userRepository.retrieveAchievements().subscribe( + { + }, + RxErrorHandler.handleEmptyError(), { binding?.refreshLayout?.isRefreshing = false } + ) + ) } - -} \ No newline at end of file +} 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 5008482dd..164b7ed01 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 @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.DialogFragment -import androidx.fragment.app.Fragment import androidx.viewbinding.ViewBinding import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.components.UserComponent @@ -23,7 +22,7 @@ import java.util.HashMap import java.util.concurrent.TimeUnit import javax.inject.Inject -abstract class BaseDialogFragment : DialogFragment() { +abstract class BaseDialogFragment : DialogFragment() { var isModal: Boolean = false abstract var binding: VB? @@ -57,7 +56,6 @@ abstract class BaseDialogFragment : DialogFragment() { try { EventBus.getDefault().register(this) } catch (ignored: EventBusException) { - } val additionalData = HashMap() @@ -78,19 +76,24 @@ abstract class BaseDialogFragment : DialogFragment() { private fun showTutorialIfNeeded() { if (view != null) { if (this.tutorialStepIdentifier != null) { - compositeSubscription.add(tutorialRepository.getTutorialStep(this.tutorialStepIdentifier ?: "").firstElement() - .delay(1, TimeUnit.SECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(Consumer { step -> - if (step != null && step.isValid && step.isManaged && step.shouldDisplay()) { - val mainActivity = activity as? MainActivity ?: return@Consumer - if (tutorialText != null) { - mainActivity.displayTutorialStep(step, tutorialText ?: "", tutorialCanBeDeferred) - } else { - mainActivity.displayTutorialStep(step, tutorialTexts, tutorialCanBeDeferred) - } - } - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + tutorialRepository.getTutorialStep(this.tutorialStepIdentifier ?: "").firstElement() + .delay(1, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + Consumer { step -> + if (step != null && step.isValid && step.isManaged && step.shouldDisplay()) { + val mainActivity = activity as? MainActivity ?: return@Consumer + if (tutorialText != null) { + mainActivity.displayTutorialStep(step, tutorialText ?: "", tutorialCanBeDeferred) + } else { + mainActivity.displayTutorialStep(step, tutorialTexts, tutorialCanBeDeferred) + } + } + }, + RxErrorHandler.handleEmptyError() + ) + ) } } } @@ -110,7 +113,7 @@ abstract class BaseDialogFragment : DialogFragment() { override fun onDestroy() { try { tutorialRepository.close() - } catch (exception: UninitializedPropertyAccessException) {/* no-on */ } + } catch (exception: UninitializedPropertyAccessException) { /* no-on */ } super.onDestroy() } 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 5f155ed74..0fba23db0 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 @@ -4,13 +4,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment import androidx.viewbinding.ViewBinding import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.TutorialRepository -import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.ui.activities.MainActivity import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -22,7 +20,7 @@ import java.util.* import java.util.concurrent.TimeUnit import javax.inject.Inject -abstract class BaseFragment : Fragment() { +abstract class BaseFragment : Fragment() { var isModal: Boolean = false abstract var binding: VB? @@ -56,7 +54,6 @@ abstract class BaseFragment : Fragment() { try { EventBus.getDefault().register(this) } catch (ignored: EventBusException) { - } binding = createBinding(inflater, container) @@ -73,19 +70,24 @@ abstract class BaseFragment : Fragment() { private fun showTutorialIfNeeded() { if (view != null) { if (this.tutorialStepIdentifier != null) { - compositeSubscription.add(tutorialRepository.getTutorialStep(this.tutorialStepIdentifier ?: "").firstElement() + compositeSubscription.add( + tutorialRepository.getTutorialStep(this.tutorialStepIdentifier ?: "").firstElement() .delay(1, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(Consumer { step -> - if (step != null && step.isValid && step.isManaged && step.shouldDisplay()) { - val mainActivity = activity as? MainActivity ?: return@Consumer - if (tutorialText != null) { - mainActivity.displayTutorialStep(step, tutorialText ?: "", tutorialCanBeDeferred) - } else { - mainActivity.displayTutorialStep(step, tutorialTexts, tutorialCanBeDeferred) + .subscribe( + Consumer { step -> + if (step != null && step.isValid && step.isManaged && step.shouldDisplay()) { + val mainActivity = activity as? MainActivity ?: return@Consumer + if (tutorialText != null) { + mainActivity.displayTutorialStep(step, tutorialText ?: "", tutorialCanBeDeferred) + } else { + mainActivity.displayTutorialStep(step, tutorialTexts, tutorialCanBeDeferred) + } } - } - }, RxErrorHandler.handleEmptyError())) + }, + RxErrorHandler.handleEmptyError() + ) + ) } } } @@ -105,7 +107,7 @@ abstract class BaseFragment : Fragment() { override fun onDestroy() { try { tutorialRepository.close() - } catch (exception: UninitializedPropertyAccessException) {/* no-on */ } + } catch (exception: UninitializedPropertyAccessException) { /* no-on */ } super.onDestroy() } 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 f53932c9f..ad80245e6 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 @@ -20,7 +20,7 @@ import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper import javax.inject.Inject -abstract class BaseMainFragment : BaseFragment() { +abstract class BaseMainFragment : BaseFragment() { @Inject lateinit var apiClient: ApiClient @@ -49,8 +49,11 @@ abstract class BaseMainFragment : BaseFragment() { } } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { compositeSubscription.add(userRepository.getUser().subscribe({ user = it }, RxErrorHandler.handleEmptyError())) if (this.usesBottomNavigation) { @@ -126,7 +129,6 @@ abstract class BaseMainFragment : BaseFragment() { params?.scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL or AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED } - protected fun tintMenuIcon(item: MenuItem?) { context?.getThemeColor(R.attr.headerTextColor)?.let { item?.icon?.setTint(it) 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 0f1ddf94d..fe40f0029 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.fragments - import android.app.Activity import android.content.Intent import android.content.SharedPreferences @@ -55,7 +54,6 @@ import kotlin.time.hours import kotlin.time.minutes import kotlin.time.seconds - class NavigationDrawerFragment : DialogFragment() { private var binding: DrawerMainBinding? = null @@ -89,15 +87,15 @@ class NavigationDrawerFragment : DialogFragment() { get() = drawerLayout?.isDrawerOpen(GravityCompat.START) ?: false private var questContent: QuestContent? = null - set(value) { - field = value - updateQuestDisplay() - } + set(value) { + field = value + updateQuestDisplay() + } private var quest: Quest? = null - set(value) { - field = value - updateQuestDisplay() - } + set(value) { + field = value + updateQuestDisplay() + } private fun updateQuestDisplay() { val quest = this.quest @@ -125,7 +123,6 @@ class NavigationDrawerFragment : DialogFragment() { adapter.tintColor = questContent.colors?.extraLightColor ?: 0 adapter.backgroundTintColor = questContent.colors?.darkColor ?: 0 - binding?.messagesBadge?.visibility = View.GONE binding?.settingsBadge?.visibility = View.GONE binding?.notificationsBadge?.visibility = View.GONE @@ -171,8 +168,11 @@ class NavigationDrawerFragment : DialogFragment() { setHasOptionsMenu(true) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.drawer_main, container, false) as? ViewGroup + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? = inflater.inflate(R.layout.drawer_main, container, false) as? ViewGroup private var seasonalShopJob: Job? = null @@ -185,29 +185,48 @@ class NavigationDrawerFragment : DialogFragment() { binding?.recyclerView?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context) initializeMenuItems() - subscriptions?.add(adapter.getItemSelectionEvents().subscribe({ - setSelection(it.transitionId, it.bundle, true) - }, RxErrorHandler.handleEmptyError())) - subscriptions?.add(adapter.getPromoCloseEvents().subscribe({ - sharedPreferences.edit { - putBoolean("hide${it}", true) - } - updatePromo() - adapter.notifyDataSetChanged() - }, RxErrorHandler.handleEmptyError())) - - subscriptions?.add(socialRepository.getGroup(Group.TAVERN_ID) - .doOnNext { quest = it.quest } - .filter { it.hasActiveQuest } - .flatMapMaybe { inventoryRepository.getQuestContent(it.quest?.key ?: "").firstElement() } - .subscribe({ - questContent = it - }, RxErrorHandler.handleEmptyError())) + subscriptions?.add( + adapter.getItemSelectionEvents().subscribe( + { + setSelection(it.transitionId, it.bundle, true) + }, + RxErrorHandler.handleEmptyError() + ) + ) + subscriptions?.add( + adapter.getPromoCloseEvents().subscribe( + { + sharedPreferences.edit { + putBoolean("hide$it", true) + } + updatePromo() + adapter.notifyDataSetChanged() + }, + RxErrorHandler.handleEmptyError() + ) + ) subscriptions?.add( - Flowable.combineLatest(contentRepository.getWorldState(), inventoryRepository.getAvailableLimitedItems(), { state, items -> + socialRepository.getGroup(Group.TAVERN_ID) + .doOnNext { quest = it.quest } + .filter { it.hasActiveQuest } + .flatMapMaybe { inventoryRepository.getQuestContent(it.quest?.key ?: "").firstElement() } + .subscribe( + { + questContent = it + }, + RxErrorHandler.handleEmptyError() + ) + ) + + subscriptions?.add( + Flowable.combineLatest( + contentRepository.getWorldState(), inventoryRepository.getAvailableLimitedItems(), + { state, items -> return@combineLatest Pair(state, items) - }).subscribe( { pair -> + } + ).subscribe( + { pair -> updateSeasonalMenuEntries(pair.first, pair.second) seasonalShopJob?.cancel() seasonalShopJob = lifecycleScope.launch(Dispatchers.Main) { @@ -218,22 +237,35 @@ class NavigationDrawerFragment : DialogFragment() { delay(if (diff < (1.hours.inMilliseconds)) 1.seconds else 1.minutes) } } - }, RxErrorHandler.handleEmptyError())) + }, + RxErrorHandler.handleEmptyError() + ) + ) if (configManager.enableTeamBoards()) { - subscriptions?.add(userRepository.getTeamPlans() + subscriptions?.add( + userRepository.getTeamPlans() .distinctUntilChanged { firstTeams, secondTeams -> firstTeams == secondTeams } - .subscribe({ - getItemWithIdentifier(SIDEBAR_TEAMS)?.isVisible = it.size != 0 - adapter.setTeams(it) - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + getItemWithIdentifier(SIDEBAR_TEAMS)?.isVisible = it.size != 0 + adapter.setTeams(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) } else { getItemWithIdentifier(SIDEBAR_TEAMS)?.isVisible = false } - subscriptions?.add(userRepository.getUser().subscribe({ - updateUser(it) - }, RxErrorHandler.handleEmptyError())) + subscriptions?.add( + userRepository.getUser().subscribe( + { + updateUser(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) binding?.messagesButtonWrapper?.setOnClickListener { setSelection(R.id.inboxFragment, null, true, preventReselection = false) } binding?.settingsButtonWrapper?.setOnClickListener { setSelection(R.id.prefsActivity, null, true, preventReselection = false) } @@ -265,7 +297,7 @@ class NavigationDrawerFragment : DialogFragment() { private fun updateUser(user: User) { setMessagesCount(user.inbox?.newMessages ?: 0) - setSettingsCount(if (user.flags?.verifiedUsername != true) 1 else 0 ) + setSettingsCount(if (user.flags?.verifiedUsername != true) 1 else 0) setDisplayName(user.profile?.name) setUsername(user.formattedUsername) binding?.avatarView?.setAvatar(user) @@ -373,7 +405,7 @@ class NavigationDrawerFragment : DialogFragment() { private fun initializeMenuItems() { val items = ArrayList() - context?.let {context -> + context?.let { context -> val adventureItem = HabiticaDrawerItem(R.id.adventureGuideActivity, SIDEBAR_ADVENTURE_GUIDE) adventureItem.itemViewType = 4 items.add(adventureItem) @@ -412,7 +444,6 @@ class NavigationDrawerFragment : DialogFragment() { items.add(HabiticaDrawerItem(R.id.aboutFragment, SIDEBAR_ABOUT, context.getString(R.string.sidebar_about))) } - val promoItem = HabiticaDrawerItem(R.id.subscriptionPurchaseActivity, SIDEBAR_PROMO) promoItem.itemViewType = 5 promoItem.isVisible = false @@ -479,16 +510,22 @@ class NavigationDrawerFragment : DialogFragment() { this.drawerLayout?.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START) // set UP the drawer's list view with items and click listener - subscriptions?.add(viewModel.getNotificationCount().subscribeWithErrorHandler { - setNotificationsCount(it) - }) - subscriptions?.add(viewModel.allNotificationsSeen().subscribeWithErrorHandler { - setNotificationsSeen(it) - }) - subscriptions?.add(viewModel.getHasPartyNotification().subscribeWithErrorHandler { - val partyMenuItem = getItemWithIdentifier(SIDEBAR_PARTY) - partyMenuItem?.showBubble = it - }) + subscriptions?.add( + viewModel.getNotificationCount().subscribeWithErrorHandler { + setNotificationsCount(it) + } + ) + subscriptions?.add( + viewModel.allNotificationsSeen().subscribeWithErrorHandler { + setNotificationsSeen(it) + } + ) + subscriptions?.add( + viewModel.getHasPartyNotification().subscribeWithErrorHandler { + val partyMenuItem = getItemWithIdentifier(SIDEBAR_PARTY) + partyMenuItem?.showBubble = it + } + ) } fun openDrawer() { @@ -506,7 +543,7 @@ class NavigationDrawerFragment : DialogFragment() { } private fun getItemWithIdentifier(identifier: String): HabiticaDrawerItem? = - adapter.getItemWithIdentifier(identifier) + adapter.getItemWithIdentifier(identifier) private fun updateItem(item: HabiticaDrawerItem) { adapter.updateItem(item) 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 55e58fec6..e840e9b4d 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 @@ -12,7 +12,6 @@ import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentNewsBinding import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler - class NewsFragment : BaseMainFragment() { override var binding: FragmentNewsBinding? = null 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 42adfbb40..8dec4b479 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 @@ -39,4 +39,4 @@ class PromoInfoFragment : BaseMainFragment() { super.onResume() activity?.title = "" } -} \ No newline at end of file +} 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 7edc9bbbf..64a66c54a 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 @@ -40,7 +40,6 @@ class PromoWebFragment : BaseMainFragment() { var url = args.url url = url.replace("USER_ID", userID) binding?.newsWebview?.loadUrl(url) - } } 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 c7a9764fd..f050e1d96 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 @@ -10,7 +10,6 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentStatsBinding - import com.habitrpg.android.habitica.extensions.addOkButton import com.habitrpg.android.habitica.extensions.getThemeColor import com.habitrpg.android.habitica.extensions.setScaledPadding @@ -22,14 +21,12 @@ import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.stats.BulkAllocateStatsDialog -import io.reactivex.rxjava3.functions.Consumer import java.util.* import javax.inject.Inject import javax.inject.Named import kotlin.math.min - -class StatsFragment: BaseMainFragment() { +class StatsFragment : BaseMainFragment() { override var binding: FragmentStatsBinding? = null @@ -89,12 +86,17 @@ class StatsFragment: BaseMainFragment() { binding?.distributeTaskHelpButton?.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color)) } - compositeSubscription.add(userRepository.getUser().subscribe({ user -> - canAllocatePoints = user?.stats?.lvl ?: 0 >= 10 && user?.stats?.points ?: 0 > 0 - binding?.unlockAtLevel?.visibility = if (user.stats?.lvl ?: 0 < 10) View.VISIBLE else View.GONE - updateStats(user) - updateAttributePoints(user) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getUser().subscribe( + { user -> + canAllocatePoints = user?.stats?.lvl ?: 0 >= 10 && user?.stats?.points ?: 0 > 0 + binding?.unlockAtLevel?.visibility = if (user.stats?.lvl ?: 0 < 10) View.VISIBLE else View.GONE + updateStats(user) + updateAttributePoints(user) + }, + RxErrorHandler.handleEmptyError() + ) + ) binding?.distributeEvenlyButton?.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { @@ -112,7 +114,7 @@ class StatsFragment: BaseMainFragment() { } } - binding?.automaticAllocationSwitch?.setOnCheckedChangeListener{ _, isChecked -> + binding?.automaticAllocationSwitch?.setOnCheckedChangeListener { _, isChecked -> userRepository.updateUser("preferences.automaticAllocation", isChecked).subscribe({}, RxErrorHandler.handleEmptyError()) } @@ -144,7 +146,6 @@ class StatsFragment: BaseMainFragment() { binding?.distributeEvenlyButton?.isChecked = allocationMode == Stats.AUTO_ALLOCATE_FLAT binding?.distributeClassButton?.isChecked = allocationMode == Stats.AUTO_ALLOCATE_CLASSBASED binding?.distributeTaskButton?.isChecked = allocationMode == Stats.AUTO_ALLOCATE_TASKBASED - } private fun showHelpAlert(resourceId: Int) { @@ -217,65 +218,69 @@ class StatsFragment: BaseMainFragment() { outfitList.add(thisOutfit.weapon) } - compositeSubscription.add(inventoryRepository.getEquipment(outfitList).firstElement() + compositeSubscription.add( + inventoryRepository.getEquipment(outfitList).firstElement() .retry(1) - .subscribe( { - val levelStat = min((user.stats?.lvl ?: 0) / 2.0f, 50f).toInt() + .subscribe( + { + val levelStat = min((user.stats?.lvl ?: 0) / 2.0f, 50f).toInt() - totalStrength = levelStat - totalIntelligence = levelStat - totalConstitution = levelStat - totalPerception = levelStat + totalStrength = levelStat + totalIntelligence = levelStat + totalConstitution = levelStat + totalPerception = levelStat - binding?.strengthStatsView?.levelValue = levelStat - binding?.intelligenceStatsView?.levelValue = levelStat - binding?.constitutionStatsView?.levelValue = levelStat - binding?.perceptionStatsView?.levelValue = levelStat + binding?.strengthStatsView?.levelValue = levelStat + binding?.intelligenceStatsView?.levelValue = levelStat + binding?.constitutionStatsView?.levelValue = levelStat + binding?.perceptionStatsView?.levelValue = levelStat - totalStrength += user.stats?.buffs?.str?.toInt() ?: 0 - totalIntelligence += user.stats?.buffs?._int?.toInt() ?: 0 - totalConstitution += user.stats?.buffs?.con?.toInt() ?: 0 - totalPerception += user.stats?.buffs?.per?.toInt() ?: 0 - binding?.strengthStatsView?.buffValue = user.stats?.buffs?.str?.toInt() ?: 0 - binding?.intelligenceStatsView?.buffValue = user.stats?.buffs?._int?.toInt() ?: 0 - binding?.constitutionStatsView?.buffValue = user.stats?.buffs?.con?.toInt() ?: 0 - binding?.perceptionStatsView?.buffValue = user.stats?.buffs?.per?.toInt() ?: 0 + totalStrength += user.stats?.buffs?.str?.toInt() ?: 0 + totalIntelligence += user.stats?.buffs?._int?.toInt() ?: 0 + totalConstitution += user.stats?.buffs?.con?.toInt() ?: 0 + totalPerception += user.stats?.buffs?.per?.toInt() ?: 0 + binding?.strengthStatsView?.buffValue = user.stats?.buffs?.str?.toInt() ?: 0 + binding?.intelligenceStatsView?.buffValue = user.stats?.buffs?._int?.toInt() ?: 0 + binding?.constitutionStatsView?.buffValue = user.stats?.buffs?.con?.toInt() ?: 0 + binding?.perceptionStatsView?.buffValue = user.stats?.buffs?.per?.toInt() ?: 0 - totalStrength += user.stats?.strength ?: 0 - totalIntelligence += user.stats?.intelligence ?: 0 - totalConstitution += user.stats?.constitution ?: 0 - totalPerception += user.stats?.per ?: 0 - binding?.strengthStatsView?.allocatedValue = user.stats?.strength ?: 0 - binding?.intelligenceStatsView?.allocatedValue = user.stats?.intelligence ?: 0 - binding?.constitutionStatsView?.allocatedValue = user.stats?.constitution ?: 0 - binding?.perceptionStatsView?.allocatedValue = user.stats?.per ?: 0 - val userStatComputer = UserStatComputer() - val statsRows = userStatComputer.computeClassBonus(it, user) + totalStrength += user.stats?.strength ?: 0 + totalIntelligence += user.stats?.intelligence ?: 0 + totalConstitution += user.stats?.constitution ?: 0 + totalPerception += user.stats?.per ?: 0 + binding?.strengthStatsView?.allocatedValue = user.stats?.strength ?: 0 + binding?.intelligenceStatsView?.allocatedValue = user.stats?.intelligence ?: 0 + binding?.constitutionStatsView?.allocatedValue = user.stats?.constitution ?: 0 + binding?.perceptionStatsView?.allocatedValue = user.stats?.per ?: 0 + val userStatComputer = UserStatComputer() + val statsRows = userStatComputer.computeClassBonus(it, user) - var strength = 0 - var intelligence = 0 - var constitution = 0 - var perception = 0 + var strength = 0 + var intelligence = 0 + var constitution = 0 + var perception = 0 - for (row in statsRows) { - if (row.javaClass == UserStatComputer.AttributeRow::class.java) { - val attributeRow = row as UserStatComputer.AttributeRow - strength += attributeRow.strVal.toInt() - intelligence += attributeRow.intVal.toInt() - constitution += attributeRow.conVal.toInt() - perception += attributeRow.perVal.toInt() + for (row in statsRows) { + if (row.javaClass == UserStatComputer.AttributeRow::class.java) { + val attributeRow = row as UserStatComputer.AttributeRow + strength += attributeRow.strVal.toInt() + intelligence += attributeRow.intVal.toInt() + constitution += attributeRow.conVal.toInt() + perception += attributeRow.perVal.toInt() + } } - } - totalStrength += strength - totalIntelligence += intelligence - totalConstitution += constitution - totalPerception += perception - binding?.strengthStatsView?.equipmentValue = strength - binding?.intelligenceStatsView?.equipmentValue = intelligence - binding?.constitutionStatsView?.equipmentValue = constitution - binding?.perceptionStatsView?.equipmentValue = perception - - }, RxErrorHandler.handleEmptyError())) + totalStrength += strength + totalIntelligence += intelligence + totalConstitution += constitution + totalPerception += perception + binding?.strengthStatsView?.equipmentValue = strength + binding?.intelligenceStatsView?.equipmentValue = intelligence + binding?.constitutionStatsView?.equipmentValue = constitution + binding?.perceptionStatsView?.equipmentValue = perception + }, + RxErrorHandler.handleEmptyError() + ) + ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt index 952c840ea..e89ab1837 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt @@ -20,7 +20,8 @@ import com.habitrpg.android.habitica.ui.helpers.MarginDecoration import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import javax.inject.Inject -class AvatarCustomizationFragment : BaseMainFragment(), +class AvatarCustomizationFragment : + BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { override var binding: FragmentRefreshRecyclerviewBinding? = null @@ -41,34 +42,42 @@ class AvatarCustomizationFragment : BaseMainFragment if (customization.type == "background") { userRepository.unlockPath(user, customization) - .flatMap { userRepository.retrieveUser(false, true, true) } + .flatMap { userRepository.retrieveUser(false, true, true) } } else { userRepository.useCustomization(customization.type ?: "", customization.category, customization.identifier ?: "") } } - .subscribe({ }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getUnlockCustomizationEvents() + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) + compositeSubscription.add( + adapter.getUnlockCustomizationEvents() .flatMap { customization -> userRepository.unlockPath(user, customization) } .flatMap { userRepository.retrieveUser(withTasks = false, forced = true) } .flatMap { inventoryRepository.retrieveInAppRewards() } - .subscribe({ }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getUnlockSetEvents() + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) + compositeSubscription.add( + adapter.getUnlockSetEvents() .flatMap { set -> userRepository.unlockPath(set) - } + } .flatMap { userRepository.retrieveUser(withTasks = false, forced = true) } .flatMap { inventoryRepository.retrieveInAppRewards() } - .subscribe({ }, RxErrorHandler.handleEmptyError())) - + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) return super.onCreateView(inflater, container, savedInstanceState) } @@ -103,9 +112,11 @@ class AvatarCustomizationFragment : BaseMainFragment prefs?.hair?.flower.toString() "beard" -> prefs?.hair?.beard.toString() "mustache" -> prefs?.hair?.mustache.toString() - else -> "" + else -> "" } else -> "" } @@ -180,9 +196,13 @@ class AvatarCustomizationFragment : BaseMainFragment(), +class AvatarEquipmentFragment : + BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @Inject @@ -40,25 +41,34 @@ class AvatarEquipmentFragment : BaseMainFragment val key = (if (equipment.key?.isNotBlank() != true) activeEquipment else equipment.key) ?: "" inventoryRepository.equip(user, if (user?.preferences?.costume == true) "costume" else "equipped", key) } - .subscribe({ }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getUnlockCustomizationEvents() + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) + compositeSubscription.add( + adapter.getUnlockCustomizationEvents() .flatMap { Flowable.empty() } - .subscribe({ }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getUnlockSetEvents() + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) + compositeSubscription.add( + adapter.getUnlockSetEvents() .flatMap { set -> userRepository.unlockPath(set) } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) return super.onCreateView(inflater, container, savedInstanceState) } @@ -91,9 +101,11 @@ class AvatarEquipmentFragment : BaseMainFragment() binding?.avatarHairMustacheView?.setOnClickListener { displayCustomizationFragment("hair", "mustache") } binding?.avatarBackgroundView?.setOnClickListener { displayCustomizationFragment("background", null) } - compositeSubscription.add(userRepository.getUser().subscribeWithErrorHandler { - updateUser(it) - }) + compositeSubscription.add( + userRepository.getUser().subscribeWithErrorHandler { + updateUser(it) + } + ) } override fun injectFragment(component: UserComponent) { @@ -94,11 +96,11 @@ class AvatarOverviewFragment : BaseMainFragment() override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { val newSize: String = if (position == 0) "slim" else "broad" - compositeSubscription.add(userRepository.updateUser("preferences.size", newSize) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.updateUser("preferences.size", newSize) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } override fun onNothingSelected(parent: AdapterView<*>) { /* no-on */ } - - } 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 6a018e1b5..1ee163b59 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 @@ -19,7 +19,8 @@ import com.habitrpg.android.habitica.ui.helpers.EmptyItem import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import javax.inject.Inject -class EquipmentDetailFragment : BaseMainFragment(), +class EquipmentDetailFragment : + BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @Inject @@ -38,10 +39,15 @@ class EquipmentDetailFragment : BaseMainFragment inventoryRepository.equipGear(user, key, isCostume ?: false).firstElement() } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + compositeSubscription.add( + this.adapter.equipEvents.flatMapMaybe { key -> inventoryRepository.equipGear(user, key, isCostume ?: false).firstElement() } + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) return super.onCreateView(inflater, container, savedInstanceState) } @@ -88,8 +94,13 @@ class EquipmentDetailFragment : BaseMainFragment(), SwipeRefr binding?.recyclerView?.adapter = adapter adapter?.let { adapter -> - compositeSubscription.add(adapter.getSellItemFlowable() - .flatMap { item -> inventoryRepository.sellItem(item) } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + adapter.getSellItemFlowable() + .flatMap { item -> inventoryRepository.sellItem(item) } + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) - compositeSubscription.add(adapter.getQuestInvitationFlowable() - .flatMap { quest -> inventoryRepository.inviteToQuest(quest) } - .flatMap { socialRepository.retrieveGroup("party") } - .subscribe({ - if (isModal) { - dismiss() - } else { - MainNavigationController.navigate(R.id.partyFragment) - } - }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getOpenMysteryItemFlowable() - .flatMap { inventoryRepository.openMysteryItem(user) } - .doOnNext { - val activity = activity as? MainActivity - if (activity != null) { - val dialog = OpenedMysteryitemDialog(activity) - dialog.isCelebratory = true - dialog.setTitle(R.string.mystery_item_title) - dialog.binding.iconView.loadImage("shop_${it.key}") - dialog.binding.titleView.text = it.text - dialog.binding.descriptionView.text = it.notes - dialog.addButton(R.string.equip, true) { _, _ -> - inventoryRepository.equip(user, "equipped", it.key ?: "").subscribe( {}, RxErrorHandler.handleEmptyError()) + compositeSubscription.add( + adapter.getQuestInvitationFlowable() + .flatMap { quest -> inventoryRepository.inviteToQuest(quest) } + .flatMap { socialRepository.retrieveGroup("party") } + .subscribe( + { + if (isModal) { + dismiss() + } else { + MainNavigationController.navigate(R.id.partyFragment) + } + }, + RxErrorHandler.handleEmptyError() + ) + ) + compositeSubscription.add( + adapter.getOpenMysteryItemFlowable() + .flatMap { inventoryRepository.openMysteryItem(user) } + .doOnNext { + val activity = activity as? MainActivity + if (activity != null) { + val dialog = OpenedMysteryitemDialog(activity) + dialog.isCelebratory = true + dialog.setTitle(R.string.mystery_item_title) + dialog.binding.iconView.loadImage("shop_${it.key}") + dialog.binding.titleView.text = it.text + dialog.binding.descriptionView.text = it.notes + dialog.addButton(R.string.equip, true) { _, _ -> + inventoryRepository.equip(user, "equipped", it.key ?: "").subscribe({}, RxErrorHandler.handleEmptyError()) + } + dialog.addCloseButton() + dialog.enqueue() } - dialog.addCloseButton() - dialog.enqueue() } - } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) compositeSubscription.add(adapter.hatchPetEvents.subscribeWithErrorHandler { hatchPet(it.first, it.second) }) } } @@ -180,12 +189,11 @@ class ItemDialogFragment : BaseDialogFragment(), SwipeRefr openMarket() } - //binding?.openEmptyMarketButton?.setOnClickListener { openMarket() } + // binding?.openEmptyMarketButton?.setOnClickListener { openMarket() } this.loadItems() } - override fun onResume() { if ((this.isHatching || this.isFeeding) && dialog?.window != null) { val params = dialog?.window?.attributes @@ -204,10 +212,12 @@ class ItemDialogFragment : BaseDialogFragment(), SwipeRefr override fun onRefresh() { binding?.refreshLayout?.isRefreshing = true - compositeSubscription.add(userRepository.retrieveUser(true, true) - .doOnTerminate { - binding?.refreshLayout?.isRefreshing = false - }.subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.retrieveUser(true, true) + .doOnTerminate { + binding?.refreshLayout?.isRefreshing = false + }.subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } private fun hatchPet(potion: HatchingPotion, egg: Egg) { @@ -225,37 +235,44 @@ class ItemDialogFragment : BaseDialogFragment(), SwipeRefr else -> Egg::class.java } itemType?.let { type -> - compositeSubscription.add(inventoryRepository.getOwnedItems(type) - .doOnNext { items -> - val filteredItems = if (isFeeding) { - items.filter { it.key != "Saddle" } - } else { - items + compositeSubscription.add( + inventoryRepository.getOwnedItems(type) + .doOnNext { items -> + val filteredItems = if (isFeeding) { + items.filter { it.key != "Saddle" } + } else { + items + } + adapter?.data = filteredItems } - adapter?.data = filteredItems - } - .map { items -> items.mapNotNull { it.key } } - .flatMap { inventoryRepository.getItems(itemClass, it.toTypedArray()) } - .map { - val itemMap = mutableMapOf() - for (item in it) { - itemMap[item.key] = item + .map { items -> items.mapNotNull { it.key } } + .flatMap { inventoryRepository.getItems(itemClass, it.toTypedArray()) } + .map { + val itemMap = mutableMapOf() + for (item in it) { + itemMap[item.key] = item + } + itemMap } - itemMap - } - .subscribe({ items -> - adapter?.items = items - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { items -> + adapter?.items = items + }, + RxErrorHandler.handleEmptyError() + ) + ) } compositeSubscription.add(inventoryRepository.getPets().subscribe({ adapter?.setExistingPets(it) }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(inventoryRepository.getOwnedPets() - .map { ownedMounts -> - val mountMap = mutableMapOf() - ownedMounts.forEach { mountMap[it.key ?: ""] = it } - return@map mountMap - } - .subscribe({ adapter?.setOwnedPets(it) }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + inventoryRepository.getOwnedPets() + .map { ownedMounts -> + val mountMap = mutableMapOf() + ownedMounts.forEach { mountMap[it.key ?: ""] = it } + return@map mountMap + } + .subscribe({ adapter?.setOwnedPets(it) }, RxErrorHandler.handleEmptyError()) + ) } private fun openMarket() { 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 84ab7d310..1aec01f32 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 @@ -86,17 +86,25 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL binding?.recyclerView?.adapter = adapter adapter?.let { adapter -> - compositeSubscription.add(adapter.getSellItemFlowable() + compositeSubscription.add( + adapter.getSellItemFlowable() .flatMap { item -> inventoryRepository.sellItem(item) } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) - compositeSubscription.add(adapter.getQuestInvitationFlowable() + compositeSubscription.add( + adapter.getQuestInvitationFlowable() .flatMap { quest -> inventoryRepository.inviteToQuest(quest) } .flatMap { socialRepository.retrieveGroup("party") } - .subscribe({ - MainNavigationController.navigate(R.id.partyFragment) - }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getOpenMysteryItemFlowable() + .subscribe( + { + MainNavigationController.navigate(R.id.partyFragment) + }, + RxErrorHandler.handleEmptyError() + ) + ) + compositeSubscription.add( + adapter.getOpenMysteryItemFlowable() .flatMap { inventoryRepository.openMysteryItem(user) } .doOnNext { val activity = activity as? MainActivity @@ -108,13 +116,14 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL dialog.binding.titleView.text = it.text dialog.binding.descriptionView.text = it.notes dialog.addButton(R.string.equip, true) { _, _ -> - inventoryRepository.equip(user, "equipped", it.key ?: "").subscribe( {}, RxErrorHandler.handleEmptyError()) + inventoryRepository.equip(user, "equipped", it.key ?: "").subscribe({}, RxErrorHandler.handleEmptyError()) } dialog.addCloseButton() dialog.enqueue() } } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) compositeSubscription.add(adapter.startHatchingEvents.subscribeWithErrorHandler { showHatchingDialog(it) }) compositeSubscription.add(adapter.hatchPetEvents.subscribeWithErrorHandler { hatchPet(it.first, it.second) }) } @@ -160,10 +169,12 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL override fun onRefresh() { binding?.refreshLayout?.isRefreshing = true - compositeSubscription.add(userRepository.retrieveUser(true, true) + compositeSubscription.add( + userRepository.retrieveUser(true, true) .doOnTerminate { binding?.refreshLayout?.isRefreshing = false - }.subscribe({ }, RxErrorHandler.handleEmptyError())) + }.subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } private fun hatchPet(potion: HatchingPotion, egg: Egg) { @@ -180,33 +191,40 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL else -> Egg::class.java } itemType?.let { type -> - compositeSubscription.add(inventoryRepository.getOwnedItems(type) - .map { it.distinctBy { it.key } } - .doOnNext { items -> - adapter?.data = items - } - .map { items -> items.mapNotNull { it.key } } - .flatMap { inventoryRepository.getItems(itemClass, it.toTypedArray()) } - .map { - val itemMap = mutableMapOf() - for (item in it) { - itemMap[item.key] = item + compositeSubscription.add( + inventoryRepository.getOwnedItems(type) + .map { it.distinctBy { it.key } } + .doOnNext { items -> + adapter?.data = items } - itemMap - } - .subscribe({ items -> - adapter?.items = items - }, RxErrorHandler.handleEmptyError())) + .map { items -> items.mapNotNull { it.key } } + .flatMap { inventoryRepository.getItems(itemClass, it.toTypedArray()) } + .map { + val itemMap = mutableMapOf() + for (item in it) { + itemMap[item.key] = item + } + itemMap + } + .subscribe( + { items -> + adapter?.items = items + }, + RxErrorHandler.handleEmptyError() + ) + ) } compositeSubscription.add(inventoryRepository.getPets().subscribe({ adapter?.setExistingPets(it) }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(inventoryRepository.getOwnedPets() + compositeSubscription.add( + inventoryRepository.getOwnedPets() .map { ownedMounts -> val mountMap = mutableMapOf() ownedMounts.forEach { mountMap[it.key ?: ""] = it } return@map mountMap } - .subscribe({ adapter?.setOwnedPets(it) }, RxErrorHandler.handleEmptyError())) + .subscribe({ adapter?.setOwnedPets(it) }, RxErrorHandler.handleEmptyError()) + ) } private fun openMarket() { 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 a5207f5d3..1b0594e9f 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 @@ -20,8 +20,11 @@ class ItemsFragment : BaseMainFragment() { return FragmentViewpagerBinding.inflate(inflater, container, false) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { this.usesTabLayout = true this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -36,12 +39,12 @@ class ItemsFragment : BaseMainFragment() { arguments?.let { val args = ItemsFragmentArgs.fromBundle(it) binding?.viewPager?.currentItem = when (args.itemType) { - "hatchingPotions" -> 1 - "food" -> 2 - "quests" -> 3 - "special" -> 4 - else -> 0 - } + "hatchingPotions" -> 1 + "food" -> 2 + "quests" -> 3 + "special" -> 4 + else -> 0 + } } } 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 85e7a4e30..ead591b94 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 @@ -6,9 +6,9 @@ import android.view.View import android.view.ViewGroup import com.habitrpg.android.habitica.models.shops.Shop -class MarketFragment: ShopFragment() { +class MarketFragment : ShopFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { shopIdentifier = Shop.MARKET return super.onCreateView(inflater, container, savedInstanceState) } -} \ No newline at end of file +} 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 f82675a92..e76ce070d 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 @@ -6,9 +6,9 @@ import android.view.View import android.view.ViewGroup import com.habitrpg.android.habitica.models.shops.Shop -class QuestShopFragment: ShopFragment() { +class QuestShopFragment : ShopFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { shopIdentifier = Shop.QUEST_SHOP return super.onCreateView(inflater, container, savedInstanceState) } -} \ No newline at end of file +} 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 433f522b9..24c43ecad 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 @@ -6,9 +6,9 @@ import android.view.View import android.view.ViewGroup import com.habitrpg.android.habitica.models.shops.Shop -class SeasonalShopFragment: ShopFragment() { +class SeasonalShopFragment : ShopFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { shopIdentifier = Shop.SEASONAL_SHOP return super.onCreateView(inflater, container, savedInstanceState) } -} \ No newline at end of file +} 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 c4c88203e..b7d5e153a 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 @@ -11,7 +11,6 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.SocialRepository -import com.habitrpg.android.habitica.databinding.FragmentRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.events.GearPurchasedEvent import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -120,18 +119,28 @@ open class ShopFragment : BaseMainFragment() } } - compositeSubscription.add(userRepository.getUser().subscribe({ - adapter?.user = user - updateCurrencyView(it) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getUser().subscribe( + { + adapter?.user = user + updateCurrencyView(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) - compositeSubscription.add(socialRepository.getGroup(Group.TAVERN_ID) + compositeSubscription.add( + socialRepository.getGroup(Group.TAVERN_ID) .filter { it.hasActiveQuest } .filter { group -> group.quest?.rageStrikes?.any { it.key == shopIdentifier } ?: false } .filter { group -> group.quest?.rageStrikes?.filter { it.key == shopIdentifier }?.get(0)?.wasHit == true } - .subscribe({ - adapter?.shopSpriteSuffix = "_"+it.quest?.key - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + adapter?.shopSpriteSuffix = "_" + it.quest?.key + }, + RxErrorHandler.handleEmptyError() + ) + ) view.post { setGridSpanCount(view.width) } @@ -153,7 +162,8 @@ open class ShopFragment : BaseMainFragment() Shop.SEASONAL_SHOP -> "seasonal" else -> "" } - compositeSubscription.add(this.inventoryRepository.retrieveShopInventory(shopUrl) + compositeSubscription.add( + this.inventoryRepository.retrieveShopInventory(shopUrl) .map { shop1 -> if (shop1.identifier == Shop.MARKET) { val user = user @@ -172,9 +182,11 @@ open class ShopFragment : BaseMainFragment() formatTimeTravelersShop(shop1) } Shop.SEASONAL_SHOP -> { - shop1.categories.sortWith(compareBy { it.items.size != 1 } + shop1.categories.sortWith( + compareBy { it.items.size != 1 } .thenBy { it.items.firstOrNull()?.currency != "gold" } - .thenByDescending { it.items.firstOrNull()?.event?.end }) + .thenByDescending { it.items.firstOrNull()?.event?.end } + ) shop1 } else -> { @@ -182,64 +194,81 @@ open class ShopFragment : BaseMainFragment() } } } - .subscribe({ - this.shop = it - this.adapter?.setShop(it) - }, { - binding?.recyclerView?.state = RecyclerViewState.FAILED - RxErrorHandler.reportError(it) - }, { - binding?.refreshLayout?.isRefreshing = false - })) + .subscribe( + { + this.shop = it + this.adapter?.setShop(it) + }, + { + binding?.recyclerView?.state = RecyclerViewState.FAILED + RxErrorHandler.reportError(it) + }, + { + binding?.refreshLayout?.isRefreshing = false + } + ) + ) - compositeSubscription.add(this.inventoryRepository.getOwnedItems() - .subscribe({ adapter?.setOwnedItems(it) }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(this.inventoryRepository.getInAppRewards() + compositeSubscription.add( + this.inventoryRepository.getOwnedItems() + .subscribe({ adapter?.setOwnedItems(it) }, RxErrorHandler.handleEmptyError()) + ) + compositeSubscription.add( + this.inventoryRepository.getInAppRewards() .map { rewards -> rewards.map { it.key } } - .subscribe({ adapter?.setPinnedItemKeys(it) }, RxErrorHandler.handleEmptyError())) + .subscribe({ adapter?.setPinnedItemKeys(it) }, RxErrorHandler.handleEmptyError()) + ) } private fun formatTimeTravelersShop(shop: Shop): Shop { val newCategories = mutableListOf() for (category in shop.categories) { - if (category.pinType != "mystery_set") { - newCategories.add(category) - } else { - val newCategory = newCategories.find { it.identifier == "mystery_sets" } ?: ShopCategory() - if (newCategory.identifier.isEmpty()) { - newCategory.identifier = "mystery_sets" - newCategory.text = getString(R.string.mystery_sets) - newCategories.add(newCategory) - } - val item = category.items.firstOrNull() ?: continue - item.key = category.identifier - item.text = category.text - item.imageName = "shop_set_mystery_${item.key}" - item.pinType = "mystery_set" - item.path = "mystery.${item.key}" - newCategory.items.add(item) - } + if (category.pinType != "mystery_set") { + newCategories.add(category) + } else { + val newCategory = newCategories.find { it.identifier == "mystery_sets" } ?: ShopCategory() + if (newCategory.identifier.isEmpty()) { + newCategory.identifier = "mystery_sets" + newCategory.text = getString(R.string.mystery_sets) + newCategories.add(newCategory) + } + val item = category.items.firstOrNull() ?: continue + item.key = category.identifier + item.text = category.text + item.imageName = "shop_set_mystery_${item.key}" + item.pinType = "mystery_set" + item.path = "mystery.${item.key}" + newCategory.items.add(item) + } } shop.categories = newCategories return shop } private fun loadMarketGear() { - compositeSubscription.add(inventoryRepository.retrieveMarketGear() - .zipWith(inventoryRepository.getOwnedEquipment().map { equipment -> equipment.map { it.key } }, { shop, equipment -> - for (category in shop.categories) { - val items = category.items.asSequence().filter { - !equipment.contains(it.key) - }.sortedBy { it.locked }.toList() - category.items.clear() - category.items.addAll(items) + compositeSubscription.add( + inventoryRepository.retrieveMarketGear() + .zipWith( + inventoryRepository.getOwnedEquipment().map { equipment -> equipment.map { it.key } }, + { shop, equipment -> + for (category in shop.categories) { + val items = category.items.asSequence().filter { + !equipment.contains(it.key) + }.sortedBy { it.locked }.toList() + category.items.clear() + category.items.addAll(items) + } + shop } - shop - }) - .subscribe({ - this.gearCategories = it.categories - adapter?.gearCategories = it.categories - }, RxErrorHandler.handleEmptyError())) + ) + .subscribe( + { + this.gearCategories = it.categories + adapter?.gearCategories = it.categories + }, + RxErrorHandler.handleEmptyError() + ) + ) } override fun injectFragment(component: UserComponent) { @@ -278,7 +307,6 @@ open class ShopFragment : BaseMainFragment() } } - private fun updateCurrencyView(user: User) { currencyView.gold = user.stats?.gp ?: 0.0 currencyView.gems = user.gemCount.toDouble() 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 59bdc7542..14a0704f5 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 @@ -6,7 +6,7 @@ import android.view.View import android.view.ViewGroup import com.habitrpg.android.habitica.models.shops.Shop -class TimeTravelersShopFragment: ShopFragment() { +class TimeTravelersShopFragment : ShopFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { shopIdentifier = Shop.TIME_TRAVELERS_SHOP return super.onCreateView(inflater, container, savedInstanceState) @@ -19,4 +19,4 @@ class TimeTravelersShopFragment: ShopFragment() { currencyView.gemVisibility = View.GONE currencyView.hourglassVisibility = View.VISIBLE } -} \ No newline at end of file +} 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 75bf2051e..bc33fc34b 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 @@ -20,7 +20,8 @@ import com.habitrpg.android.habitica.ui.helpers.MarginDecoration import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import javax.inject.Inject -class MountDetailRecyclerFragment : BaseMainFragment(), +class MountDetailRecyclerFragment : + BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @Inject @@ -87,9 +88,12 @@ class MountDetailRecyclerFragment : BaseMainFragment inventoryRepository.equip(user, "mount", key) } - ?.subscribe({ + ?.subscribe( + { user?.let { updatedUser -> adapter?.setUser(updatedUser) } - }, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) } + }, + RxErrorHandler.handleEmptyError() + )?.let { compositeSubscription.add(it) } } if (savedInstanceState != null) { @@ -104,10 +108,10 @@ class MountDetailRecyclerFragment : BaseMainFragment - val mountMap = mutableMapOf() - ownedMounts.forEach { mountMap[it.key ?: ""] = it } - return@map mountMap - }.doOnNext { - adapter?.setOwnedMounts(it) - user?.let { updatedUser -> adapter?.setUser(updatedUser) } - }, { unsortedAnimals, ownedAnimals -> - val items = mutableListOf() - var lastMount: Mount? = null - var currentSection: StableSection? = null - for (mount in unsortedAnimals) { - if (mount.type == "wacky" || mount.type == "special") continue - if (mount.type != lastMount?.type) { - currentSection = StableSection(mount.type, mount.getTranslatedType(context) ?: "") - items.add(currentSection) - } - currentSection?.let { - it.totalCount += 1 - if (ownedAnimals.containsKey(mount.key)) { - it.ownedCount += 1 + compositeSubscription.add( + inventoryRepository.getMounts(animalType, animalGroup, animalColor) + .zipWith( + inventoryRepository.getOwnedMounts() + .map { ownedMounts -> + val mountMap = mutableMapOf() + ownedMounts.forEach { mountMap[it.key ?: ""] = it } + return@map mountMap + }.doOnNext { + adapter?.setOwnedMounts(it) + user?.let { updatedUser -> adapter?.setUser(updatedUser) } + }, + { unsortedAnimals, ownedAnimals -> + val items = mutableListOf() + var lastMount: Mount? = null + var currentSection: StableSection? = null + for (mount in unsortedAnimals) { + if (mount.type == "wacky" || mount.type == "special") continue + if (mount.type != lastMount?.type) { + currentSection = StableSection(mount.type, mount.getTranslatedType(context) ?: "") + items.add(currentSection) } + currentSection?.let { + it.totalCount += 1 + if (ownedAnimals.containsKey(mount.key)) { + it.ownedCount += 1 + } + } + items.add(mount) + lastMount = mount } - items.add(mount) - lastMount = mount + items } - items - }) - .subscribe({ adapter?.setItemList(it) }, RxErrorHandler.handleEmptyError())) + ) + .subscribe({ adapter?.setItemList(it) }, RxErrorHandler.handleEmptyError()) + ) } } @@ -160,8 +169,13 @@ class MountDetailRecyclerFragment : BaseMainFragment(), +class PetDetailRecyclerFragment : + BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @Inject lateinit var inventoryRepository: InventoryRepository - var adapter: PetDetailRecyclerAdapter = PetDetailRecyclerAdapter() private var animalType: String? = null private var animalGroup: String? = null @@ -92,24 +92,32 @@ class PetDetailRecyclerFragment : BaseMainFragment Maybe.zip( - inventoryRepository.getItems(Egg::class.java, arrayOf(animal.animal)).firstElement(), - inventoryRepository.getItems(HatchingPotion::class.java, arrayOf(animal.color)).firstElement(), { eggs, potions -> - Pair(eggs.first() as? Egg, potions.first() as? HatchingPotion) - } - ).subscribe({ - callback(it) - }, RxErrorHandler.handleEmptyError()) + inventoryRepository.getItems(Egg::class.java, arrayOf(animal.animal)).firstElement(), + inventoryRepository.getItems(HatchingPotion::class.java, arrayOf(animal.color)).firstElement(), + { eggs, potions -> + Pair(eggs.first() as? Egg, potions.first() as? HatchingPotion) + } + ).subscribe( + { + callback(it) + }, + RxErrorHandler.handleEmptyError() + ) } binding?.recyclerView?.adapter = adapter binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() this.loadItems() - compositeSubscription.add(adapter.getEquipFlowable() + compositeSubscription.add( + adapter.getEquipFlowable() .flatMap { key -> inventoryRepository.equip(user, "pet", key) } - .subscribe({ - user?.let { updatedUser -> adapter.setUser(updatedUser) } - }, RxErrorHandler.handleEmptyError())) - + .subscribe( + { + user?.let { updatedUser -> adapter.setUser(updatedUser) } + }, + RxErrorHandler.handleEmptyError() + ) + ) view.post { setGridSpanCount(view.width) } } @@ -140,48 +148,54 @@ class PetDetailRecyclerFragment : BaseMainFragment val mountMap = mutableMapOf() ownedMounts.forEach { mountMap[it.key ?: ""] = it } return@map mountMap } - .subscribe({ adapter.setOwnedMounts(it) }, RxErrorHandler.handleEmptyError())) + .subscribe({ adapter.setOwnedMounts(it) }, RxErrorHandler.handleEmptyError()) + ) compositeSubscription.add(inventoryRepository.getOwnedItems(true).subscribe({ adapter.setOwnedItems(it) }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(Flowables.combineLatest(inventoryRepository.getPets(animalType, animalGroup, animalColor), inventoryRepository.getOwnedPets() - .map { ownedPets -> - val petMap = mutableMapOf() - ownedPets.forEach { petMap[it.key ?: ""] = it } - return@map petMap - }.doOnNext { - adapter.setOwnedPets(it) - user?.let { updatedUser -> adapter.setUser(updatedUser) } - }).map { - val items = mutableListOf() - var lastPet: Pet? = null - var currentSection: StableSection? = null - for (pet in it.first) { - if (pet.type == "wacky" || pet.type == "special") continue - if (pet.type != lastPet?.type) { - currentSection = StableSection(pet.type, pet.getTranslatedType(context) ?: "") - items.add(currentSection) - } - currentSection?.let {section -> - section.totalCount += 1 - if (it.second.containsKey(pet.key)) { - section.ownedCount += 1 - } - } - items.add(pet) - lastPet = pet + compositeSubscription.add( + Flowables.combineLatest( + inventoryRepository.getPets(animalType, animalGroup, animalColor), + inventoryRepository.getOwnedPets() + .map { ownedPets -> + val petMap = mutableMapOf() + ownedPets.forEach { petMap[it.key ?: ""] = it } + return@map petMap + }.doOnNext { + adapter.setOwnedPets(it) + user?.let { updatedUser -> adapter.setUser(updatedUser) } } - items - }.subscribe({ adapter.setItemList(it) }, RxErrorHandler.handleEmptyError())) + ).map { + val items = mutableListOf() + var lastPet: Pet? = null + var currentSection: StableSection? = null + for (pet in it.first) { + if (pet.type == "wacky" || pet.type == "special") continue + if (pet.type != lastPet?.type) { + currentSection = StableSection(pet.type, pet.getTranslatedType(context) ?: "") + items.add(currentSection) + } + currentSection?.let { section -> + section.totalCount += 1 + if (it.second.containsKey(pet.key)) { + section.ownedCount += 1 + } + } + items.add(pet) + lastPet = pet + } + items + }.subscribe({ adapter.setItemList(it) }, RxErrorHandler.handleEmptyError()) + ) compositeSubscription.add(inventoryRepository.getMounts(animalType, animalGroup, animalColor).subscribe({ adapter.setExistingMounts(it) }, RxErrorHandler.handleEmptyError())) } } - @Subscribe fun showFeedingDialog(event: FeedCommand) { if (event.usingPet == null || event.usingFood == null) { @@ -200,8 +214,13 @@ class PetDetailRecyclerFragment : BaseMainFragment() { return FragmentViewpagerBinding.inflate(inflater, container, false) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { this.usesTabLayout = true this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -78,6 +80,6 @@ class StableFragment : BaseMainFragment() { 0 -> activity?.getString(R.string.pets) 1 -> activity?.getString(R.string.mounts) else -> "" - } ?: "" + } ?: "" } } 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 2cece79fa..5ad776fb9 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 @@ -29,7 +29,8 @@ import io.reactivex.rxjava3.kotlin.combineLatest import java.util.* import javax.inject.Inject -class StableRecyclerFragment : BaseFragment(), +class StableRecyclerFragment : + BaseFragment(), SwipeRefreshLayout.OnRefreshListener { @Inject @@ -72,7 +73,8 @@ class StableRecyclerFragment : BaseFragment( super.onViewCreated(view, savedInstanceState) binding?.recyclerView?.emptyItem = EmptyItem( - getString(R.string.empty_items, itemTypeText)) + getString(R.string.empty_items, itemTypeText) + ) binding?.refreshLayout?.setOnRefreshListener(this) layoutManager = androidx.recyclerview.widget.GridLayoutManager(activity, 2) @@ -97,13 +99,17 @@ class StableRecyclerFragment : BaseFragment( user?.let { adapter?.setUser(it) } adapter?.animalIngredientsRetriever = { animal, callback -> Maybe.zip( - inventoryRepository.getItems(Egg::class.java, arrayOf(animal.animal)).firstElement(), - inventoryRepository.getItems(HatchingPotion::class.java, arrayOf(animal.color)).firstElement(), { eggs, potions -> - Pair(eggs.first() as? Egg, potions.first() as? HatchingPotion) - } - ).subscribe({ - callback(it) - }, RxErrorHandler.handleEmptyError()) + inventoryRepository.getItems(Egg::class.java, arrayOf(animal.animal)).firstElement(), + inventoryRepository.getItems(HatchingPotion::class.java, arrayOf(animal.color)).firstElement(), + { eggs, potions -> + Pair(eggs.first() as? Egg, potions.first() as? HatchingPotion) + } + ).subscribe( + { + callback(it) + }, + RxErrorHandler.handleEmptyError() + ) } adapter?.itemType = this.itemType adapter?.shopSpriteSuffix = configManager.shopSpriteSuffix() @@ -111,12 +117,14 @@ class StableRecyclerFragment : BaseFragment( binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() adapter?.let { - compositeSubscription.add(it.getEquipFlowable() + compositeSubscription.add( + it.getEquipFlowable() .flatMap { key -> inventoryRepository.equip(user, if (itemType == "pets") "pet" else "mount", key) } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } } - + this.loadItems() view.post { setGridSpanCount(view.width) } } @@ -126,7 +134,6 @@ class StableRecyclerFragment : BaseFragment( outState.putString(ITEM_TYPE_KEY, this.itemType) } - private fun setGridSpanCount(width: Int) { var spanCount = 0 if (context != null && context?.resources != null) { @@ -160,7 +167,8 @@ class StableRecyclerFragment : BaseFragment( animalMap } - compositeSubscription.add(inventoryRepository.getItems(Egg::class.java) + compositeSubscription.add( + inventoryRepository.getItems(Egg::class.java) .map { val eggMap = mutableMapOf() it.forEach { egg -> @@ -168,23 +176,31 @@ class StableRecyclerFragment : BaseFragment( } eggMap } - .subscribe({ - adapter?.setEggs(it) - }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(ownedObservable.combineLatest(observable.toFlowable()) + .subscribe( + { + adapter?.setEggs(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) + compositeSubscription.add( + ownedObservable.combineLatest(observable.toFlowable()) .map { (ownedAnimals, unsortedAnimals) -> mapAnimals(unsortedAnimals, ownedAnimals) } - .subscribe({ items -> adapter?.setItemList(items) }, RxErrorHandler.handleEmptyError())) + .subscribe({ items -> adapter?.setItemList(items) }, RxErrorHandler.handleEmptyError()) + ) compositeSubscription.add(inventoryRepository.getOwnedItems(true).subscribe({ adapter?.setOwnedItems(it) }, RxErrorHandler.handleEmptyError())) compositeSubscription.add(inventoryRepository.getMounts().subscribe({ adapter?.setExistingMounts(it) }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(inventoryRepository.getOwnedMounts() + compositeSubscription.add( + inventoryRepository.getOwnedMounts() .map { ownedMounts -> val mountMap = mutableMapOf() ownedMounts.forEach { mountMap[it.key ?: ""] = it } return@map mountMap } - .subscribe({ adapter?.setOwnedMounts(it) }, RxErrorHandler.handleEmptyError())) + .subscribe({ adapter?.setOwnedMounts(it) }, RxErrorHandler.handleEmptyError()) + ) } private fun mapAnimals(unsortedAnimals: List, ownedAnimals: Map): ArrayList { @@ -206,7 +222,6 @@ class StableRecyclerFragment : BaseFragment( 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) @@ -252,8 +267,13 @@ class StableRecyclerFragment : BaseFragment( } override fun onRefresh() { - compositeSubscription.add(userRepository.retrieveUser(false, true).subscribe({ - binding?.refreshLayout?.isRefreshing = false - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.retrieveUser(false, true).subscribe( + { + binding?.refreshLayout?.isRefreshing = false + }, + RxErrorHandler.handleEmptyError() + ) + ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/APIPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/APIPreferenceFragment.kt index b5b45a102..37a5728ef 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/APIPreferenceFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/APIPreferenceFragment.kt @@ -11,14 +11,13 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.api.HostConfig import javax.inject.Inject -class APIPreferenceFragment: BasePreferencesFragment() { +class APIPreferenceFragment : BasePreferencesFragment() { @Inject lateinit var hostConfig: HostConfig private val apiPreferences: List get() = listOf(getString(R.string.SP_APIToken), getString(R.string.SP_userID)) - override fun onCreate(savedInstanceState: Bundle?) { HabiticaBaseApplication.userComponent?.inject(this) super.onCreate(savedInstanceState) @@ -26,11 +25,13 @@ class APIPreferenceFragment: BasePreferencesFragment() { override fun onPreferenceTreeClick(preference: Preference): Boolean { val clipMan = activity?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager - clipMan?.setPrimaryClip(if (preference.key == getString(R.string.SP_APIToken)) { - ClipData.newPlainText(preference.key, hostConfig.apiKey) - } else { - ClipData.newPlainText(preference.key, preference.summary) - }) + clipMan?.setPrimaryClip( + if (preference.key == getString(R.string.SP_APIToken)) { + ClipData.newPlainText(preference.key, hostConfig.apiKey) + } else { + ClipData.newPlainText(preference.key, preference.summary) + } + ) Toast.makeText(activity, "Copied " + preference.key + " to clipboard.", Toast.LENGTH_SHORT).show() return super.onPreferenceTreeClick(preference) } @@ -42,5 +43,4 @@ class APIPreferenceFragment: BasePreferencesFragment() { } } } - -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt index aa0c64860..0b10a91a1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt @@ -9,7 +9,6 @@ import android.widget.EditText import android.widget.LinearLayout import android.widget.Toast import androidx.core.os.bundleOf -import androidx.preference.ListPreference import androidx.preference.Preference import com.google.android.material.textfield.TextInputLayout import com.habitrpg.android.habitica.HabiticaBaseApplication @@ -28,7 +27,7 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaProgressDialog import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionDetailsView import javax.inject.Inject -class AuthenticationPreferenceFragment: BasePreferencesFragment() { +class AuthenticationPreferenceFragment : BasePreferencesFragment() { @Inject lateinit var configManager: AppConfigManager @@ -42,7 +41,6 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { updateUserFields() } - override fun onCreate(savedInstanceState: Bundle?) { HabiticaBaseApplication.userComponent?.inject(this) super.onCreate(savedInstanceState) @@ -116,9 +114,12 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { dialog.setTitle(R.string.change_password) dialog.addButton(R.string.change, true) { _, _ -> userRepository.updatePassword(oldPasswordEditText?.text.toString(), passwordEditText?.text.toString(), passwordRepeatEditText?.text.toString()) - .subscribe({ + .subscribe( + { Toast.makeText(activity, R.string.password_changed, Toast.LENGTH_SHORT).show() - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } dialog.addCancelButton() dialog.setAdditionalContentView(view) @@ -139,9 +140,12 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { dialog.setTitle(R.string.change_email) dialog.addButton(R.string.change, true) { _, _ -> userRepository.updateEmail(emailEditText?.text.toString(), passwordEditText?.text.toString()) - .subscribe({ + .subscribe( + { configurePreference(findPreference("email"), emailEditText?.text.toString(), true) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } dialog.addCancelButton() dialog.setAdditionalContentView(view) @@ -161,9 +165,12 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { dialog.setTitle(R.string.change_username) dialog.addButton(R.string.save, true) { _, _ -> userRepository.updateLoginName(loginNameEditText?.text.toString()) - .subscribe({ + .subscribe( + { configurePreference(findPreference("login_name"), loginNameEditText?.text.toString(), true) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } dialog.addCancelButton() dialog.setAdditionalContentView(view) @@ -213,10 +220,13 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { } thisDialog.dismiss() apiClient.registerUser(user?.username ?: "", emailEditText?.text.toString(), passwordEditText?.text.toString(), passwordRepeatEditText?.text.toString()) - .flatMap { userRepository.retrieveUser(false) } - .subscribe({ + .flatMap { userRepository.retrieveUser(false) } + .subscribe( + { configurePreference(findPreference("email"), emailEditText?.text.toString(), true) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } dialog.addCancelButton() dialog.setAdditionalContentView(view) @@ -227,14 +237,16 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { private fun deleteAccount(password: String) { val dialog = HabiticaProgressDialog.show(context, R.string.deleting_account) - compositeSubscription.add(userRepository.deleteAccount(password).subscribe({ _ -> - dialog?.dismiss() - context?.let { HabiticaBaseApplication.logout(it) } - activity?.finish() - }) { throwable -> - dialog?.dismiss() - RxErrorHandler.reportError(throwable) - }) + compositeSubscription.add( + userRepository.deleteAccount(password).subscribe({ _ -> + dialog?.dismiss() + context?.let { HabiticaBaseApplication.logout(it) } + activity?.finish() + }) { throwable -> + dialog?.dismiss() + RxErrorHandler.reportError(throwable) + } + ) } private fun showAccountResetConfirmation() { @@ -258,7 +270,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { dialog.setMessage(R.string.confirm_username_description) dialog.addButton(R.string.confirm, true) { _, _ -> userRepository.updateLoginName(user?.authentication?.localAuthentication?.username ?: "") - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .subscribe({ }, RxErrorHandler.handleEmptyError()) } dialog.addCancelButton() dialog.show() @@ -266,10 +278,12 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { private fun resetAccount() { val dialog = HabiticaProgressDialog.show(context, R.string.resetting_account) - compositeSubscription.add(userRepository.resetAccount().subscribe({ dialog?.dismiss() }) { throwable -> - dialog?.dismiss() - RxErrorHandler.reportError(throwable) - }) + compositeSubscription.add( + userRepository.resetAccount().subscribe({ dialog?.dismiss() }) { throwable -> + dialog?.dismiss() + RxErrorHandler.reportError(throwable) + } + ) } private fun showSubscriptionStatusDialog() { @@ -285,4 +299,4 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { dialog.show() } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/DayStartPreferenceDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/DayStartPreferenceDialogFragment.kt index a5023a436..d32488464 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/DayStartPreferenceDialogFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/DayStartPreferenceDialogFragment.kt @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.fragments.preferences - import android.content.Context import android.os.Build import android.os.Bundle @@ -44,8 +43,8 @@ class DayStartPreferenceDialogFragment : PreferenceDialogFragmentCompat() { val padding = resources.getDimension(R.dimen.card_padding).toInt() descriptionTextView?.setPadding(padding, padding, padding, padding) val lp = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT ) wrapper.addView(picker, lp) wrapper.addView(descriptionTextView, lp) @@ -92,14 +91,15 @@ class DayStartPreferenceDialogFragment : PreferenceDialogFragmentCompat() { preference.text = time } } - } companion object { val TAG: String? = TimePreferenceDialogFragment::class.java.simpleName fun newInstance( - preferenceFragment: PreferenceFragmentCompat, key: String): DayStartPreferenceDialogFragment { + preferenceFragment: PreferenceFragmentCompat, + key: String + ): DayStartPreferenceDialogFragment { val fragment = DayStartPreferenceDialogFragment() val arguments = Bundle(1) arguments.putString(ARG_KEY, key) 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 51536a052..7d81ddb33 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 @@ -73,7 +73,7 @@ class EmailNotificationsPreferencesFragment : BasePreferencesFragment(), SharedP else -> null } if (pathKey != null) { - compositeSubscription.add(userRepository.updateUser("preferences.emailNotifications.$pathKey", sharedPreferences.getBoolean(key, false)).subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(userRepository.updateUser("preferences.emailNotifications.$pathKey", sharedPreferences.getBoolean(key, false)).subscribe({ }, RxErrorHandler.handleEmptyError())) } } -} \ No newline at end of file +} 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 b012b08af..60bfb6b01 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 @@ -37,7 +37,7 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare @Inject lateinit var soundManager: SoundManager @Inject - lateinit var pushNotificationManager: PushNotificationManager + lateinit var pushNotificationManager: PushNotificationManager @Inject lateinit var configManager: AppConfigManager @Inject @@ -88,7 +88,6 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare val launchScreenPreference = findPreference("launch_screen") as? ListPreference launchScreenPreference?.summary = launchScreenPreference?.entry ?: "Habits" - val taskDisplayPreference = findPreference("task_display") as? ListPreference if (configManager.enableTaskDisplayMode()) { taskDisplayPreference?.summary = taskDisplayPreference?.entry @@ -108,7 +107,7 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare } override fun onPreferenceTreeClick(preference: Preference): Boolean { - when(preference.key) { + when (preference.key) { "logout" -> { context?.let { HabiticaBaseApplication.logout(it) } activity?.finish() @@ -123,9 +122,9 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare if (user?.flags?.classSelected == true && user?.preferences?.disableClasses == false) { context?.let { context -> val builder = AlertDialog.Builder(context) - .setMessage(getString(R.string.change_class_confirmation)) - .setNegativeButton(getString(R.string.dialog_go_back)) { dialog, _ -> dialog.dismiss() } - .setPositiveButton(getString(R.string.change_class)) { _, _ -> classSelectionResult.launch(intent) } + .setMessage(getString(R.string.change_class_confirmation)) + .setNegativeButton(getString(R.string.dialog_go_back)) { dialog, _ -> dialog.dismiss() } + .setPositiveButton(getString(R.string.change_class)) { _, _ -> classSelectionResult.launch(intent) } val alert = builder.create() alert.show() } @@ -139,12 +138,15 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare event.text = context?.getString(R.string.reloading_content) event.type = HabiticaSnackbar.SnackbarDisplayType.NORMAL EventBus.getDefault().post(event) - contentRepository.retrieveContent(context,true).subscribe({ - val completedEvent = ShowSnackbarEvent() - completedEvent.text = context?.getString(R.string.reloaded_content) - completedEvent.type = HabiticaSnackbar.SnackbarDisplayType.SUCCESS - EventBus.getDefault().post(completedEvent) - }, RxErrorHandler.handleEmptyError()) + contentRepository.retrieveContent(context, true).subscribe( + { + val completedEvent = ShowSnackbarEvent() + completedEvent.text = context?.getString(R.string.reloaded_content) + completedEvent.type = HabiticaSnackbar.SnackbarDisplayType.SUCCESS + EventBus.getDefault().post(completedEvent) + }, + RxErrorHandler.handleEmptyError() + ) } "fixCharacterValues" -> { val intent = Intent(activity, FixCharacterValuesActivity::class.java) @@ -208,8 +210,8 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare } userRepository.updateLanguage(languageHelper.languageCode ?: "en") - .flatMap { contentRepository.retrieveContent(context,true) } - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .flatMap { contentRepository.retrieveContent(context, true) } + .subscribe({ }, RxErrorHandler.handleEmptyError()) val intent = Intent(activity, MainActivity::class.java) this.startActivity(intent) @@ -218,8 +220,10 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare "audioTheme" -> { val newAudioTheme = sharedPreferences.getString(key, "off") if (newAudioTheme != null) { - compositeSubscription.add(userRepository.updateUser("preferences.sound", newAudioTheme) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.updateUser("preferences.sound", newAudioTheme) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) soundManager.soundTheme = newAudioTheme soundManager.preloadAllFiles() } @@ -233,7 +237,7 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare activity.reload() } "dailyDueDefaultView" -> userRepository.updateUser("preferences.dailyDueDefaultView", sharedPreferences.getBoolean(key, false)) - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .subscribe({ }, RxErrorHandler.handleEmptyError()) "server_url" -> { apiClient.updateServerUrl(sharedPreferences.getString(key, "")) findPreference(key)?.summary = sharedPreferences.getString(key, "") @@ -249,8 +253,10 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare "disablePMs" -> { val isDisabled = sharedPreferences.getBoolean("disablePMs", false) if (user?.inbox?.optOut != isDisabled) { - compositeSubscription.add(userRepository.updateUser("inbox.optOut", isDisabled) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.updateUser("inbox.optOut", isDisabled) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } } "launch_screen" -> { @@ -265,12 +271,12 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare if (preference.getKey() == "cds_time") { if (parentFragmentManager.findFragmentByTag(DayStartPreferenceDialogFragment.TAG) == null) { DayStartPreferenceDialogFragment.newInstance(this, preference.getKey()) - .show(parentFragmentManager, DayStartPreferenceDialogFragment.TAG) + .show(parentFragmentManager, DayStartPreferenceDialogFragment.TAG) } } else { if (parentFragmentManager.findFragmentByTag(TimePreferenceDialogFragment.TAG) == null) { - TimePreferenceDialogFragment.newInstance(this, preference.getKey()) - .show(parentFragmentManager, TimePreferenceDialogFragment.TAG) + TimePreferenceDialogFragment.newInstance(this, preference.getKey()) + .show(parentFragmentManager, TimePreferenceDialogFragment.TAG) } } } else { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt index b44139f76..4483fe7a6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt @@ -10,13 +10,13 @@ import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.user.User import io.reactivex.rxjava3.core.Flowable -class ProfilePreferencesFragment: BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener { +class ProfilePreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener { override var user: User? = null - set(value) { - field = value - updateUserFields() - } + set(value) { + field = value + updateUserFields() + } override fun onCreate(savedInstanceState: Bundle?) { HabiticaBaseApplication.userComponent?.inject(this) @@ -26,7 +26,6 @@ class ProfilePreferencesFragment: BasePreferencesFragment(), SharedPreferences.O override fun onResume() { super.onResume() preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) - } override fun onPause() { @@ -82,4 +81,4 @@ class ProfilePreferencesFragment: BasePreferencesFragment(), SharedPreferences.O observable?.subscribe({}, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) } } } -} \ No newline at end of file +} 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 4413d02f5..4de688c49 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 @@ -75,7 +75,7 @@ class PushNotificationsPreferencesFragment : BasePreferencesFragment(), SharedPr else -> null } if (pathKey != null) { - compositeSubscription.add(userRepository.updateUser("preferences.pushNotifications.$pathKey", sharedPreferences.getBoolean(key, false)).subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(userRepository.updateUser("preferences.pushNotifications.$pathKey", sharedPreferences.getBoolean(key, false)).subscribe({ }, RxErrorHandler.handleEmptyError())) } } -} \ No newline at end of file +} 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 3f733c790..56abe878c 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 @@ -3,10 +3,10 @@ package com.habitrpg.android.habitica.ui.fragments.preferences import android.content.Context import android.os.Build import android.os.Bundle -import androidx.preference.PreferenceDialogFragmentCompat -import androidx.preference.PreferenceFragmentCompat import android.view.View import android.widget.TimePicker +import androidx.preference.PreferenceDialogFragmentCompat +import androidx.preference.PreferenceFragmentCompat import com.habitrpg.android.habitica.prefs.TimePreference import java.util.* @@ -66,13 +66,14 @@ class TimePreferenceDialogFragment : PreferenceDialogFragmentCompat() { preference.text = time } } - } companion object { val TAG = TimePreferenceDialogFragment::class.java.simpleName fun newInstance( - preferenceFragment: PreferenceFragmentCompat, key: String): TimePreferenceDialogFragment { + preferenceFragment: PreferenceFragmentCompat, + key: String + ): TimePreferenceDialogFragment { val fragment = TimePreferenceDialogFragment() val arguments = Bundle(1) arguments.putString(ARG_KEY, key) @@ -82,4 +83,3 @@ class TimePreferenceDialogFragment : PreferenceDialogFragmentCompat() { } } } - 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 444fa1519..665573279 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 @@ -6,7 +6,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.EditText -import androidx.core.view.isVisible import androidx.fragment.app.Fragment import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent @@ -53,9 +52,14 @@ class GemsPurchaseFragment : BaseFragment(), GemPurc binding?.gems42View?.setOnPurchaseClickListener { purchaseGems(PurchaseTypes.Purchase42Gems) } binding?.gems84View?.setOnPurchaseClickListener { purchaseGems(PurchaseTypes.Purchase84Gems) } - compositeSubscription.add(userRepository.getUser().subscribe({ - binding?.subscriptionPromo?.visibility = if (it.isSubscribed) View.GONE else View.VISIBLE - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getUser().subscribe( + { + binding?.subscriptionPromo?.visibility = if (it.isSubscribed) View.GONE else View.VISIBLE + }, + RxErrorHandler.handleEmptyError() + ) + ) binding?.giftGemsButton?.setOnClickListener { showGiftGemsDialog() } @@ -77,9 +81,9 @@ class GemsPurchaseFragment : BaseFragment(), GemPurc binding?.promoBanner?.setOnClickListener { val fragment = PromoInfoFragment() parentFragmentManager - .beginTransaction() - .replace(R.id.fragment_container, fragment as Fragment) - .commit() + .beginTransaction() + .replace(R.id.fragment_container, fragment as Fragment) + .commit() } } else { binding?.promoBanner?.visibility = View.GONE 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 119235e84..1502dbfc7 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 @@ -58,15 +58,20 @@ class GiftBalanceGemsFragment : BaseFragment() { try { val amount = binding?.giftEditText?.text.toString().toInt() giftedMember?.id?.let { - compositeSubscription.add(socialRepository.transferGems(it, amount) - .flatMap { userRepository.retrieveUser(false, true) } - .doOnError { - isGifting = false - } - .subscribe({ - onCompleted?.invoke() - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + socialRepository.transferGems(it, amount) + .flatMap { userRepository.retrieveUser(false, true) } + .doOnError { + isGifting = false + } + .subscribe( + { + onCompleted?.invoke() + }, + RxErrorHandler.handleEmptyError() + ) + ) } } catch (ignored: NumberFormatException) {} } -} \ No newline at end of file +} 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 be08e28dd..3c4adb4fb 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 @@ -31,16 +31,16 @@ class GiftPurchaseGemsFragment : BaseFragment() } var giftedMember: Member? = null - @SuppressLint("SetTextI18n") - set(value) { - field = value - field?.let { - binding?.avatarView?.setAvatar(it) - binding?.displayNameTextview?.username = it.profile?.name - binding?.displayNameTextview?.tier = it.contributor?.level ?: 0 - binding?.usernameTextview?.text = "@${it.username}" + @SuppressLint("SetTextI18n") + set(value) { + field = value + field?.let { + binding?.avatarView?.setAvatar(it) + binding?.displayNameTextview?.username = it.profile?.name + binding?.displayNameTextview?.tier = it.contributor?.level ?: 0 + binding?.usernameTextview?.text = "@${it.username}" + } } - } private var purchaseHandler: PurchaseHandler? = 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 65cf68452..f209aa237 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 @@ -95,9 +95,9 @@ class SubscriptionFragment : BaseFragment(), GemPur binding?.promoBanner?.setOnClickListener { val fragment = PromoInfoFragment() parentFragmentManager - .beginTransaction() - .replace(R.id.fragment_container, fragment as Fragment) - .commit() + .beginTransaction() + .replace(R.id.fragment_container, fragment as Fragment) + .commit() } } else { binding?.promoBanner?.visibility = View.GONE @@ -105,10 +105,15 @@ class SubscriptionFragment : BaseFragment(), GemPur binding?.refreshLayout?.setOnRefreshListener { refresh() } - compositeSubscription.add(inventoryRepository.getLatestMysteryItem().subscribe({ - DataBindingUtils.loadImage(binding?.subBenefitsMysteryItemIcon, "shop_set_mystery_${it.key?.split("_")?.last()}") - binding?.subBenefitsMysteryItemText?.text = context?.getString(R.string.subscribe_listitem3_description_new, it.text) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + inventoryRepository.getLatestMysteryItem().subscribe( + { + DataBindingUtils.loadImage(binding?.subBenefitsMysteryItemIcon, "shop_set_mystery_${it.key?.split("_")?.last()}") + binding?.subBenefitsMysteryItemText?.text = context?.getString(R.string.subscribe_listitem3_description_new, it.text) + }, + RxErrorHandler.handleEmptyError() + ) + ) AmplitudeManager.sendNavigationEvent("subscription screen") } @@ -119,10 +124,15 @@ class SubscriptionFragment : BaseFragment(), GemPur } private fun refresh() { - compositeSubscription.add(userRepository.retrieveUser(withTasks = false, forced = true).subscribe({ - this.setUser(it) - binding?.refreshLayout?.isRefreshing = false - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.retrieveUser(withTasks = false, forced = true).subscribe( + { + this.setUser(it) + binding?.refreshLayout?.isRefreshing = false + }, + RxErrorHandler.handleEmptyError() + ) + ) } override fun injectFragment(component: UserComponent) { @@ -251,22 +261,31 @@ class SubscriptionFragment : BaseFragment(), GemPur private fun checkIfNeedsCancellation() { if (user?.purchased?.plan?.paymentMethod == "Google" && - user?.purchased?.plan?.isActive == true && - user?.purchased?.plan?.dateTerminated == null && - (purchasedSubscription?.autoRenewing == false ||purchasedSubscription == null)) { - compositeSubscription.add(apiClient.cancelSubscription() - .flatMap { userRepository.retrieveUser(false, true) } - .subscribe({ - refresh() - }, RxErrorHandler.handleEmptyError())) + user?.purchased?.plan?.isActive == true && + user?.purchased?.plan?.dateTerminated == null && + (purchasedSubscription?.autoRenewing == false || purchasedSubscription == null) + ) { + compositeSubscription.add( + apiClient.cancelSubscription() + .flatMap { userRepository.retrieveUser(false, true) } + .subscribe( + { + refresh() + }, + RxErrorHandler.handleEmptyError() + ) + ) } } private fun showSubscriptionOptions() { binding?.subscriptionOptions?.visibility = View.VISIBLE - binding?.subscriptionOptions?.postDelayed({ - binding?.scrollView?.smoothScrollTo(0, binding?.subscriptionOptions?.top ?: 0) - }, 500) + binding?.subscriptionOptions?.postDelayed( + { + binding?.scrollView?.smoothScrollTo(0, binding?.subscriptionOptions?.top ?: 0) + }, + 500 + ) } private fun subscribeUser() { @@ -277,20 +296,20 @@ class SubscriptionFragment : BaseFragment(), GemPur fun showGiftSubscriptionDialog(context: Context, iSG1G1: Boolean) { val chooseRecipientDialogView = context.layoutInflater.inflate(R.layout.dialog_choose_message_recipient, null) - val alert = HabiticaAlertDialog(context) - alert.setTitle(context.getString(R.string.gift_title)) - alert.addButton(context.getString(R.string.action_continue), true) { _, _ -> - val usernameEditText = chooseRecipientDialogView?.findViewById(R.id.uuidEditText) as? EditText - val intent = Intent(context, GiftSubscriptionActivity::class.java).apply { - putExtra("username", usernameEditText?.text.toString()) - } - context.startActivity(intent) + val alert = HabiticaAlertDialog(context) + alert.setTitle(context.getString(R.string.gift_title)) + alert.addButton(context.getString(R.string.action_continue), true) { _, _ -> + val usernameEditText = chooseRecipientDialogView?.findViewById(R.id.uuidEditText) as? EditText + val intent = Intent(context, GiftSubscriptionActivity::class.java).apply { + putExtra("username", usernameEditText?.text.toString()) } - alert.addCancelButton { _, _ -> - //context.dismissKeyboard() - } - alert.setAdditionalContentView(chooseRecipientDialogView) - alert.show() + context.startActivity(intent) + } + alert.addCancelButton { _, _ -> + // context.dismissKeyboard() + } + alert.setAdditionalContentView(chooseRecipientDialogView) + alert.show() } } } 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 c619c3d3a..e7cdb480e 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 @@ -215,6 +215,4 @@ class AvatarSetupFragment : BaseFragment() { params?.marginStart = location[0] + px binding?.customizationDrawer?.binding?.caretView?.layoutParams = params } - - } 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 009da53eb..49443d97b 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 @@ -87,5 +87,4 @@ class IntroFragment : BaseFragment() { this.backgroundColor = color binding?.containerView?.setBackgroundColor(color) } - } 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 b3a1a1bdf..9fbc97a11 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 @@ -78,13 +78,15 @@ class TaskSetupFragment : BaseFragment() { private fun setTasks() { this.taskGroups = listOf(listOf(getString(R.string.setup_group_work), TYPE_WORK), listOf(getString(R.string.setup_group_exercise), TYPE_EXERCISE), listOf(getString(R.string.setup_group_health), TYPE_HEALTH), listOf(getString(R.string.setup_group_school), TYPE_SCHOOL), 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)) - this.tasks = listOf(listOf(TYPE_WORK, Task.TYPE_HABIT, getString(R.string.setup_task_work_1), true, false), listOf(TYPE_WORK, Task.TYPE_DAILY, getString(R.string.setup_task_work_2)), listOf(TYPE_WORK, Task.TYPE_TODO, getString(R.string.setup_task_work_3)), - listOf(TYPE_EXERCISE, Task.TYPE_HABIT, getString(R.string.setup_task_exercise_1), true, false), listOf(TYPE_EXERCISE, Task.TYPE_DAILY, getString(R.string.setup_task_exercise_2)), listOf(TYPE_EXERCISE, Task.TYPE_TODO, getString(R.string.setup_task_exercise_3)), - listOf(TYPE_HEALTH, Task.TYPE_HABIT, getString(R.string.setup_task_healthWellness_1), true, true), listOf(TYPE_HEALTH, Task.TYPE_DAILY, getString(R.string.setup_task_healthWellness_2)), listOf(TYPE_HEALTH, Task.TYPE_TODO, getString(R.string.setup_task_healthWellness_3)), - listOf(TYPE_SCHOOL, Task.TYPE_HABIT, getString(R.string.setup_task_school_1), true, true), listOf(TYPE_SCHOOL, Task.TYPE_DAILY, getString(R.string.setup_task_school_2)), listOf(TYPE_SCHOOL, Task.TYPE_TODO, getString(R.string.setup_task_school_3)), - listOf(TYPE_TEAMS, Task.TYPE_HABIT, getString(R.string.setup_task_teams_1), true, false), listOf(TYPE_TEAMS, Task.TYPE_DAILY, getString(R.string.setup_task_teams_2)), listOf(TYPE_TEAMS, Task.TYPE_TODO, getString(R.string.setup_task_teams_3)), - listOf(TYPE_CHORES, Task.TYPE_HABIT, getString(R.string.setup_task_chores_1), true, false), listOf(TYPE_CHORES, Task.TYPE_DAILY, getString(R.string.setup_task_chores_2)), listOf(TYPE_CHORES, Task.TYPE_TODO, getString(R.string.setup_task_chores_3)), - listOf(TYPE_CREATIVITY, Task.TYPE_HABIT, getString(R.string.setup_task_creativity_1), true, false), listOf(TYPE_CREATIVITY, Task.TYPE_DAILY, getString(R.string.setup_task_creativity_2)), listOf(TYPE_CREATIVITY, Task.TYPE_TODO, getString(R.string.setup_task_creativity_3))) + this.tasks = listOf( + listOf(TYPE_WORK, Task.TYPE_HABIT, getString(R.string.setup_task_work_1), true, false), listOf(TYPE_WORK, Task.TYPE_DAILY, getString(R.string.setup_task_work_2)), listOf(TYPE_WORK, Task.TYPE_TODO, getString(R.string.setup_task_work_3)), + listOf(TYPE_EXERCISE, Task.TYPE_HABIT, getString(R.string.setup_task_exercise_1), true, false), listOf(TYPE_EXERCISE, Task.TYPE_DAILY, getString(R.string.setup_task_exercise_2)), listOf(TYPE_EXERCISE, Task.TYPE_TODO, getString(R.string.setup_task_exercise_3)), + listOf(TYPE_HEALTH, Task.TYPE_HABIT, getString(R.string.setup_task_healthWellness_1), true, true), listOf(TYPE_HEALTH, Task.TYPE_DAILY, getString(R.string.setup_task_healthWellness_2)), listOf(TYPE_HEALTH, Task.TYPE_TODO, getString(R.string.setup_task_healthWellness_3)), + listOf(TYPE_SCHOOL, Task.TYPE_HABIT, getString(R.string.setup_task_school_1), true, true), listOf(TYPE_SCHOOL, Task.TYPE_DAILY, getString(R.string.setup_task_school_2)), listOf(TYPE_SCHOOL, Task.TYPE_TODO, getString(R.string.setup_task_school_3)), + listOf(TYPE_TEAMS, Task.TYPE_HABIT, getString(R.string.setup_task_teams_1), true, false), listOf(TYPE_TEAMS, Task.TYPE_DAILY, getString(R.string.setup_task_teams_2)), listOf(TYPE_TEAMS, Task.TYPE_TODO, getString(R.string.setup_task_teams_3)), + listOf(TYPE_CHORES, Task.TYPE_HABIT, getString(R.string.setup_task_chores_1), true, false), listOf(TYPE_CHORES, Task.TYPE_DAILY, getString(R.string.setup_task_chores_2)), listOf(TYPE_CHORES, Task.TYPE_TODO, getString(R.string.setup_task_chores_3)), + listOf(TYPE_CREATIVITY, Task.TYPE_HABIT, getString(R.string.setup_task_creativity_1), true, false), listOf(TYPE_CREATIVITY, Task.TYPE_DAILY, getString(R.string.setup_task_creativity_2)), listOf(TYPE_CREATIVITY, Task.TYPE_TODO, getString(R.string.setup_task_creativity_3)) + ) } fun createSampleTasks(): List { @@ -153,5 +155,4 @@ class TaskSetupFragment : BaseFragment() { const val TYPE_CREATIVITY = "creativity" const val TYPE_OTHER = "other" } - } 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 aefed5c54..0b14dd2eb 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 @@ -46,9 +46,9 @@ class WelcomeFragment : BaseFragment() { BitmapDrawable(resources, HabiticaIconsHelper.imageOfAlertIcon()) } val username: String - get() = binding?.usernameEditText?.text?.toString() ?: "" + get() = binding?.usernameEditText?.text?.toString() ?: "" val displayName: String - get() = binding?.displayNameEditText?.text?.toString() ?: "" + get() = binding?.displayNameEditText?.text?.toString() ?: "" override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -57,14 +57,19 @@ class WelcomeFragment : BaseFragment() { super.onCreate(savedInstanceState) - binding?.displayNameEditText?.addTextChangedListener(OnChangeTextWatcher { p0, _, _, _ -> + binding?.displayNameEditText?.addTextChangedListener( + OnChangeTextWatcher { p0, _, _, _ -> displayNameVerificationEvents.onNext(p0.toString()) - }) - binding?.usernameEditText?.addTextChangedListener(OnChangeTextWatcher { p0, _, _, _ -> + } + ) + binding?.usernameEditText?.addTextChangedListener( + OnChangeTextWatcher { p0, _, _, _ -> usernameVerificationEvents.onNext(p0.toString()) - }) + } + ) - compositeSubscription.add(displayNameVerificationEvents.toFlowable(BackpressureStrategy.DROP) + compositeSubscription.add( + displayNameVerificationEvents.toFlowable(BackpressureStrategy.DROP) .map { it.length in 1..30 } .subscribeWithErrorHandler { if (it) { @@ -75,8 +80,10 @@ class WelcomeFragment : BaseFragment() { binding?.issuesTextView?.visibility = View.VISIBLE binding?.issuesTextView?.text = context?.getString(R.string.display_name_length_error) } - }) - compositeSubscription.add(usernameVerificationEvents.toFlowable(BackpressureStrategy.DROP) + } + ) + compositeSubscription.add( + usernameVerificationEvents.toFlowable(BackpressureStrategy.DROP) .filter { it.length in 1..30 } .throttleLast(1, TimeUnit.SECONDS) .flatMap { userRepository.verifyUsername(it) } @@ -90,14 +97,17 @@ class WelcomeFragment : BaseFragment() { binding?.issuesTextView?.text = it.issues.joinToString("\n") } nameValidEvents.onNext(it.isUsable) - }) + } + ) - compositeSubscription.add(userRepository.getUser().firstElement().subscribe { - binding?.displayNameEditText?.setText(it.profile?.name) - displayNameVerificationEvents.onNext(it.profile?.name ?: "") - binding?.usernameEditText?.setText(it.username) - usernameVerificationEvents.onNext(it.username ?: "") - }) + compositeSubscription.add( + userRepository.getUser().firstElement().subscribe { + binding?.displayNameEditText?.setText(it.profile?.name) + displayNameVerificationEvents.onNext(it.profile?.name ?: "") + binding?.usernameEditText?.setText(it.username) + usernameVerificationEvents.onNext(it.username ?: "") + } + ) } override fun injectFragment(component: UserComponent) { 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 75a5ddc5f..3256af704 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 @@ -52,9 +52,14 @@ class SkillTasksRecyclerViewFragment : BaseFragment binding?.recyclerView?.layoutManager = layoutManager adapter = SkillTasksRecyclerViewAdapter() - compositeSubscription.add(adapter.getTaskSelectionEvents().subscribe({ - taskSelectionEvents.onNext(it) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + adapter.getTaskSelectionEvents().subscribe( + { + taskSelectionEvents.onNext(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) binding?.recyclerView?.adapter = adapter } @@ -62,12 +67,17 @@ class SkillTasksRecyclerViewFragment : BaseFragment super.onResume() var tasks = taskRepository.getTasks(taskType ?: "") - .map { it.filter { it.challengeID == null && it.group == null } } + .map { it.filter { it.challengeID == null && it.group == null } } if (taskType == Task.TYPE_TODO) { tasks = tasks.map { it.filter { !it.completed } } } - compositeSubscription.add(tasks.subscribe({ - adapter.data = it - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + tasks.subscribe( + { + adapter.data = it + }, + RxErrorHandler.handleEmptyError() + ) + ) } } 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 fa8d39e13..1451d75c2 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 @@ -34,7 +34,6 @@ class SkillsFragment : BaseMainFragment() { internal var adapter: SkillsRecyclerViewAdapter? = null private var selectedSkill: Skill? = null - override var binding: FragmentSkillsBinding? = null override fun createBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSkillsBinding { @@ -77,18 +76,21 @@ class SkillsFragment : BaseMainFragment() { adapter?.level = this.user?.stats?.lvl ?: 0 adapter?.specialItems = this.user?.items?.special user?.let { user -> - Flowable.combineLatest(userRepository.getSkills(user), - userRepository.getSpecialItems(user), { skills, items -> - val allEntries = mutableListOf() - for (skill in skills) { - allEntries.add(skill) + Flowable.combineLatest( + userRepository.getSkills(user), + userRepository.getSpecialItems(user), + { skills, items -> + val allEntries = mutableListOf() + for (skill in skills) { + allEntries.add(skill) + } + for (item in items) { + allEntries.add(item) + } + return@combineLatest allEntries } - for (item in items) { - allEntries.add(item) - } - return@combineLatest allEntries - }) - .subscribe({ skills -> adapter?.setSkillList(skills) }, RxErrorHandler.handleEmptyError()) + ) + .subscribe({ skills -> adapter?.setSkillList(skills) }, RxErrorHandler.handleEmptyError()) } } @@ -116,22 +118,26 @@ class SkillsFragment : BaseMainFragment() { showSnackbar(activity.snackbarContainer, context?.getString(R.string.used_skill_without_mana, usedSkill.text), HabiticaSnackbar.SnackbarDisplayType.BLUE) } else { context?.let { - showSnackbar(activity.snackbarContainer, null, - context?.getString(R.string.used_skill_without_mana, usedSkill?.text), - BitmapDrawable(resources, HabiticaIconsHelper.imageOfMagic()), - ContextCompat.getColor(it, R.color.blue_10), "-" + usedSkill?.mana, - HabiticaSnackbar.SnackbarDisplayType.BLUE) + showSnackbar( + activity.snackbarContainer, null, + context?.getString(R.string.used_skill_without_mana, usedSkill?.text), + BitmapDrawable(resources, HabiticaIconsHelper.imageOfMagic()), + ContextCompat.getColor(it, R.color.blue_10), "-" + usedSkill?.mana, + HabiticaSnackbar.SnackbarDisplayType.BLUE + ) } } if (response.damage > 0) { lifecycleScope.launch { delay(2000L) if (!isAdded) return@launch - showSnackbar(activity.snackbarContainer, null, + showSnackbar( + activity.snackbarContainer, null, context?.getString(R.string.caused_damage), BitmapDrawable(resources, HabiticaIconsHelper.imageOfDamage()), ContextCompat.getColor(activity, R.color.green_10), "+%.01f".format(response.damage), - HabiticaSnackbar.SnackbarDisplayType.SUCCESS) + HabiticaSnackbar.SnackbarDisplayType.SUCCESS + ) } } compositeSubscription.add(userRepository.retrieveUser(false).subscribe({ }, RxErrorHandler.handleEmptyError())) @@ -158,7 +164,11 @@ class SkillsFragment : BaseMainFragment() { } else { userRepository.useSkill(skill.key, skill.target) } - compositeSubscription.add(observable.subscribe({ skillResponse -> this.displaySkillResult(skill, skillResponse) }, - RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + observable.subscribe( + { skillResponse -> this.displaySkillResult(skill, skillResponse) }, + RxErrorHandler.handleEmptyError() + ) + ) } } 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 6cfcc1e67..610056e76 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 @@ -25,8 +25,8 @@ import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import com.habitrpg.android.habitica.ui.viewmodels.GroupViewModel import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType -import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.Disposable import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -64,10 +64,15 @@ class ChatFragment : BaseFragment() { binding?.recyclerView?.layoutManager = layoutManager chatAdapter = ChatRecyclerViewAdapter(null, true) - chatAdapter?.let {adapter -> - compositeSubscription.add(adapter.getUserLabelClickFlowable().subscribe({ userId -> - FullProfileActivity.open(userId) - }, RxErrorHandler.handleEmptyError())) + chatAdapter?.let { adapter -> + compositeSubscription.add( + adapter.getUserLabelClickFlowable().subscribe( + { userId -> + FullProfileActivity.open(userId) + }, + RxErrorHandler.handleEmptyError() + ) + ) compositeSubscription.add(adapter.getDeleteMessageFlowable().subscribe({ this.showDeleteConfirmationDialog(it) }, RxErrorHandler.handleEmptyError())) compositeSubscription.add(adapter.getFlagMessageClickFlowable().subscribe({ this.showFlagConfirmationDialog(it) }, RxErrorHandler.handleEmptyError())) compositeSubscription.add(adapter.getReplyMessageEvents().subscribe({ setReplyTo(it) }, RxErrorHandler.handleEmptyError())) @@ -92,15 +97,17 @@ class ChatFragment : BaseFragment() { viewModel?.getChatMessages()?.subscribe({ this.setChatMessages(it) }, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) } - - binding?.chatBarView?.onCommunityGuidelinesAccepted = { + binding?.chatBarView?.onCommunityGuidelinesAccepted = { viewModel?.updateUser("flags.communityGuidelinesAccepted", true) } - viewModel?.getUserData()?.observe(viewLifecycleOwner, { - chatAdapter?.user = it - binding?.chatBarView?.hasAcceptedGuidelines = it?.flags?.communityGuidelinesAccepted == true - }) + viewModel?.getUserData()?.observe( + viewLifecycleOwner, + { + chatAdapter?.user = it + binding?.chatBarView?.hasAcceptedGuidelines = it?.flags?.communityGuidelinesAccepted == true + } + ) } override fun onDestroyView() { @@ -123,10 +130,13 @@ class ChatFragment : BaseFragment() { refreshDisposable?.dispose() } refreshDisposable = Observable.interval(30, TimeUnit.SECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - refresh() - }, RxErrorHandler.handleEmptyError()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + refresh() + }, + RxErrorHandler.handleEmptyError() + ) refresh() } @@ -184,11 +194,11 @@ class ChatFragment : BaseFragment() { val context = context if (context != null) { AlertDialog.Builder(context) - .setTitle(R.string.confirm_delete_tag_title) - .setMessage(R.string.confirm_delete_tag_message) - .setIcon(android.R.drawable.ic_dialog_alert) - .setPositiveButton(R.string.yes) { _, _ -> viewModel?.deleteMessage(chatMessage) } - .setNegativeButton(R.string.no, null).show() + .setTitle(R.string.confirm_delete_tag_title) + .setMessage(R.string.confirm_delete_tag_message) + .setIcon(android.R.drawable.ic_dialog_alert) + .setPositiveButton(R.string.yes) { _, _ -> viewModel?.deleteMessage(chatMessage) } + .setNegativeButton(R.string.no, null).show() } } @@ -202,9 +212,12 @@ class ChatFragment : BaseFragment() { } private fun sendChatMessage(chatText: String) { - viewModel?.postGroupChat(chatText, { - binding?.recyclerView?.scrollToPosition(0) - }) { + viewModel?.postGroupChat( + chatText, + { + 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 b924ad9b6..1520373f5 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 @@ -6,10 +6,7 @@ import android.content.Context import android.os.Bundle import android.view.* import androidx.appcompat.app.AlertDialog -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import androidx.paging.DataSource -import androidx.paging.PagedList import com.habitrpg.android.habitica.MainNavDirections import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent @@ -34,9 +31,6 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.Disposable -import io.reactivex.rxjava3.functions.Action -import io.reactivex.rxjava3.functions.Consumer -import java.lang.Exception import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -60,8 +54,11 @@ class InboxMessageListFragment : BaseMainFragment - setReceivingUser(member.username, member.id) - activity?.title = member.displayName - chatAdapter = InboxAdapter(user, member) - viewModel?.messages?.observe(this.viewLifecycleOwner, { chatAdapter?.submitList(it) }) + compositeSubscription.add( + observable.subscribe( + { member -> + setReceivingUser(member.username, member.id) + activity?.title = member.displayName + chatAdapter = InboxAdapter(user, member) + viewModel?.messages?.observe(this.viewLifecycleOwner, { chatAdapter?.submitList(it) }) - binding?.recyclerView?.adapter = chatAdapter - binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() - chatAdapter?.let { adapter -> - compositeSubscription.add(adapter.getUserLabelClickFlowable().subscribe({ - FullProfileActivity.open(it) - }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getDeleteMessageFlowable().subscribe({ this.showDeleteConfirmationDialog(it) }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getFlagMessageClickFlowable().subscribe({ this.showFlagConfirmationDialog(it) }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getCopyMessageFlowable().subscribe({ this.copyMessageToClipboard(it) }, RxErrorHandler.handleEmptyError())) - } - }, RxErrorHandler.handleEmptyError())) + binding?.recyclerView?.adapter = chatAdapter + binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() + chatAdapter?.let { adapter -> + compositeSubscription.add( + adapter.getUserLabelClickFlowable().subscribe( + { + FullProfileActivity.open(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) + compositeSubscription.add(adapter.getDeleteMessageFlowable().subscribe({ this.showDeleteConfirmationDialog(it) }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(adapter.getFlagMessageClickFlowable().subscribe({ this.showFlagConfirmationDialog(it) }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(adapter.getCopyMessageFlowable().subscribe({ this.copyMessageToClipboard(it) }, RxErrorHandler.handleEmptyError())) + } + }, + RxErrorHandler.handleEmptyError() + ) + ) binding?.chatBarView?.sendAction = { sendMessage(it) } binding?.chatBarView?.maxChatLength = configManager.maxChatLength() @@ -124,7 +131,6 @@ class InboxMessageListFragment : BaseMainFragment + viewModel?.memberID?.let { userID -> socialRepository.postPrivateMessage(userID, chatText) - .delay(200, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ + .delay(200, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { binding?.recyclerView?.scrollToPosition(0) viewModel?.invalidateDataSource() - }, { error -> + }, + { error -> RxErrorHandler.reportError(error) if (binding != null) { val alert = HabiticaAlertDialog(binding!!.chatBarView.context) @@ -205,7 +220,8 @@ class InboxMessageListFragment : BaseMainFragment socialRepository.deleteMessage(chatMessage).subscribe({ }, RxErrorHandler.handleEmptyError()) } - .setNegativeButton(R.string.no, null).show() + .setTitle(R.string.confirm_delete_tag_title) + .setMessage(R.string.confirm_delete_tag_message) + .setIcon(android.R.drawable.ic_dialog_alert) + .setPositiveButton(R.string.yes) { _, _ -> socialRepository.deleteMessage(chatMessage).subscribe({ }, RxErrorHandler.handleEmptyError()) } + .setNegativeButton(R.string.no, null).show() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxOverviewFragment.kt index b629a34b3..d42ca5996 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxOverviewFragment.kt @@ -50,18 +50,25 @@ class InboxOverviewFragment : BaseMainFragment(), androidx binding?.inboxRefreshLayout?.setOnRefreshListener(this) - compositeSubscription.add(userRepository.getUser().map { it.inbox?.optOut ?: false }.distinctUntilChanged().subscribe { - binding?.optOutView?.visibility = if (it) View.VISIBLE else View.GONE - }) + compositeSubscription.add( + userRepository.getUser().map { it.inbox?.optOut ?: false }.distinctUntilChanged().subscribe { + binding?.optOutView?.visibility = if (it) View.VISIBLE else View.GONE + } + ) loadMessages() retrieveMessages() } private fun loadMessages() { - compositeSubscription.add(socialRepository.getInboxConversations().subscribe({ - setInboxMessages(it) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + socialRepository.getInboxConversations().subscribe( + { + setInboxMessages(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) } override fun onDestroy() { @@ -95,23 +102,26 @@ class InboxOverviewFragment : BaseMainFragment(), androidx val alert = HabiticaAlertDialog(thisActivity) alert.setTitle(getString(R.string.choose_recipient_title)) alert.addButton( - getString(R.string.action_continue), - true, - isDestructive = false, - autoDismiss = false + getString(R.string.action_continue), + true, + isDestructive = false, + autoDismiss = false ) { _, _ -> binding.errorTextView.visibility = View.GONE binding.progressCircular.visibility = View.VISIBLE val username = binding.uuidEditText.text?.toString() ?: "" socialRepository.getMemberWithUsername(username) - .subscribe({ + .subscribe( + { alert.dismiss() openInboxMessages("", username) binding.progressCircular.visibility = View.GONE - }, { + }, + { binding.errorTextView.visibility = View.VISIBLE binding.progressCircular.visibility = View.GONE - }) + } + ) } alert.addButton(getString(R.string.action_cancel), false) { _, _ -> thisActivity.dismissKeyboard() @@ -120,19 +130,22 @@ class InboxOverviewFragment : BaseMainFragment(), androidx binding.uuidEditText.requestFocus() alert.show() } - } override fun injectFragment(component: UserComponent) { component.inject(this) } - private fun retrieveMessages() { - compositeSubscription.add(this.socialRepository.retrieveInboxConversations() - .subscribe({ - binding?.inboxRefreshLayout?.isRefreshing = false - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + this.socialRepository.retrieveInboxConversations() + .subscribe( + { + binding?.inboxRefreshLayout?.isRefreshing = false + }, + RxErrorHandler.handleEmptyError() + ) + ) } override fun onRefresh() { @@ -186,5 +199,4 @@ class InboxOverviewFragment : BaseMainFragment(), androidx private fun openInboxMessages(userID: String, username: String) { MainNavigationController.navigate(InboxOverviewFragmentDirections.openInboxDetail(userID, username)) } - } 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 e9f7f7c1c..1768723bf 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 @@ -9,7 +9,6 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.core.content.ContextCompat -import androidx.core.text.parseAsHtml import androidx.core.text.toHtml import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent @@ -27,7 +26,6 @@ import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.MarkdownParser -import com.habitrpg.android.habitica.ui.helpers.setMarkdown import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import javax.inject.Inject import javax.inject.Named @@ -54,13 +52,11 @@ class QuestDetailFragment : BaseMainFragment() { private val isQuestActive: Boolean get() = quest?.active == true - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { showsBackButton = true super.onViewCreated(view, savedInstanceState) @@ -70,25 +66,28 @@ class QuestDetailFragment : BaseMainFragment() { binding?.questLeaveButton?.setOnClickListener { onQuestLeave() } compositeSubscription.add( - userRepository.getUser() - .map { - it.party?.id ?: "" - } - .skipWhile { it.isBlank() } - .distinctUntilChanged() - .flatMap { socialRepository.getGroup(it) } - .doOnNext { updateParty(it) } - .map { - it.quest?.key ?: "" - } - .skipWhile { - it.isBlank() - } - .distinctUntilChanged() - .flatMap { inventoryRepository.getQuestContent(it) } - .subscribe({ - updateQuestContent(it) - }, RxErrorHandler.handleEmptyError()) + userRepository.getUser() + .map { + it.party?.id ?: "" + } + .skipWhile { it.isBlank() } + .distinctUntilChanged() + .flatMap { socialRepository.getGroup(it) } + .doOnNext { updateParty(it) } + .map { + it.quest?.key ?: "" + } + .skipWhile { + it.isBlank() + } + .distinctUntilChanged() + .flatMap { inventoryRepository.getQuestContent(it) } + .subscribe( + { + updateQuestContent(it) + }, + RxErrorHandler.handleEmptyError() + ) ) } @@ -99,11 +98,16 @@ class QuestDetailFragment : BaseMainFragment() { party = group quest = group.quest setQuestParticipants(group.quest?.participants) - compositeSubscription.add(socialRepository.getMember(quest?.leader).subscribe({ member -> - if (context != null && binding?.questLeaderView != null && member != null) { - binding?.questLeaderView?.text = context?.getString(R.string.quest_leader_header, member.displayName) - } - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + socialRepository.getMember(quest?.leader).subscribe( + { member -> + if (context != null && binding?.questLeaderView != null && member != null) { + binding?.questLeaderView?.text = context?.getString(R.string.quest_leader_header, member.displayName) + } + }, + RxErrorHandler.handleEmptyError() + ) + ) if (binding?.questResponseWrapper != null) { if (userId != party?.quest?.leader && user?.party?.quest?.key == group.quest?.key && user?.party?.quest?.RSVPNeeded == false) { @@ -211,7 +215,7 @@ class QuestDetailFragment : BaseMainFragment() { val party = party if (party != null) { socialRepository.forceStartQuest(party) - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .subscribe({ }, RxErrorHandler.handleEmptyError()) } } alert.addButton(R.string.no, false) @@ -224,15 +228,15 @@ class QuestDetailFragment : BaseMainFragment() { context?.let { if (isQuestActive) { val builder = AlertDialog.Builder(getActivity()) - .setMessage(R.string.quest_abort_message) - .setPositiveButton(R.string.yes) { _, _ -> - party?.id?.let { partyID -> - @Suppress("DEPRECATION") - socialRepository.abortQuest(partyID) - .flatMap { userRepository.retrieveUser() } - .subscribe({ getActivity()?.supportFragmentManager?.popBackStack() }, RxErrorHandler.handleEmptyError()) - } - }.setNegativeButton(R.string.no) { _, _ -> } + .setMessage(R.string.quest_abort_message) + .setPositiveButton(R.string.yes) { _, _ -> + party?.id?.let { partyID -> + @Suppress("DEPRECATION") + socialRepository.abortQuest(partyID) + .flatMap { userRepository.retrieveUser() } + .subscribe({ getActivity()?.supportFragmentManager?.popBackStack() }, RxErrorHandler.handleEmptyError()) + } + }.setNegativeButton(R.string.no) { _, _ -> } builder.show() } else { val alert = HabiticaAlertDialog(it) @@ -241,8 +245,8 @@ class QuestDetailFragment : BaseMainFragment() { party?.id?.let { partyID -> @Suppress("DEPRECATION") socialRepository.cancelQuest(partyID) - .flatMap { userRepository.retrieveUser() } - .subscribe({ getActivity()?.supportFragmentManager?.popBackStack() }, RxErrorHandler.handleEmptyError()) + .flatMap { userRepository.retrieveUser() } + .subscribe({ getActivity()?.supportFragmentManager?.popBackStack() }, RxErrorHandler.handleEmptyError()) } } alert.addButton(R.string.no, false) @@ -254,16 +258,16 @@ class QuestDetailFragment : BaseMainFragment() { private fun onQuestLeave() { HapticFeedbackManager.tap(requireView()) val builder = AlertDialog.Builder(getActivity()) - .setMessage(if (quest?.active == true) R.string.quest_leave_message else R.string.quest_leave_message_nostart) - .setPositiveButton(R.string.yes) { _, _ -> - party?.id?.let { partyID -> - @Suppress("DEPRECATION") - socialRepository.leaveQuest(partyID) - .flatMap { userRepository.retrieveUser() } - .flatMap { socialRepository.retrieveGroup(partyID) } - .subscribe({ getActivity()?.supportFragmentManager?.popBackStack() }, RxErrorHandler.handleEmptyError()) - } - }.setNegativeButton(R.string.no) { _, _ -> } + .setMessage(if (quest?.active == true) R.string.quest_leave_message else R.string.quest_leave_message_nostart) + .setPositiveButton(R.string.yes) { _, _ -> + party?.id?.let { partyID -> + @Suppress("DEPRECATION") + socialRepository.leaveQuest(partyID) + .flatMap { userRepository.retrieveUser() } + .flatMap { socialRepository.retrieveGroup(partyID) } + .subscribe({ getActivity()?.supportFragmentManager?.popBackStack() }, RxErrorHandler.handleEmptyError()) + } + }.setNegativeButton(R.string.no) { _, _ -> } builder.show() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt index 321e2603e..9154c727b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt @@ -60,10 +60,15 @@ class TavernDetailFragment : BaseFragment() { shopSpriteSuffix = configManager.shopSpriteSuffix() - compositeSubscription.add(userRepository.getUser(userId).subscribe({ - this.user = it - this.updatePausedState() - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getUser(userId).subscribe( + { + this.user = it + this.updatePausedState() + }, + RxErrorHandler.handleEmptyError() + ) + ) binding?.shopHeader?.descriptionView?.setText(R.string.tavern_description) binding?.shopHeader?.namePlate?.setText(R.string.tavern_owner) @@ -74,8 +79,9 @@ class TavernDetailFragment : BaseFragment() { addPlayerTiers() bindButtons() - compositeSubscription.add(socialRepository.getGroup(Group.TAVERN_ID) - .doOnNext { if (!it.hasActiveQuest) binding?.worldBossSection?.visibility = View.GONE } + compositeSubscription.add( + socialRepository.getGroup(Group.TAVERN_ID) + .doOnNext { if (!it.hasActiveQuest) binding?.worldBossSection?.visibility = View.GONE } .filter { it.hasActiveQuest } .doOnNext { binding?.questProgressView?.progress = it.quest @@ -89,10 +95,14 @@ class TavernDetailFragment : BaseFragment() { } } .flatMapMaybe { inventoryRepository.getQuestContent(it.quest?.key ?: "").firstElement() } - .subscribe({ - binding?.questProgressView?.quest = it - binding?.worldBossSection?.visibility = View.VISIBLE - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + binding?.questProgressView?.quest = it + binding?.worldBossSection?.visibility = View.VISIBLE + }, + RxErrorHandler.handleEmptyError() + ) + ) compositeSubscription.add(socialRepository.retrieveGroup(Group.TAVERN_ID).subscribe({ }, RxErrorHandler.handleEmptyError())) @@ -129,7 +139,6 @@ class TavernDetailFragment : BaseFragment() { } } - private fun updatePausedState() { if (binding?.innButton == null) { return @@ -150,9 +159,10 @@ class TavernDetailFragment : BaseFragment() { label.tier = tier.id label.username = tier.title val params = FrameLayout.LayoutParams( - FrameLayout.LayoutParams.WRAP_CONTENT, - FrameLayout.LayoutParams.WRAP_CONTENT, - Gravity.CENTER) + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT, + Gravity.CENTER + ) container.addView(label, params) binding?.playerTiersView?.addView(container) val padding = context?.resources?.getDimension(R.dimen.spacing_medium)?.toInt() ?: 0 @@ -172,7 +182,7 @@ class TavernDetailFragment : BaseFragment() { val alert = HabiticaAlertDialog(context) val bossName = quest.boss?.name ?: "" alert.setTitle(R.string.world_boss_description_title) - //alert.setSubtitle(context.getString(R.string.world_boss_description_subtitle, bossName)) + // alert.setSubtitle(context.getString(R.string.world_boss_description_subtitle, bossName)) alert.setAdditionalContentView(R.layout.world_boss_description_view) val descriptionView = alert.getContentView() @@ -186,6 +196,7 @@ class TavernDetailFragment : BaseFragment() { alert.setButton(AlertDialog.BUTTON_POSITIVE, context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } - alert.show() } + alert.show() + } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt index aaf437245..815e81bb2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt @@ -32,8 +32,11 @@ class TavernFragment : BaseMainFragment() { internal var tavernDetailFragment = TavernDetailFragment() private var chatFragment: ChatFragment? = null - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { this.usesTabLayout = true this.hidesToolbar = true this.tutorialStepIdentifier = "tavern" @@ -71,7 +74,7 @@ class TavernFragment : BaseMainFragment() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.menu_guild_refresh -> { - viewModel.retrieveGroup { } + viewModel.retrieveGroup { } return true } } @@ -114,5 +117,4 @@ class TavernFragment : BaseMainFragment() { } } } - } 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 273b21e14..1b2f7e32d 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 @@ -2,16 +2,9 @@ package com.habitrpg.android.habitica.ui.fragments.social.challenges import android.content.Intent import android.content.pm.PackageManager -import android.graphics.Color -import android.graphics.PorterDuff -import android.graphics.PorterDuffColorFilter import android.os.Bundle import android.text.method.LinkMovementMethod import android.view.* -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import androidx.core.content.ContextCompat import androidx.core.net.toUri import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent @@ -23,7 +16,6 @@ import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.extensions.inflate import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.members.Member -import com.habitrpg.android.habitica.models.responses.TaskDirection import com.habitrpg.android.habitica.models.social.Challenge import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.ui.activities.ChallengeFormActivity @@ -40,8 +32,7 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import java.util.* import javax.inject.Inject - -class ChallengeDetailFragment: BaseMainFragment() { +class ChallengeDetailFragment : BaseMainFragment() { @Inject lateinit var challengeRepository: ChallengeRepository @@ -87,7 +78,8 @@ class ChallengeDetailFragment: BaseMainFragment( } challengeID?.let { id -> - compositeSubscription.add(challengeRepository.getChallenge(id) + compositeSubscription.add( + challengeRepository.getChallenge(id) .doOnNext { set(it) } @@ -98,49 +90,64 @@ class ChallengeDetailFragment: BaseMainFragment( .flatMap { creatorID -> return@flatMap socialRepository.getMember(creatorID) } - .subscribe({ set(it) }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(challengeRepository.getChallengeTasks(id).subscribe({ taskList -> - binding?.taskGroupLayout?.removeAllViewsInLayout() + .subscribe({ set(it) }, RxErrorHandler.handleEmptyError()) + ) + compositeSubscription.add( + challengeRepository.getChallengeTasks(id).subscribe( + { taskList -> + binding?.taskGroupLayout?.removeAllViewsInLayout() - val todos = ArrayList() - val habits = ArrayList() - val dailies = ArrayList() - val rewards = ArrayList() + val todos = ArrayList() + val habits = ArrayList() + val dailies = ArrayList() + val rewards = ArrayList() - for (entry in taskList) { - when (entry.type) { - Task.TYPE_TODO -> todos.add(entry) - Task.TYPE_HABIT -> habits.add(entry) - Task.TYPE_DAILY -> dailies.add(entry) - Task.TYPE_REWARD -> rewards.add(entry) - } - } + for (entry in taskList) { + when (entry.type) { + Task.TYPE_TODO -> todos.add(entry) + Task.TYPE_HABIT -> habits.add(entry) + Task.TYPE_DAILY -> dailies.add(entry) + Task.TYPE_REWARD -> rewards.add(entry) + } + } - if (habits.size > 0) { - addHabits(habits) - } + if (habits.size > 0) { + addHabits(habits) + } - if (dailies.size > 0) { - addDailys(dailies) - } + if (dailies.size > 0) { + addDailys(dailies) + } - if (todos.size > 0) { - addTodos(todos) - } + if (todos.size > 0) { + addTodos(todos) + } - if (rewards.size > 0) { - addRewards(rewards) - } - }, RxErrorHandler.handleEmptyError())) + if (rewards.size > 0) { + addRewards(rewards) + } + }, + RxErrorHandler.handleEmptyError() + ) + ) - compositeSubscription.add(challengeRepository.isChallengeMember(id).subscribe({ isMember -> - setJoined(isMember) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + challengeRepository.isChallengeMember(id).subscribe( + { isMember -> + setJoined(isMember) + }, + RxErrorHandler.handleEmptyError() + ) + ) } - binding?.joinButton?.setOnClickListener { challenge?.let { challenge -> challengeRepository.joinChallenge(challenge) - .flatMap { userRepository.retrieveUser(true) } - .subscribe({}, RxErrorHandler.handleEmptyError()) } } + binding?.joinButton?.setOnClickListener { + challenge?.let { challenge -> + challengeRepository.joinChallenge(challenge) + .flatMap { userRepository.retrieveUser(true) } + .subscribe({}, RxErrorHandler.handleEmptyError()) + } + } binding?.leaveButton?.setOnClickListener { showChallengeLeaveDialog() } refresh() @@ -186,7 +193,7 @@ class ChallengeDetailFragment: BaseMainFragment( dialog.setTitle(R.string.action_end_challenge) dialog.setMessage(R.string.end_challenge_description) dialog.addButton(R.string.open_website, true, false) { _, _ -> - val uriUrl = "https://habitica.com/challenges/${challengeID}".toUri() + val uriUrl = "https://habitica.com/challenges/$challengeID".toUri() val launchBrowser = Intent(Intent.ACTION_VIEW, uriUrl) val l = context.packageManager.queryIntentActivities(launchBrowser, PackageManager.MATCH_DEFAULT_ONLY) val notHabitica = l.firstOrNull { !it.activityInfo.processName.contains("habitica") } @@ -202,8 +209,8 @@ class ChallengeDetailFragment: BaseMainFragment( private fun refresh() { challengeID?.let { id -> challengeRepository.retrieveChallenge(id) - .flatMap { challengeRepository.retrieveChallengeTasks(id) } - .subscribe({ }, RxErrorHandler.handleEmptyError(), { }) + .flatMap { challengeRepository.retrieveChallengeTasks(id) } + .subscribe({ }, RxErrorHandler.handleEmptyError(), { }) } } 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 dc60425f3..9b87faee0 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 @@ -24,11 +24,14 @@ internal class ChallengeFilterDialogHolder private constructor(view: View, priva binding.challengeFilterButtonNone.setOnClickListener { noneClicked() } } - fun bind(builder: AlertDialog.Builder, filterGroups: List, - currentFilter: ChallengeFilterOptions?, - selectedGroupsCallback: Action1) { + fun bind( + builder: AlertDialog.Builder, + filterGroups: List, + currentFilter: ChallengeFilterOptions?, + selectedGroupsCallback: Action1 + ) { builder.setPositiveButton(context.getString(R.string.done)) { _, _ -> doneClicked() } - .show() + .show() this.filterGroups = filterGroups this.currentFilter = currentFilter this.selectedGroupsCallback = selectedGroupsCallback @@ -70,20 +73,21 @@ internal class ChallengeFilterDialogHolder private constructor(view: View, priva companion object { - fun showDialog(activity: Activity, filterGroups: List, - currentFilter: ChallengeFilterOptions?, - selectedGroupsCallback: Action1) { + fun showDialog( + activity: Activity, + filterGroups: List, + currentFilter: ChallengeFilterOptions?, + selectedGroupsCallback: Action1 + ) { val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_challenge_filter, null) val challengeFilterDialogHolder = ChallengeFilterDialogHolder(dialogLayout, activity) val builder = AlertDialog.Builder(activity) - .setTitle(R.string.filter) - .setView(dialogLayout) + .setTitle(R.string.filter) + .setView(dialogLayout) challengeFilterDialogHolder.bind(builder, filterGroups, currentFilter, selectedGroupsCallback) } } - } - 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 fa3914230..8b366e258 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 @@ -26,7 +26,6 @@ import io.reactivex.rxjava3.kotlin.Flowables import javax.inject.Inject import javax.inject.Named - class ChallengeListFragment : BaseFragment(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { @Inject @@ -69,7 +68,7 @@ class ChallengeListFragment : BaseFragment() challengeAdapter = ChallengesListViewAdapter(viewUserChallengesOnly, userId) challengeAdapter?.getOpenDetailFragmentFlowable()?.subscribe({ openDetailFragment(it) }, RxErrorHandler.handleEmptyError()) - ?.let { compositeSubscription.add(it) } + ?.let { compositeSubscription.add(it) } binding?.refreshLayout?.setOnRefreshListener(this) @@ -85,11 +84,16 @@ class ChallengeListFragment : BaseFragment() binding?.recyclerView?.setBackgroundResource(R.color.content_background) } - compositeSubscription.add(Flowables.combineLatest(socialRepository.getGroup(Group.TAVERN_ID), socialRepository.getUserGroups("guild")).subscribe({ - this.filterGroups = mutableListOf() - filterGroups?.add(it.first) - filterGroups?.addAll(it.second) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + Flowables.combineLatest(socialRepository.getGroup(Group.TAVERN_ID), socialRepository.getUserGroups("guild")).subscribe( + { + this.filterGroups = mutableListOf() + filterGroups?.add(it.first) + filterGroups?.addAll(it.second) + }, + RxErrorHandler.handleEmptyError() + ) + ) binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() @@ -132,13 +136,18 @@ class ChallengeListFragment : BaseFragment() challengeRepository.getChallenges() } - compositeSubscription.add(observable.subscribe({ challenges -> - if (challenges.size == 0) { - retrieveChallengesPage() - } - this.challenges = challenges - challengeAdapter?.updateUnfilteredData(challenges) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + observable.subscribe( + { challenges -> + if (challenges.size == 0) { + retrieveChallengesPage() + } + this.challenges = challenges + challengeAdapter?.updateUnfilteredData(challenges) + }, + RxErrorHandler.handleEmptyError() + ) + ) } internal fun retrieveChallengesPage(forced: Boolean = false) { @@ -146,25 +155,33 @@ class ChallengeListFragment : BaseFragment() return } setRefreshing(true) - compositeSubscription.add(challengeRepository.retrieveChallenges(nextPageToLoad, viewUserChallengesOnly).doOnComplete { - setRefreshing(false) - } .subscribe({ - if (it.size < 10) { - loadedAllData = true - } - nextPageToLoad += 1 - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + challengeRepository.retrieveChallenges(nextPageToLoad, viewUserChallengesOnly).doOnComplete { + setRefreshing(false) + }.subscribe( + { + if (it.size < 10) { + loadedAllData = true + } + nextPageToLoad += 1 + }, + RxErrorHandler.handleEmptyError() + ) + ) } internal fun showFilterDialog() { activity?.let { - ChallengeFilterDialogHolder.showDialog(it, - filterGroups ?: emptyList(), - filterOptions, object : Action1 { - override fun call(t: ChallengeFilterOptions) { - changeFilter(t) + ChallengeFilterDialogHolder.showDialog( + it, + filterGroups ?: emptyList(), + filterOptions, + object : Action1 { + override fun call(t: ChallengeFilterOptions) { + changeFilter(t) + } } - }) + ) } } 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 8b69a4a8d..2e7862706 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 @@ -7,7 +7,6 @@ import android.widget.RelativeLayout import android.widget.TextView import androidx.core.view.MenuItemCompat import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentStatePagerAdapter import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayoutMediator import com.habitrpg.android.habitica.R @@ -33,8 +32,11 @@ class ChallengesOverviewFragment : BaseMainFragment() private var userChallengesFragment: ChallengeListFragment? = ChallengeListFragment() private var availableChallengesFragment: ChallengeListFragment? = ChallengeListFragment() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { this.usesTabLayout = true this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -63,7 +65,6 @@ class ChallengesOverviewFragment : BaseMainFragment() component.inject(this) } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { 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 c4f0ee518..5d2de4c30 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 @@ -21,7 +21,6 @@ import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.social.Challenge import com.habitrpg.android.habitica.models.social.Group import com.habitrpg.android.habitica.modules.AppModule -import com.habitrpg.android.habitica.ui.activities.GroupFormActivity import com.habitrpg.android.habitica.ui.activities.GroupInviteActivity import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.fragments.BaseFragment @@ -32,7 +31,6 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.* @@ -88,7 +86,7 @@ class GuildDetailFragment : BaseFragment() { sendInvitesResult.launch(intent) } binding?.leaderWrapper?.setOnClickListener { - viewModel?.getGroupData()?.value?.leaderID?.let {leaderID -> + viewModel?.getGroupData()?.value?.leaderID?.let { leaderID -> val profileDirections = MainNavDirections.openProfileActivity(leaderID) MainNavigationController.navigate(profileDirections) } 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 ca8b8d329..44c08b6ed 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 @@ -33,8 +33,11 @@ class GuildFragment : BaseMainFragment() { return FragmentViewpagerBinding.inflate(inflater, container, false) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { this.usesTabLayout = true this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -65,7 +68,7 @@ class GuildFragment : BaseMainFragment() { context?.let { FirebaseAnalytics.getInstance(it).logEvent("opened_no_party_guild", null) } } - viewModel.retrieveGroup { } + viewModel.retrieveGroup { } } override fun onResume() { @@ -127,7 +130,7 @@ class GuildFragment : BaseMainFragment() { return true } R.id.menu_guild_refresh -> { - viewModel.retrieveGroup { } + viewModel.retrieveGroup { } return true } } @@ -181,8 +184,8 @@ class GuildFragment : BaseMainFragment() { binding?.viewPager?.let { it1 -> TabLayoutMediator(it, it1) { tab, position -> tab.text = when (position) { - 0 -> context?.getString(R.string.guild) - 1 -> context?.getString(R.string.chat) + 0 -> context?.getString(R.string.guild) + 1 -> context?.getString(R.string.chat) else -> "" } }.attach() @@ -200,14 +203,12 @@ class GuildFragment : BaseMainFragment() { bundle.putString("leader", guild?.leaderID) bundle.putBoolean("leaderOnlyChallenges", guild?.leaderOnlyChallenges ?: true) - val intent = Intent(activity, GroupFormActivity::class.java) intent.putExtras(bundle) intent.flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT groupFormResult.launch(intent) } - private val groupFormResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == Activity.RESULT_OK) { val bundle = it?.data?.extras @@ -224,5 +225,4 @@ class GuildFragment : BaseMainFragment() { chatFragment?.autocompleteContext = "privateGuild" } } - } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildListFragment.kt index 172761165..0327db707 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildListFragment.kt @@ -41,8 +41,10 @@ class GuildListFragment : BaseFragment(), Se viewAdapter.socialRepository = socialRepository binding?.recyclerView?.adapter = viewAdapter binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() - binding?.recyclerView?.emptyItem = EmptyItem(getString(R.string.empty_guilds_list), - getString(R.string.empty_discover_description)) + binding?.recyclerView?.emptyItem = EmptyItem( + getString(R.string.empty_guilds_list), + getString(R.string.empty_discover_description) + ) binding?.refreshLayout?.setOnRefreshListener(this) @@ -50,10 +52,15 @@ class GuildListFragment : BaseFragment(), Se if (onlyShowUsersGuilds) { compositeSubscription.add(socialRepository.getUserGroups("guild").subscribe({ viewAdapter.setUnfilteredData(it) }, RxErrorHandler.handleEmptyError())) } else { - compositeSubscription.add(this.socialRepository.getPublicGuilds() - .subscribe({ groups -> - this@GuildListFragment.viewAdapter.setUnfilteredData(groups) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + this.socialRepository.getPublicGuilds() + .subscribe( + { groups -> + this@GuildListFragment.viewAdapter.setUnfilteredData(groups) + }, + RxErrorHandler.handleEmptyError() + ) + ) } this.fetchGuilds() } @@ -64,10 +71,15 @@ class GuildListFragment : BaseFragment(), Se } internal fun fetchGuilds() { - compositeSubscription.add(this.socialRepository.retrieveGroups(if (onlyShowUsersGuilds) "guilds" else "publicGuilds") - .subscribe({ - binding?.refreshLayout?.isRefreshing = false - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + this.socialRepository.retrieveGroups(if (onlyShowUsersGuilds) "guilds" else "publicGuilds") + .subscribe( + { + binding?.refreshLayout?.isRefreshing = false + }, + RxErrorHandler.handleEmptyError() + ) + ) } override fun onQueryTextSubmit(s: String?): Boolean { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildOverviewFragment.kt index d0f25aeb8..30b6c980d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildOverviewFragment.kt @@ -34,8 +34,11 @@ class GuildOverviewFragment : BaseMainFragment(), Sear private var userGuildsFragment: GuildListFragment? = GuildListFragment() private var publicGuildsFragment: GuildListFragment? = GuildListFragment() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { this.usesTabLayout = true this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -80,7 +83,6 @@ class GuildOverviewFragment : BaseMainFragment(), Sear return super.onOptionsItemSelected(item) } - private fun showCreationDialog() { val context = context ?: return val dialog = HabiticaAlertDialog(context) @@ -148,4 +150,4 @@ class GuildOverviewFragment : BaseMainFragment(), Sear override fun onQueryTextChange(newText: String?): Boolean { return getActiveFragment()?.onQueryTextChange(newText) ?: false } -} \ No newline at end of file +} 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 73dbe0ded..d0965f600 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 @@ -31,12 +31,9 @@ import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.setMarkdown import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import javax.inject.Inject import kotlin.math.roundToInt - class NoPartyFragmentFragment : BaseMainFragment() { @Inject @@ -62,12 +59,17 @@ class NoPartyFragmentFragment : BaseMainFragment() { binding?.invitationsView?.acceptCall = { socialRepository.joinGroup(it) - .flatMap { userRepository.retrieveUser(false) } - .subscribe({ + .flatMap { userRepository.retrieveUser(false) } + .subscribe( + { parentFragmentManager.popBackStack() - MainNavigationController.navigate(R.id.partyFragment, - bundleOf(Pair("partyID", user?.party?.id))) - }, RxErrorHandler.handleEmptyError()) + MainNavigationController.navigate( + R.id.partyFragment, + bundleOf(Pair("partyID", user?.party?.id)) + ) + }, + RxErrorHandler.handleEmptyError() + ) } binding?.invitationsView?.rejectCall = { @@ -77,11 +79,14 @@ class NoPartyFragmentFragment : BaseMainFragment() { binding?.invitationsView?.setLeader = { leader -> compositeSubscription.add( - socialRepository.getMember(leader) - .subscribe({ - binding?.root?.findViewById(R.id.groupleader_avatar_view)?.setAvatar(it) - binding?.root?.findViewById(R.id.groupleader_text_view)?.text = getString(R.string.invitation_title,it.displayName, binding?.invitationsView?.groupName) - }, RxErrorHandler.handleEmptyError()) + socialRepository.getMember(leader) + .subscribe( + { + binding?.root?.findViewById(R.id.groupleader_avatar_view)?.setAvatar(it) + binding?.root?.findViewById(R.id.groupleader_text_view)?.text = getString(R.string.invitation_title, it.displayName, binding?.invitationsView?.groupName) + }, + RxErrorHandler.handleEmptyError() + ) ) } @@ -141,33 +146,42 @@ class NoPartyFragmentFragment : BaseMainFragment() { if (it.resultCode == Activity.RESULT_OK) { val bundle = it.data?.extras if (bundle?.getString("groupType") == "party") { - socialRepository.createGroup(bundle.getString("name"), + socialRepository.createGroup( + bundle.getString("name"), bundle.getString("description"), bundle.getString("leader"), "party", bundle.getString("privacy"), - bundle.getBoolean("leaderCreateChallenge")) + bundle.getBoolean("leaderCreateChallenge") + ) .flatMap { userRepository.retrieveUser(false) } - .subscribe({ - if (isAdded) { - parentFragmentManager.popBackStack() - } - MainNavigationController.navigate(R.id.partyFragment, - bundleOf(Pair("partyID", user?.party?.id))) - }, RxErrorHandler.handleEmptyError()) + .subscribe( + { + if (isAdded) { + parentFragmentManager.popBackStack() + } + MainNavigationController.navigate( + R.id.partyFragment, + bundleOf(Pair("partyID", user?.party?.id)) + ) + }, + RxErrorHandler.handleEmptyError() + ) } } } private fun refresh() { - compositeSubscription.add(userRepository.retrieveUser(false, forced = true) + compositeSubscription.add( + userRepository.retrieveUser(false, forced = true) .filter { it.hasParty() } .flatMap { socialRepository.retrieveGroup("party") } .flatMap { group1 -> socialRepository.retrieveGroupMembers(group1.id, true) } .doOnComplete { binding?.refreshLayout?.isRefreshing = false } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } override fun onDestroy() { @@ -191,5 +205,4 @@ class NoPartyFragmentFragment : BaseMainFragment() { return fragment } } - } 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 d72d7ae9b..8dfdb6ec6 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 @@ -12,8 +12,8 @@ import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent -import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.ChallengeRepository +import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.databinding.FragmentPartyDetailBinding @@ -33,7 +33,6 @@ import com.habitrpg.android.habitica.ui.activities.FullProfileActivity import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemDialogFragment -import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemRecyclerFragment import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.android.habitica.ui.helpers.setMarkdown @@ -42,7 +41,6 @@ import com.habitrpg.android.habitica.ui.viewmodels.PartyViewModel import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import javax.inject.Inject @@ -96,20 +94,23 @@ class PartyDetailFragment : BaseFragment() { binding?.invitationsView?.acceptCall = { viewModel?.joinGroup(it) { - compositeSubscription.add(userRepository.retrieveUser(false) + compositeSubscription.add( + userRepository.retrieveUser(false) .subscribe { user -> parentFragmentManager.popBackStack() - MainNavigationController.navigate(R.id.partyFragment, - bundleOf(Pair("partyID", user.party?.id))) - - }) + MainNavigationController.navigate( + R.id.partyFragment, + bundleOf(Pair("partyID", user.party?.id)) + ) + } + ) } } binding?.invitationsView?.rejectCall = { socialRepository.rejectGroupInvite(it) - .flatMap { userRepository.retrieveUser(false, true) } - .subscribe({ }, RxErrorHandler.handleEmptyError()) + .flatMap { userRepository.retrieveUser(false, true) } + .subscribe({ }, RxErrorHandler.handleEmptyError()) } viewModel?.getGroupData()?.observe(viewLifecycleOwner, { updateParty(it) }) @@ -140,7 +141,7 @@ class PartyDetailFragment : BaseFragment() { lifecycleScope.launch(Dispatchers.Main) { delay(500) inventoryRepository.getQuestContent(party.quest?.key ?: "") - .subscribe({ this@PartyDetailFragment.updateQuestContent(it) }, RxErrorHandler.handleEmptyError()) + .subscribe({ this@PartyDetailFragment.updateQuestContent(it) }, RxErrorHandler.handleEmptyError()) } } else { binding?.newQuestButton?.visibility = View.VISIBLE @@ -183,11 +184,14 @@ class PartyDetailFragment : BaseFragment() { leaderID.let { id -> compositeSubscription.add( - socialRepository.getMember(id) - .subscribe({ member -> - binding?.root?.findViewById(R.id.groupleader_avatar_view)?.setAvatar(member) - binding?.root?.findViewById(R.id.groupleader_text_view)?.text = getString(R.string.invitation_title, member.displayName, groupName) - }, RxErrorHandler.handleEmptyError()) + socialRepository.getMember(id) + .subscribe( + { member -> + binding?.root?.findViewById(R.id.groupleader_avatar_view)?.setAvatar(member) + binding?.root?.findViewById(R.id.groupleader_text_view)?.text = getString(R.string.invitation_title, member.displayName, groupName) + }, + RxErrorHandler.handleEmptyError() + ) ) } @@ -255,13 +259,15 @@ class PartyDetailFragment : BaseFragment() { private fun updateMembersList(members: List?) { val leaderID = viewModel?.leaderID members?.forEachIndexed { index, member -> - val memberView = (if (binding?.membersWrapper?.childCount ?: 0 > index) { - binding?.membersWrapper?.getChildAt(index) - } else { - val view = binding?.membersWrapper?.inflate(R.layout.party_member, false) - binding?.membersWrapper?.addView(view) - view - }) ?: return@forEachIndexed + val memberView = ( + if (binding?.membersWrapper?.childCount ?: 0 > index) { + binding?.membersWrapper?.getChildAt(index) + } else { + val view = binding?.membersWrapper?.inflate(R.layout.party_member, false) + binding?.membersWrapper?.addView(view) + view + } + ) ?: return@forEachIndexed val viewHolder = GroupMemberViewHolder(memberView) viewHolder.bind(member, leaderID ?: "", viewModel?.getUserData()?.value?.id) viewHolder.onClickEvent = { @@ -291,12 +297,17 @@ class PartyDetailFragment : BaseFragment() { val addMessageDialog = context?.let { HabiticaAlertDialog(it) } addMessageDialog?.addButton(android.R.string.ok, true) { _, _ -> socialRepository.postPrivateMessage(userID, emojiEditText.text.toString()) - .subscribe({ + .subscribe( + { (activity as? MainActivity)?.snackbarContainer?.let { it1 -> - HabiticaSnackbar.showSnackbar(it1, - String.format(getString(R.string.profile_message_sent_to), username), HabiticaSnackbar.SnackbarDisplayType.NORMAL) + HabiticaSnackbar.showSnackbar( + it1, + String.format(getString(R.string.profile_message_sent_to), username), HabiticaSnackbar.SnackbarDisplayType.NORMAL + ) } - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) activity?.dismissKeyboard() } addMessageDialog?.addButton(android.R.string.cancel, false) { _, _ -> activity?.dismissKeyboard() } @@ -308,12 +319,17 @@ class PartyDetailFragment : BaseFragment() { val dialog = context?.let { HabiticaAlertDialog(it) } dialog?.addButton(R.string.transfer, true) { _, _ -> socialRepository.transferGroupOwnership(viewModel?.groupID ?: "", userID) - .subscribe({ + .subscribe( + { (activity as? MainActivity)?.snackbarContainer?.let { it1 -> - HabiticaSnackbar.showSnackbar(it1, - String.format(getString(R.string.transferred_ownership), displayName), HabiticaSnackbar.SnackbarDisplayType.NORMAL) + HabiticaSnackbar.showSnackbar( + it1, + String.format(getString(R.string.transferred_ownership), displayName), HabiticaSnackbar.SnackbarDisplayType.NORMAL + ) } - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) activity?.dismissKeyboard() } dialog?.addButton(android.R.string.cancel, false) { _, _ -> activity?.dismissKeyboard() } @@ -326,12 +342,17 @@ class PartyDetailFragment : BaseFragment() { val dialog = context?.let { HabiticaAlertDialog(it) } dialog?.addButton(R.string.remove, true) { _, _ -> socialRepository.removeMemberFromGroup(viewModel?.groupID ?: "", userID) - .subscribe({ + .subscribe( + { (activity as? MainActivity)?.snackbarContainer?.let { it1 -> - HabiticaSnackbar.showSnackbar(it1, - String.format(getString(R.string.removed_member), displayName), HabiticaSnackbar.SnackbarDisplayType.NORMAL) + HabiticaSnackbar.showSnackbar( + it1, + String.format(getString(R.string.removed_member), displayName), HabiticaSnackbar.SnackbarDisplayType.NORMAL + ) } - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) activity?.dismissKeyboard() } dialog?.addButton(android.R.string.cancel, false) { _, _ -> activity?.dismissKeyboard() } @@ -373,13 +394,13 @@ class PartyDetailFragment : BaseFragment() { alert.setTitle(R.string.party_challenges) alert.setMessage(R.string.leave_party_challenges_confirmation) alert.addButton(R.string.keep_challenges, true) { _, _ -> - viewModel?.leaveGroup(groupChallenges,true) { + viewModel?.leaveGroup(groupChallenges, true) { parentFragmentManager.popBackStack() MainNavigationController.navigate(R.id.noPartyFragment) } } alert.addButton(R.string.leave_challenges_delete_tasks, false, isDestructive = true) { _, _ -> - viewModel?.leaveGroup(groupChallenges,false) { + viewModel?.leaveGroup(groupChallenges, false) { parentFragmentManager.popBackStack() MainNavigationController.navigate(R.id.noPartyFragment) } @@ -408,7 +429,6 @@ class PartyDetailFragment : BaseFragment() { viewModel?.acceptQuest() } - private fun onQuestReject() { HapticFeedbackManager.tap(requireView()) viewModel?.rejectQuest() 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 96ae859a9..3f5ae0d76 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 @@ -22,7 +22,6 @@ import com.habitrpg.android.habitica.ui.viewmodels.GroupViewType import com.habitrpg.android.habitica.ui.viewmodels.PartyViewModel import java.util.* - class PartyFragment : BaseMainFragment() { private var detailFragment: PartyDetailFragment? = null @@ -37,8 +36,11 @@ class PartyFragment : BaseMainFragment() { return FragmentViewpagerBinding.inflate(inflater, container, false) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { this.usesTabLayout = true this.hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) @@ -51,11 +53,12 @@ class PartyFragment : BaseMainFragment() { .get(PartyViewModel::class.java) viewModel.groupViewType = GroupViewType.PARTY - viewModel.getGroupData().observe(viewLifecycleOwner, + viewModel.getGroupData().observe( + viewLifecycleOwner, { updateGroupUI(it) - }) - + } + ) binding?.viewPager?.currentItem = 0 @@ -125,7 +128,7 @@ class PartyFragment : BaseMainFragment() { return true } R.id.menu_guild_refresh -> { - viewModel.retrieveGroup { } + viewModel.retrieveGroup { } return true } } @@ -171,7 +174,7 @@ class PartyFragment : BaseMainFragment() { inviteData["emails"] = invites } val userIDs = it.data?.getStringArrayExtra(GroupInviteActivity.USER_IDS_KEY) - if (userIDs != null && userIDs.isNotEmpty()){ + if (userIDs != null && userIDs.isNotEmpty()) { val invites = ArrayList() userIDs.forEach { invites.add(it) } inviteData["usernames"] = invites @@ -199,7 +202,6 @@ class PartyFragment : BaseMainFragment() { } else -> Fragment() } ?: Fragment() - } override fun getItemCount(): Int { @@ -217,7 +219,7 @@ class PartyFragment : BaseMainFragment() { override fun onPageSelected(position: Int) { if (position == 1) { - chatFragment?.setNavigatedToFragment() + chatFragment?.setNavigatedToFragment() } } }) 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 ecab13d0a..54163a54d 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 @@ -27,7 +27,6 @@ class PartyInviteFragment : BaseFragment() { var isEmailInvite: Boolean = false - val values: Array get() { val values = ArrayList() 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 b65d5609e..0b59035ab 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 @@ -8,7 +8,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.TextView import androidx.core.os.bundleOf import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent @@ -25,7 +24,7 @@ import io.reactivex.rxjava3.core.Completable import javax.inject.Inject import javax.inject.Named -class BugFixFragment: BaseMainFragment() { +class BugFixFragment : BaseMainFragment() { private var deviceInfo: DeviceName.DeviceInfo? = null override var binding: FragmentSupportBugFixBinding? = null @@ -42,8 +41,11 @@ class BugFixFragment: BaseMainFragment() { component.inject(this) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { hidesToolbar = true showsBackButton = true return super.onCreateView(inflater, container, savedInstanceState) @@ -52,9 +54,11 @@ class BugFixFragment: BaseMainFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - compositeSubscription.add(Completable.fromAction { - deviceInfo = context?.let { DeviceName.getDeviceInfo(it) } - }.subscribe()) + compositeSubscription.add( + Completable.fromAction { + deviceInfo = context?.let { DeviceName.getDeviceInfo(it) } + }.subscribe() + ) binding?.reportBugButton?.setOnClickListener { sendEmail("[Android] Bugreport") @@ -93,8 +97,8 @@ class BugFixFragment: BaseMainFragment() { val deviceName = deviceInfo?.name ?: DeviceName.deviceName val manufacturer = deviceInfo?.manufacturer ?: Build.MANUFACTURER var bodyOfEmail = Uri.encode("Device: $manufacturer $deviceName") + - "%0D%0A" + Uri.encode("Android Version: $version") + - "%0D%0A" + Uri.encode("AppVersion: " + getString(R.string.version_info, versionName, versionCode)) + "%0D%0A" + Uri.encode("Android Version: $version") + + "%0D%0A" + Uri.encode("AppVersion: " + getString(R.string.version_info, versionName, versionCode)) if (appConfigManager.testingLevel().name != AppTestingLevel.PRODUCTION.name) { bodyOfEmail += "%0D%0A" + Uri.encode(appConfigManager.testingLevel().name) @@ -104,11 +108,11 @@ class BugFixFragment: BaseMainFragment() { val user = this.user if (user != null) { bodyOfEmail += "%0D%0A" + Uri.encode("Level: " + (user.stats?.lvl ?: 0)) + - "%0D%0A" + Uri.encode("Class: " + (if (user.preferences?.disableClasses == true) "Disabled" else (user.stats?.habitClass ?: "None"))) + - "%0D%0A" + Uri.encode("Is in Inn: " + (user.preferences?.sleep ?: false)) + - "%0D%0A" + Uri.encode("Uses Costume: " + (user.preferences?.costume ?: false)) + - "%0D%0A" + Uri.encode("Custom Day Start: " + (user.preferences?.dayStart ?: 0)) + - "%0D%0A" + Uri.encode("Timezone Offset: " + (user.preferences?.timezoneOffset ?: 0)) + "%0D%0A" + Uri.encode("Class: " + (if (user.preferences?.disableClasses == true) "Disabled" else (user.stats?.habitClass ?: "None"))) + + "%0D%0A" + Uri.encode("Is in Inn: " + (user.preferences?.sleep ?: false)) + + "%0D%0A" + Uri.encode("Uses Costume: " + (user.preferences?.costume ?: false)) + + "%0D%0A" + Uri.encode("Custom Day Start: " + (user.preferences?.dayStart ?: 0)) + + "%0D%0A" + Uri.encode("Timezone Offset: " + (user.preferences?.timezoneOffset ?: 0)) } bodyOfEmail += "%0D%0ADetails:%0D%0A%0D%0A" @@ -116,11 +120,11 @@ class BugFixFragment: BaseMainFragment() { activity?.let { val emailIntent = Intent(Intent.ACTION_SENDTO) val mailto = "mailto:" + appConfigManager.supportEmail() + - "?subject=" + Uri.encode(subject) + - "&body=" + bodyOfEmail + "?subject=" + Uri.encode(subject) + + "&body=" + bodyOfEmail emailIntent.data = Uri.parse(mailto) startActivity(Intent.createChooser(emailIntent, "Choose an Email client:")) } } -} \ No newline at end of file +} 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 2f5b54698..f1efd82d1 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 @@ -38,12 +38,16 @@ class FAQDetailFragment : BaseMainFragment() { binding?.questionTextView?.text = args.question binding?.answerTextView?.text = MarkdownParser.parseMarkdown(args.answer) } else { - compositeSubscription.add(faqRepository.getArticle(args.position).subscribe({ faq -> - binding?.questionTextView?.text = faq.question - binding?.answerTextView?.text = MarkdownParser.parseMarkdown(faq.answer) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + faqRepository.getArticle(args.position).subscribe( + { faq -> + binding?.questionTextView?.text = faq.question + binding?.answerTextView?.text = MarkdownParser.parseMarkdown(faq.answer) + }, + RxErrorHandler.handleEmptyError() + ) + ) } - } binding?.answerTextView?.movementMethod = LinkMovementMethod.getInstance() @@ -52,4 +56,4 @@ class FAQDetailFragment : BaseMainFragment() { override fun injectFragment(component: UserComponent) { component.inject(this) } -} \ No newline at end of file +} 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 bd4c523c8..cf02067b6 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 @@ -32,8 +32,11 @@ class FAQOverviewFragment : BaseMainFragment() { @Inject lateinit var faqRepository: FAQRepository - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { hidesToolbar = true showsBackButton = true return super.onCreateView(inflater, container, savedInstanceState) @@ -67,18 +70,22 @@ class FAQOverviewFragment : BaseMainFragment() { } private fun loadArticles() { - compositeSubscription.add(faqRepository.getArticles().subscribe(Consumer { - val context = context ?: return@Consumer - for (article in it) { - val binding = SupportFaqItemBinding.inflate(context.layoutInflater, binding?.faqLinearLayout, true) - binding.textView.text = article.question - binding.root.setOnClickListener { - val direction = FAQOverviewFragmentDirections.openFAQDetail(null, null) - direction.position = article.position ?: 0 - MainNavigationController.navigate(direction) - } - } - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + faqRepository.getArticles().subscribe( + Consumer { + val context = context ?: return@Consumer + for (article in it) { + val binding = SupportFaqItemBinding.inflate(context.layoutInflater, binding?.faqLinearLayout, true) + binding.textView.text = article.question + binding.root.setOnClickListener { + val direction = FAQOverviewFragmentDirections.openFAQDetail(null, null) + direction.position = article.position ?: 0 + MainNavigationController.navigate(direction) + } + } + }, + RxErrorHandler.handleEmptyError() + ) + ) } - } 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 6ee86ea7e..bd0840106 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 @@ -19,7 +19,6 @@ import io.reactivex.rxjava3.core.Completable import javax.inject.Inject import javax.inject.Named - class SupportMainFragment : BaseMainFragment() { private var deviceInfo: DeviceName.DeviceInfo? = null @@ -36,8 +35,11 @@ class SupportMainFragment : BaseMainFragment() { @Inject lateinit var appConfigManager: AppConfigManager - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { hidesToolbar = true return super.onCreateView(inflater, container, savedInstanceState) } @@ -58,9 +60,11 @@ class SupportMainFragment : BaseMainFragment() { } } - compositeSubscription.add(Completable.fromAction { - deviceInfo = context?.let { DeviceName.getDeviceInfo(it) } - }.subscribe()) + compositeSubscription.add( + Completable.fromAction { + deviceInfo = context?.let { DeviceName.getDeviceInfo(it) } + }.subscribe() + ) binding?.resetTutorialButton?.setOnClickListener { userRepository.resetTutorial() @@ -75,4 +79,4 @@ class SupportMainFragment : BaseMainFragment() { override fun injectFragment(component: UserComponent) { component.inject(this) } -} \ No newline at end of file +} 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 b00cf2c7d..7767c59b9 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 @@ -53,21 +53,34 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() if (showCustomRewards) { - compositeSubscription.add(inventoryRepository.getInAppRewards().subscribe({ - (recyclerAdapter as? RewardsRecyclerViewAdapter)?.updateItemRewards(it) - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + inventoryRepository.getInAppRewards().subscribe( + { + (recyclerAdapter as? RewardsRecyclerViewAdapter)?.updateItemRewards(it) + }, + RxErrorHandler.handleEmptyError() + ) + ) } - (recyclerAdapter as? RewardsRecyclerViewAdapter)?.purchaseCardEvents?.subscribe({ - selectedCard = it - val intent = Intent(activity, SkillMemberActivity::class.java) - cardSelectedResult.launch(intent) - }, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) } + (recyclerAdapter as? RewardsRecyclerViewAdapter)?.purchaseCardEvents?.subscribe( + { + selectedCard = it + val intent = Intent(activity, SkillMemberActivity::class.java) + cardSelectedResult.launch(intent) + }, + RxErrorHandler.handleEmptyError() + )?.let { compositeSubscription.add(it) } recyclerAdapter?.brokenTaskEvents?.subscribeWithErrorHandler { showBrokenChallengeDialog(it) }?.let { compositeSubscription.add(it) } - compositeSubscription.add(userRepository.getUser().subscribe({ - (recyclerAdapter as? RewardsRecyclerViewAdapter)?.user = it - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getUser().subscribe( + { + (recyclerAdapter as? RewardsRecyclerViewAdapter)?.user = it + }, + RxErrorHandler.handleEmptyError() + ) + ) } override fun getLayoutManager(context: Context?): LinearLayoutManager { @@ -76,11 +89,13 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { override fun onRefresh() { binding?.refreshLayout?.isRefreshing = true - compositeSubscription.add(userRepository.retrieveUser(withTasks = true, forced = true) + compositeSubscription.add( + userRepository.retrieveUser(withTasks = true, forced = true) .flatMap { inventoryRepository.retrieveInAppRewards() } .doOnTerminate { binding?.refreshLayout?.isRefreshing = false - }.subscribe({ }, RxErrorHandler.handleEmptyError())) + }.subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } private fun setGridSpanCount(width: Int) { @@ -99,15 +114,21 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { private val cardSelectedResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == Activity.RESULT_OK) { - userRepository.useSkill(selectedCard?.key ?: "", + userRepository.useSkill( + selectedCard?.key ?: "", "member", - it.data?.getStringExtra("member_id") ?: "") - .subscribeWithErrorHandler(Consumer { - val activity = (activity as? MainActivity) ?: return@Consumer - HabiticaSnackbar.showSnackbar(activity.snackbarContainer, - context?.getString(R.string.sent_card, selectedCard?.text), - HabiticaSnackbar.SnackbarDisplayType.BLUE) - }) + it.data?.getStringExtra("member_id") ?: "" + ) + .subscribeWithErrorHandler( + Consumer { + val activity = (activity as? MainActivity) ?: return@Consumer + HabiticaSnackbar.showSnackbar( + activity.snackbarContainer, + context?.getString(R.string.sent_card, selectedCard?.text), + HabiticaSnackbar.SnackbarDisplayType.BLUE + ) + } + ) } } 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 41b194be5..7b4234551 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 @@ -105,33 +105,44 @@ open class TaskRecyclerViewFragment : BaseFragment - HabiticaSnackbar.showSnackbar(activity.snackbarContainer, null, getString(R.string.notification_purchase_reward), - BitmapDrawable(resources, HabiticaIconsHelper.imageOfGold()), - ContextCompat.getColor(activity, R.color.yellow_10), - "-$value", - HabiticaSnackbar.SnackbarDisplayType.DROP) + HabiticaSnackbar.showSnackbar( + activity.snackbarContainer, null, getString(R.string.notification_purchase_reward), + BitmapDrawable(resources, HabiticaIconsHelper.imageOfGold()), + ContextCompat.getColor(activity, R.color.yellow_10), + "-$value", + HabiticaSnackbar.SnackbarDisplayType.DROP + ) } } else { (activity as? MainActivity)?.displayTaskScoringResponse(result) @@ -199,13 +210,15 @@ open class TaskRecyclerViewFragment : BaseFragment - val taskCount = tasks.size - val dialog = HabiticaAlertDialog(it) - dialog.setTitle(R.string.broken_challenge) - dialog.setMessage(it.getString(R.string.broken_challenge_description, taskCount)) - dialog.addButton(it.getString(R.string.keep_x_tasks, taskCount), true) { _, _ -> - if (!task.isValid) return@addButton - taskRepository.unlinkAllTasks(task.challengeID, "keep-all") + taskRepository.getTasksForChallenge(task.challengeID).firstElement().subscribe( + { tasks -> + val taskCount = tasks.size + val dialog = HabiticaAlertDialog(it) + dialog.setTitle(R.string.broken_challenge) + dialog.setMessage(it.getString(R.string.broken_challenge_description, taskCount)) + dialog.addButton(it.getString(R.string.keep_x_tasks, taskCount), true) { _, _ -> + if (!task.isValid) return@addButton + taskRepository.unlinkAllTasks(task.challengeID, "keep-all") .flatMap { userRepository.retrieveUser(true, forced = true) } .subscribe({}, RxErrorHandler.handleEmptyError()) - } - dialog.addButton(it.getString(R.string.delete_x_tasks, taskCount), - isPrimary = false, - isDestructive = true - ) { _, _ -> - if (!task.isValid) return@addButton - taskRepository.unlinkAllTasks(task.challengeID, "remove-all") + } + dialog.addButton( + it.getString(R.string.delete_x_tasks, taskCount), + isPrimary = false, + isDestructive = true + ) { _, _ -> + if (!task.isValid) return@addButton + taskRepository.unlinkAllTasks(task.challengeID, "remove-all") .flatMap { userRepository.retrieveUser(true, forced = true) } .subscribe({}, RxErrorHandler.handleEmptyError()) - } - dialog.setExtraCloseButtonVisibility(View.VISIBLE) - dialog.show() - }, RxErrorHandler.handleEmptyError()) + } + dialog.setExtraCloseButtonVisibility(View.VISIBLE) + dialog.show() + }, + RxErrorHandler.handleEmptyError() + ) } } @@ -300,25 +322,29 @@ open class TaskRecyclerViewFragment : BaseFragment { EmptyItem( getString(R.string.empty_title_dailies_filtered), getString(R.string.empty_description_dailies_filtered), - R.drawable.icon_dailies) + R.drawable.icon_dailies + ) } Task.TYPE_TODO -> { EmptyItem( getString(R.string.empty_title_todos_filtered), getString(R.string.empty_description_todos_filtered), - R.drawable.icon_todos) + R.drawable.icon_todos + ) } Task.TYPE_REWARD -> { EmptyItem( getString(R.string.empty_title_rewards_filtered), null, - R.drawable.icon_rewards) + R.drawable.icon_rewards + ) } else -> EmptyItem("") } @@ -328,25 +354,29 @@ open class TaskRecyclerViewFragment : BaseFragment { EmptyItem( getString(R.string.empty_title_dailies), getString(R.string.empty_description_dailies), - R.drawable.icon_dailies) + R.drawable.icon_dailies + ) } Task.TYPE_TODO -> { EmptyItem( getString(R.string.empty_title_todos), getString(R.string.empty_description_todos), - R.drawable.icon_todos) + R.drawable.icon_todos + ) } Task.TYPE_REWARD -> { EmptyItem( getString(R.string.empty_title_rewards), null, - R.drawable.icon_rewards) + R.drawable.icon_rewards + ) } else -> EmptyItem("") } @@ -354,19 +384,21 @@ open class TaskRecyclerViewFragment : BaseFragment - handleTaskResult(result, task.value.toInt()) - if (!DateUtils.isToday(sharedPreferences.getLong("last_task_reporting", 0))) { - AmplitudeManager.sendEvent( - "task scored", - AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, - AmplitudeManager.EVENT_HITTYPE_EVENT - ) - sharedPreferences.edit { - putLong("last_task_reporting", Date().time) + compositeSubscription.add( + taskRepository.taskChecked(null, task, direction == TaskDirection.UP, false) { result -> + handleTaskResult(result, task.value.toInt()) + if (!DateUtils.isToday(sharedPreferences.getLong("last_task_reporting", 0))) { + AmplitudeManager.sendEvent( + "task scored", + AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, + AmplitudeManager.EVENT_HITTYPE_EVENT + ) + sharedPreferences.edit { + putLong("last_task_reporting", Date().time) + } } - } - }.subscribeWithErrorHandler {}) + }.subscribeWithErrorHandler {} + ) } override fun onSaveInstanceState(outState: Bundle) { 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 8eb26ef4c..121a12b0f 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 @@ -34,7 +34,6 @@ import javax.inject.Inject import javax.inject.Named import kotlin.collections.ArrayList - class TasksFragment : BaseMainFragment(), SearchView.OnQueryTextListener, HabiticaBottomNavigationViewListener { override var binding: FragmentViewpagerBinding? = null @@ -70,8 +69,11 @@ class TasksFragment : BaseMainFragment(), SearchView.O return fragment } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { this.usesTabLayout = false this.usesBottomNavigation = true return super.onCreateView(inflater, container, savedInstanceState) @@ -180,7 +182,7 @@ class TasksFragment : BaseMainFragment(), SearchView.O context?.let { val disposable: Disposable val dialog = TaskFilterDialog(it, HabiticaBaseApplication.userComponent) - disposable = tagRepository.getTags().subscribe({ tagsList -> dialog.setTags(tagsList)}, RxErrorHandler.handleEmptyError()) + disposable = tagRepository.getTags().subscribe({ tagsList -> dialog.setTags(tagsList) }, RxErrorHandler.handleEmptyError()) dialog.setActiveTags(taskFilterHelper.tags) if (activeFragment != null) { val taskType = activeFragment?.taskType @@ -227,12 +229,14 @@ class TasksFragment : BaseMainFragment(), SearchView.O else -> TaskRecyclerViewFragment.newInstance(context, Task.TYPE_TODO) } fragment.refreshAction = { - compositeSubscription.add(userRepository.retrieveUser( - withTasks = true, - forced = true - ).doOnTerminate { - it() - }.subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.retrieveUser( + withTasks = true, + forced = true + ).doOnTerminate { + it() + }.subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } viewFragmentsDictionary?.put(position, fragment) @@ -243,13 +247,13 @@ class TasksFragment : BaseMainFragment(), SearchView.O } binding?.viewPager?.registerOnPageChangeCallback(object : - ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - super.onPageSelected(position) - bottomNavigation?.selectedPosition = position - updateFilterIcon() - } - }) + ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + bottomNavigation?.selectedPosition = position + updateFilterIcon() + } + }) } private fun updateFilterIcon() { @@ -276,47 +280,52 @@ class TasksFragment : BaseMainFragment(), SearchView.O if (bottomNavigation == null) { return } - compositeSubscription.add(tutorialRepository.getTutorialSteps(listOf("habits", "dailies", "todos", "rewards")).subscribe({ tutorialSteps -> - val activeTutorialFragments = ArrayList() - for (step in tutorialSteps) { - var id = -1 - val taskType = when (step.identifier) { - "habits" -> { - id = R.id.habits_tab - Task.TYPE_HABIT + compositeSubscription.add( + tutorialRepository.getTutorialSteps(listOf("habits", "dailies", "todos", "rewards")).subscribe( + { tutorialSteps -> + val activeTutorialFragments = ArrayList() + for (step in tutorialSteps) { + var id = -1 + val taskType = when (step.identifier) { + "habits" -> { + id = R.id.habits_tab + Task.TYPE_HABIT + } + "dailies" -> { + id = R.id.dailies_tab + Task.TYPE_DAILY + } + "todos" -> { + id = R.id.todos_tab + Task.TYPE_TODO + } + "rewards" -> { + id = R.id.rewards_tab + Task.TYPE_REWARD + } + else -> "" + } + val tab = bottomNavigation?.tabWithId(id) + if (step.shouldDisplay()) { + tab?.badgeCount = 1 + activeTutorialFragments.add(taskType) + } else { + tab?.badgeCount = 0 + } } - "dailies" -> { - id = R.id.dailies_tab - Task.TYPE_DAILY + if (activeTutorialFragments.size == 1) { + val fragment = viewFragmentsDictionary?.get(indexForTaskType(activeTutorialFragments[0])) + if (fragment?.tutorialTexts != null && context != null) { + val finalText = context?.getString(R.string.tutorial_tasks_complete) + if (!fragment.tutorialTexts.contains(finalText) && finalText != null) { + fragment.tutorialTexts.add(finalText) + } + } } - "todos" -> { - id = R.id.todos_tab - Task.TYPE_TODO - } - "rewards" -> { - id = R.id.rewards_tab - Task.TYPE_REWARD - } - else -> "" - } - val tab = bottomNavigation?.tabWithId(id) - if (step.shouldDisplay()) { - tab?.badgeCount = 1 - activeTutorialFragments.add(taskType) - } else { - tab?.badgeCount = 0 - } - } - if (activeTutorialFragments.size == 1) { - val fragment = viewFragmentsDictionary?.get(indexForTaskType(activeTutorialFragments[0])) - if (fragment?.tutorialTexts != null && context != null) { - val finalText = context?.getString(R.string.tutorial_tasks_complete) - if (!fragment.tutorialTexts.contains(finalText) && finalText != null) { - fragment.tutorialTexts.add(finalText) - } - } - } - }, RxErrorHandler.handleEmptyError())) + }, + RxErrorHandler.handleEmptyError() + ) + ) } // endregion @@ -409,7 +418,6 @@ class TasksFragment : BaseMainFragment(), SearchView.O var lastTaskFormOpen: Date? = null } - override fun onTabSelected(taskType: String, smooth: Boolean) { val newItem = when (taskType) { Task.TYPE_HABIT -> 0 @@ -425,4 +433,4 @@ class TasksFragment : BaseMainFragment(), SearchView.O override fun onAdd(taskType: String) { openNewTaskActivity(taskType) } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt index 91f6ee61c..9c548f1a7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt @@ -4,7 +4,12 @@ import android.app.Activity import android.content.Intent import android.graphics.PorterDuff import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.widget.SearchView import androidx.core.content.ContextCompat @@ -18,17 +23,21 @@ import com.habitrpg.android.habitica.data.TagRepository import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.extensions.getThemeColor import com.habitrpg.android.habitica.extensions.setTintWith -import com.habitrpg.android.habitica.helpers.* +import com.habitrpg.android.habitica.helpers.AmplitudeManager +import com.habitrpg.android.habitica.helpers.AppConfigManager +import com.habitrpg.android.habitica.helpers.MainNavigationController +import com.habitrpg.android.habitica.helpers.RxErrorHandler +import com.habitrpg.android.habitica.helpers.TaskFilterHelper import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.ui.activities.TaskFormActivity import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.views.navigation.HabiticaBottomNavigationViewListener import com.habitrpg.android.habitica.ui.views.tasks.TaskFilterDialog import io.reactivex.rxjava3.disposables.Disposable -import java.util.* +import java.util.Date +import java.util.HashMap +import java.util.WeakHashMap import javax.inject.Inject -import kotlin.collections.ArrayList - class TeamBoardFragment : BaseMainFragment(), SearchView.OnQueryTextListener, HabiticaBottomNavigationViewListener { @@ -63,8 +72,11 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi return fragment } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { this.usesTabLayout = false this.hidesToolbar = true this.usesBottomNavigation = true @@ -79,10 +91,15 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi teamID = args.teamID } - compositeSubscription.add(userRepository.getTeamPlan(teamID) - .subscribe( { - activity?.title = it.name - }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add( + userRepository.getTeamPlan(teamID) + .subscribe( + { + activity?.title = it.name + }, + RxErrorHandler.handleEmptyError() + ) + ) compositeSubscription.add(userRepository.retrieveTeamPlan(teamID).subscribe({ }, RxErrorHandler.handleEmptyError())) @@ -177,7 +194,7 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi context?.let { val disposable: Disposable val dialog = TaskFilterDialog(it, HabiticaBaseApplication.userComponent) - disposable = tagRepository.getTags().subscribe({ tagsList -> dialog.setTags(tagsList)}, RxErrorHandler.handleEmptyError()) + disposable = tagRepository.getTags().subscribe({ tagsList -> dialog.setTags(tagsList) }, RxErrorHandler.handleEmptyError()) dialog.setActiveTags(taskFilterHelper.tags) if (activeFragment != null) { val taskType = activeFragment?.taskType @@ -226,10 +243,12 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi fragment.canEditTasks = false fragment.canScoreTaks = false fragment.refreshAction = { - compositeSubscription.add(userRepository.retrieveTeamPlan(teamID) + compositeSubscription.add( + userRepository.retrieveTeamPlan(teamID) .doOnTerminate { it() - }.subscribe({ }, RxErrorHandler.handleEmptyError())) + }.subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } viewFragmentsDictionary?.put(position, fragment) @@ -241,11 +260,11 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi } binding?.viewPager?.registerOnPageChangeCallback(object : - ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - bottomNavigation?.selectedPosition = position - updateFilterIcon() - } + ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + bottomNavigation?.selectedPosition = position + updateFilterIcon() + } }) } @@ -277,47 +296,52 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi if (bottomNavigation == null) { return } - compositeSubscription.add(tutorialRepository.getTutorialSteps(listOf("habits", "dailies", "todos", "rewards")).subscribe({ tutorialSteps -> - val activeTutorialFragments = ArrayList() - for (step in tutorialSteps) { - var id = -1 - val taskType = when (step.identifier) { - "habits" -> { - id = R.id.habits_tab - Task.TYPE_HABIT + compositeSubscription.add( + tutorialRepository.getTutorialSteps(listOf("habits", "dailies", "todos", "rewards")).subscribe( + { tutorialSteps -> + val activeTutorialFragments = ArrayList() + for (step in tutorialSteps) { + var id = -1 + val taskType = when (step.identifier) { + "habits" -> { + id = R.id.habits_tab + Task.TYPE_HABIT + } + "dailies" -> { + id = R.id.dailies_tab + Task.TYPE_DAILY + } + "todos" -> { + id = R.id.todos_tab + Task.TYPE_TODO + } + "rewards" -> { + id = R.id.rewards_tab + Task.TYPE_REWARD + } + else -> "" + } + val tab = bottomNavigation?.tabWithId(id) + if (step.shouldDisplay()) { + tab?.badgeCount = 1 + activeTutorialFragments.add(taskType) + } else { + tab?.badgeCount = 0 + } } - "dailies" -> { - id = R.id.dailies_tab - Task.TYPE_DAILY + if (activeTutorialFragments.size == 1) { + val fragment = viewFragmentsDictionary?.get(indexForTaskType(activeTutorialFragments[0])) + if (fragment?.tutorialTexts != null && context != null) { + val finalText = context?.getString(R.string.tutorial_tasks_complete) + if (!fragment.tutorialTexts.contains(finalText) && finalText != null) { + fragment.tutorialTexts.add(finalText) + } + } } - "todos" -> { - id = R.id.todos_tab - Task.TYPE_TODO - } - "rewards" -> { - id = R.id.rewards_tab - Task.TYPE_REWARD - } - else -> "" - } - val tab = bottomNavigation?.tabWithId(id) - if (step.shouldDisplay()) { - tab?.badgeCount = 1 - activeTutorialFragments.add(taskType) - } else { - tab?.badgeCount = 0 - } - } - if (activeTutorialFragments.size == 1) { - val fragment = viewFragmentsDictionary?.get(indexForTaskType(activeTutorialFragments[0])) - if (fragment?.tutorialTexts != null && context != null) { - val finalText = context?.getString(R.string.tutorial_tasks_complete) - if (!fragment.tutorialTexts.contains(finalText) && finalText != null) { - fragment.tutorialTexts.add(finalText) - } - } - } - }, RxErrorHandler.handleEmptyError())) + }, + RxErrorHandler.handleEmptyError() + ) + ) } // endregion @@ -415,4 +439,4 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi override fun onAdd(taskType: String) { openNewTaskActivity(taskType) } -} \ No newline at end of file +} 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 92dc8b774..1e4733879 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 @@ -49,7 +49,7 @@ class AutocompleteAdapter(val context: Context, val socialRepository: SocialRepo isAutocompletingUsers = true userResults = chatMessages.distinctBy { it.username - }.filter { it.username?.startsWith(constraint.toString().drop(1)) ?: false }.map {message -> + }.filter { it.username?.startsWith(constraint.toString().drop(1)) ?: false }.map { message -> val result = FindUsernameResult() result.authentication = Authentication() result.authentication?.localAuthentication = LocalAuthentication() @@ -111,6 +111,4 @@ class AutocompleteAdapter(val context: Context, val socialRepository: SocialRepo override fun getCount(): Int { return if (isAutocompletingUsers) userResults.size else emojiResults.size } - - -} \ No newline at end of file +} 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 bbb52fe7b..437f78cc8 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 @@ -5,13 +5,12 @@ import android.text.Spanned import android.text.TextUtils import android.widget.MultiAutoCompleteTextView - class AutocompleteTokenizer(val tokens: List) : MultiAutoCompleteTextView.Tokenizer { override fun findTokenStart(text: CharSequence, cursor: Int): Int { var i = cursor - while (i > 0 && text[i-1] != ' ' && !tokens.contains(text[i-1])) { + while (i > 0 && text[i - 1] != ' ' && !tokens.contains(text[i-1])) { i-- } @@ -49,12 +48,14 @@ class AutocompleteTokenizer(val tokens: List) : MultiAutoCompleteTextView. } else { if (text is Spanned) { val sp = SpannableString("$text ") - TextUtils.copySpansFrom(text, 0, text.length, - Any::class.java, sp, 0) + TextUtils.copySpansFrom( + text, 0, text.length, + Any::class.java, sp, 0 + ) sp } else { "$text " } } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt index c4ace1661..dd15fd14c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.ui.helpers import android.content.Context -import android.graphics.Bitmap import android.graphics.PorterDuff import android.graphics.drawable.Drawable import android.view.View @@ -19,7 +18,6 @@ import com.habitrpg.android.habitica.helpers.AppConfigManager import java.util.* import kotlin.collections.HashMap - fun ImageView.loadImage(imageName: String?, imageFormat: String? = null) { DataBindingUtils.loadImage(this, imageName, imageFormat) } @@ -98,13 +96,13 @@ object DataBindingUtils { private val FILENAME_MAP: Map private var spriteSubstitutions: Map = HashMap() - get() { - if (Date().time - (lastSubstitutionCheck?.time ?: 0) > 180000) { - field = AppConfigManager(null).spriteSubstitutions()["generic"] ?: HashMap() - lastSubstitutionCheck = Date() + get() { + if (Date().time - (lastSubstitutionCheck?.time ?: 0) > 180000) { + field = AppConfigManager(null).spriteSubstitutions()["generic"] ?: HashMap() + lastSubstitutionCheck = Date() + } + return field } - return field - } private var lastSubstitutionCheck: Date? = null init { @@ -141,7 +139,6 @@ object DataBindingUtils { tempMap["quest_solarSystem"] = "gif" FILEFORMAT_MAP = Collections.unmodifiableMap(tempMap) - val tempNameMap = HashMap() tempNameMap["head_special_1"] = "ContributorOnly-Equip-CrystalHelmet" tempNameMap["armor_special_1"] = "ContributorOnly-Equip-CrystalArmor" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/EmojiParser.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/EmojiParser.kt index 2d1ac695c..350ff80bd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/EmojiParser.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/EmojiParser.kt @@ -47,4 +47,4 @@ object EmojiParser { } return returnString } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/KeyboardUtil.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/KeyboardUtil.kt index fc07af1f7..2aee92b51 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/KeyboardUtil.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/KeyboardUtil.kt @@ -30,7 +30,6 @@ class KeyboardUtil { } } - fun Activity.dismissKeyboard() { KeyboardUtil.dismissKeyboard(this) -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt index e7e405fc1..173e17c25 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt @@ -33,14 +33,16 @@ object MarkdownParser { fun setup(context: Context) { markwon = Markwon.builder(context) - .usePlugin(StrikethroughPlugin.create()) - .usePlugin(ImagesPlugin.create { + .usePlugin(StrikethroughPlugin.create()) + .usePlugin( + ImagesPlugin.create { it.addSchemeHandler(OkHttpNetworkSchemeHandler.create()) - .addSchemeHandler(FileSchemeHandler.createWithAssets(context.assets)) - }) - .usePlugin(this.createImageSizeResolverScaleDpiPlugin(context)) - .usePlugin(MovementMethodPlugin.create(LinkMovementMethod.getInstance())) - .build() + .addSchemeHandler(FileSchemeHandler.createWithAssets(context.assets)) + } + ) + .usePlugin(this.createImageSizeResolverScaleDpiPlugin(context)) + .usePlugin(MovementMethodPlugin.create(LinkMovementMethod.getInstance())) + .build() } /** @@ -86,10 +88,10 @@ object MarkdownParser { fun parseMarkdownAsync(input: String?, onSuccess: Consumer) { Single.just(input ?: "") - .map { this.parseMarkdown(it) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(onSuccess, RxErrorHandler.handleEmptyError()) + .map { this.parseMarkdown(it) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(onSuccess, RxErrorHandler.handleEmptyError()) } /** @@ -103,7 +105,6 @@ object MarkdownParser { } } - fun TextView.setMarkdown(input: String?) { MarkdownParser.markwon?.setParsedMarkdown(this, MarkdownParser.parseMarkdown(input)) this.handleUrlClicks { @@ -124,7 +125,7 @@ fun TextView.setParsedMarkdown(input: Spanned?) { private fun handleUrlClicks(context: Context, url: String) { val webpage = if (url.startsWith("/")) { - Uri.parse("${BuildConfig.BASE_URL}${url}") + Uri.parse("${BuildConfig.BASE_URL}$url") } else { Uri.parse(url) } @@ -132,4 +133,4 @@ private fun handleUrlClicks(context: Context, url: String) { if (intent.resolveActivity(context.packageManager) != null) { context.startActivity(intent) } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/RecyclerViewEmptySupport.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/RecyclerViewEmptySupport.kt index 7a38fa3dc..e2ad593c6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/RecyclerViewEmptySupport.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/RecyclerViewEmptySupport.kt @@ -31,16 +31,16 @@ enum class RecyclerViewState { class RecyclerViewEmptySupport : RecyclerView { var onRefresh: (() -> Unit)? = null var state: RecyclerViewState = RecyclerViewState.LOADING - set(value) { - field = value - when (field) { - RecyclerViewState.DISPLAYING_DATA -> updateAdapter(actualAdapter) - else -> { - updateAdapter(emptyAdapter) - emptyAdapter.notifyDataSetChanged() + set(value) { + field = value + when (field) { + RecyclerViewState.DISPLAYING_DATA -> updateAdapter(actualAdapter) + else -> { + updateAdapter(emptyAdapter) + emptyAdapter.notifyDataSetChanged() + } } } - } private fun updateAdapter(newAdapter: Adapter<*>?) { if (adapter != newAdapter) { @@ -49,10 +49,10 @@ class RecyclerViewEmptySupport : RecyclerView { } var emptyItem: EmptyItem? = null - set(value) { - field = value - emptyAdapter.notifyDataSetChanged() - } + set(value) { + field = value + emptyAdapter.notifyDataSetChanged() + } private var actualAdapter: Adapter<*>? = null private val emptyAdapter: Adapter = object : Adapter() { @@ -160,7 +160,7 @@ class EmptyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { binding.emptyViewTitle.text = emptyItem?.title binding.emptyViewDescription.text = emptyItem?.text - val buttonLabel =emptyItem?.buttonLabel + val buttonLabel = emptyItem?.buttonLabel if (buttonLabel != null) { binding.button.visibility = View.VISIBLE binding.button.text = buttonLabel 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 39dfcc69a..a6d22a0b1 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 @@ -41,8 +41,14 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { var toX: Int = 0 var toY: Int = 0 - constructor(oldHolder: RecyclerView.ViewHolder, newHolder: RecyclerView.ViewHolder, - fromX: Int, fromY: Int, toX: Int, toY: Int) : this(oldHolder, newHolder) { + constructor( + oldHolder: RecyclerView.ViewHolder, + newHolder: RecyclerView.ViewHolder, + fromX: Int, + fromY: Int, + toX: Int, + toY: Int + ) : this(oldHolder, newHolder) { this.fromX = fromX this.fromY = fromY this.toX = toX @@ -50,14 +56,16 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { } override fun toString(): String { - return ("ChangeInfo{" - + "oldHolder=" + oldHolder - + ", newHolder=" + newHolder - + ", fromX=" + fromX - + ", fromY=" + fromY - + ", toX=" + toX - + ", toY=" + toY - + '}'.toString()) + return ( + "ChangeInfo{" + + "oldHolder=" + oldHolder + + ", newHolder=" + newHolder + + ", fromX=" + fromX + + ", fromY=" + fromY + + ", toX=" + toX + + ", toY=" + toY + + '}'.toString() + ) } } @@ -85,8 +93,12 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { pendingMoves.clear() val mover = Runnable { for (moveInfo in moves) { - moveInfo.holder?.let { animateMoveImpl(it, moveInfo.fromX, moveInfo.fromY, - moveInfo.toX, moveInfo.toY) } + moveInfo.holder?.let { + animateMoveImpl( + it, moveInfo.fromX, moveInfo.fromY, + moveInfo.toX, moveInfo.toY + ) + } } moves.clear() movesList.remove(moves) @@ -161,19 +173,19 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { val animation = view.animate() removeAnimations.add(holder) animation.setDuration(removeDuration).alpha(0f).setListener( - object : AnimatorListenerAdapter() { - override fun onAnimationStart(animator: Animator) { - dispatchRemoveStarting(holder) - } + object : AnimatorListenerAdapter() { + override fun onAnimationStart(animator: Animator) { + dispatchRemoveStarting(holder) + } - override fun onAnimationEnd(animator: Animator) { - animation.setListener(null) - view.alpha = 1f - dispatchRemoveFinished(holder) - removeAnimations.remove(holder) - dispatchFinishedWhenDone() - } - }).start() + override fun onAnimationEnd(animator: Animator) { + animation.setListener(null) + view.alpha = 1f + dispatchRemoveFinished(holder) + removeAnimations.remove(holder) + dispatchFinishedWhenDone() + } + }).start() } override fun animateAdd(holder: RecyclerView.ViewHolder): Boolean { @@ -188,26 +200,31 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { val animation = view.animate() addAnimations.add(holder) animation.alpha(1f).setDuration(addDuration) - .setListener(object : AnimatorListenerAdapter() { - override fun onAnimationStart(animator: Animator) { - dispatchAddStarting(holder) - } + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationStart(animator: Animator) { + dispatchAddStarting(holder) + } - override fun onAnimationCancel(animator: Animator) { - view.alpha = 1f - } + override fun onAnimationCancel(animator: Animator) { + view.alpha = 1f + } - override fun onAnimationEnd(animator: Animator) { - animation.setListener(null) - dispatchAddFinished(holder) - addAnimations.remove(holder) - dispatchFinishedWhenDone() - } - }).start() + override fun onAnimationEnd(animator: Animator) { + animation.setListener(null) + dispatchAddFinished(holder) + addAnimations.remove(holder) + dispatchFinishedWhenDone() + } + }).start() } - override fun animateMove(holder: RecyclerView.ViewHolder, fromX: Int, fromY: Int, - toX: Int, toY: Int): Boolean { + override fun animateMove( + holder: RecyclerView.ViewHolder, + fromX: Int, + fromY: Int, + toX: Int, + toY: Int + ): Boolean { var newFromX = fromX var newFromY = fromY val view = holder.itemView @@ -271,8 +288,14 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { }).start() } - override fun animateChange(oldHolder: RecyclerView.ViewHolder, newHolder: RecyclerView.ViewHolder?, - fromX: Int, fromY: Int, toX: Int, toY: Int): Boolean { + override fun animateChange( + oldHolder: RecyclerView.ViewHolder, + newHolder: RecyclerView.ViewHolder?, + fromX: Int, + fromY: Int, + toX: Int, + toY: Int + ): Boolean { if (oldHolder === newHolder) { // Don't know how to run change animations when the same view holder is re-used. // run a move animation to handle position changes. @@ -308,7 +331,8 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { val newView = newHolder?.itemView if (view != null) { val oldViewAnim = view.animate().setDuration( - changeDuration) + changeDuration + ) changeInfo.oldHolder?.let { changeAnimations.add(it) } oldViewAnim.translationX((changeInfo.toX - changeInfo.fromX).toFloat()) oldViewAnim.translationY((changeInfo.toY - changeInfo.fromY).toFloat()) @@ -332,21 +356,21 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { val newViewAnimation = newView.animate() changeInfo.newHolder?.let { changeAnimations.add(it) } newViewAnimation.translationX(0f).translationY(0f).setDuration(changeDuration) - .alpha(1f).setListener(object : AnimatorListenerAdapter() { - override fun onAnimationStart(animator: Animator) { - dispatchChangeStarting(changeInfo.newHolder, false) - } + .alpha(1f).setListener(object : AnimatorListenerAdapter() { + override fun onAnimationStart(animator: Animator) { + dispatchChangeStarting(changeInfo.newHolder, false) + } - override fun onAnimationEnd(animator: Animator) { - newViewAnimation.setListener(null) - newView.alpha = 1f - newView.translationX = 0f - newView.translationY = 0f - dispatchChangeFinished(changeInfo.newHolder, false) - changeInfo.newHolder?.let { changeAnimations.add(it) } - dispatchFinishedWhenDone() - } - }).start() + override fun onAnimationEnd(animator: Animator) { + newViewAnimation.setListener(null) + newView.alpha = 1f + newView.translationX = 0f + newView.translationY = 0f + dispatchChangeFinished(changeInfo.newHolder, false) + changeInfo.newHolder?.let { changeAnimations.add(it) } + dispatchFinishedWhenDone() + } + }).start() } } @@ -465,17 +489,19 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { } override fun isRunning(): Boolean { - return (pendingAdditions.isNotEmpty() - || pendingChanges.isNotEmpty() - || pendingMoves.isNotEmpty() - || pendingRemovals.isNotEmpty() - || moveAnimations.isNotEmpty() - || removeAnimations.isNotEmpty() - || addAnimations.isNotEmpty() - || changeAnimations.isNotEmpty() - || movesList.isNotEmpty() - || additionsList.isNotEmpty() - || changesList.isNotEmpty()) + return ( + pendingAdditions.isNotEmpty() || + pendingChanges.isNotEmpty() || + pendingMoves.isNotEmpty() || + pendingRemovals.isNotEmpty() || + moveAnimations.isNotEmpty() || + removeAnimations.isNotEmpty() || + addAnimations.isNotEmpty() || + changeAnimations.isNotEmpty() || + movesList.isNotEmpty() || + additionsList.isNotEmpty() || + changesList.isNotEmpty() + ) } /** @@ -596,8 +622,10 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { * * */ - override fun canReuseUpdatedViewHolder(viewHolder: RecyclerView.ViewHolder, - payloads: List): Boolean { + override fun canReuseUpdatedViewHolder( + viewHolder: RecyclerView.ViewHolder, + payloads: List + ): Boolean { return payloads.isNotEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads) } @@ -606,4 +634,4 @@ class SafeDefaultItemAnimator : SimpleItemAnimator() { private var sDefaultInterpolator: TimeInterpolator? = null } -} \ No newline at end of file +} 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 0a3ffa987..83960121f 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 @@ -16,12 +16,10 @@ limitations under the License. package com.habitrpg.android.habitica.ui.helpers import android.app.Activity -import android.graphics.Color import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter import android.os.Build import android.view.View -import android.view.ViewTreeObserver.OnGlobalLayoutListener import android.widget.ImageButton import android.widget.TextView import androidx.appcompat.view.menu.ActionMenuItemView @@ -60,15 +58,15 @@ object ToolbarColorHelper { for (i in 0 until toolbar.childCount) { val v = toolbar.getChildAt(i) - //Step 1 : Changing the color of back button (or open drawer button). + // Step 1 : Changing the color of back button (or open drawer button). if (v is ImageButton) { - //Action Bar back button + // Action Bar back button v.drawable.colorFilter = colorFilter } else if (v is ActionMenuView) { for (j in 0 until v.childCount) { - //Step 2: Changing the color of any ActionMenuViews - icons that are not back button, nor text, nor overflow menu icon. - //Colorize the ActionViews -> all icons that are NOT: back button | overflow menu + // Step 2: Changing the color of any ActionMenuViews - icons that are not back button, nor text, nor overflow menu icon. + // Colorize the ActionViews -> all icons that are NOT: back button | overflow menu val innerView = v.getChildAt(j) if (innerView is ActionMenuItemView) { innerView.setTextColor(toolbarIconsColor) @@ -86,11 +84,11 @@ object ToolbarColorHelper { } } - //Step 3: Changing the color of title and subtitle. + // Step 3: Changing the color of title and subtitle. toolbar.setTitleTextColor(toolbarIconsColor) toolbar.setSubtitleTextColor(toolbarIconsColor) - //Step 4: Changing the color of the Overflow Menu icon. + // Step 4: Changing the color of the Overflow Menu icon. setOverflowButtonColor(activity, toolbarIconsColor) } @@ -102,10 +100,12 @@ object ToolbarColorHelper { */ private fun setOverflowButtonColor(activity: Activity, color: Int) { val overflowDescription = activity.getString(R.string.abc_action_menu_overflow_description) - activity.window.decorView .waitForLayout { + activity.window.decorView.waitForLayout { val outViews = ArrayList() - findViewsWithText(outViews, overflowDescription, - View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION) + findViewsWithText( + outViews, overflowDescription, + View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION + ) if (outViews.isEmpty()) { return@waitForLayout } @@ -114,4 +114,4 @@ object ToolbarColorHelper { overflowViewParent.overflowIcon?.setTintMode(PorterDuff.Mode.SRC_ATOP) } } -} \ No newline at end of file +} 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 0ad901c6e..f4e28218c 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 @@ -18,4 +18,4 @@ data class HabiticaDrawerItem(var transitionId: Int, val identifier: String, val var isEnabled: Boolean = true var user: User? = null -} \ No newline at end of file +} 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 a4fec802e..1d9936845 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 @@ -6,4 +6,4 @@ import androidx.recyclerview.widget.RecyclerView abstract class BindableViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { abstract fun bind(data: T, position: Int, displayMode: String) -} \ No newline at end of file +} 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 2c9b79f42..d61825059 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 @@ -5,9 +5,7 @@ import android.content.Context import android.content.res.Resources import android.graphics.drawable.BitmapDrawable import android.text.method.LinkMovementMethod -import android.util.Log import android.view.View -import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R @@ -17,18 +15,17 @@ import com.habitrpg.android.habitica.events.ShowSnackbarEvent import com.habitrpg.android.habitica.extensions.dpToPx import com.habitrpg.android.habitica.extensions.getAgoString import com.habitrpg.android.habitica.extensions.setScaledPadding +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.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.MarkdownParser -import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper -import io.reactivex.rxjava3.core.Maybe -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.schedulers.Schedulers -import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.ui.helpers.setParsedMarkdown +import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar -import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Maybe +import io.reactivex.rxjava3.schedulers.Schedulers import org.greenrobot.eventbus.EventBus open class ChatRecyclerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) @@ -52,7 +49,6 @@ class ChatRecyclerIntroViewHolder(itemView: View, replyToUUID: String) : ChatRec } } - class ChatRecyclerMessageViewHolder(itemView: View, private var userId: String, private val isTavern: Boolean) : ChatRecyclerViewHolder(itemView) { val binding = ChatItemBinding.bind(itemView) @@ -75,7 +71,7 @@ class ChatRecyclerMessageViewHolder(itemView: View, private var userId: String, } binding.tvLikes.setOnClickListener { chatMessage?.let { - if(it.uuid != userId) { + if (it.uuid != userId) { onLikeMessage?.invoke(it) } else { val event = ShowSnackbarEvent() @@ -96,17 +92,25 @@ class ChatRecyclerMessageViewHolder(itemView: View, private var userId: String, chatMessage?.user?.let { onReply?.invoke(it) } } } - binding.replyButton.setCompoundDrawablesWithIntrinsicBounds(BitmapDrawable(res, HabiticaIconsHelper.imageOfChatReplyIcon()), - null, null, null) + binding.replyButton.setCompoundDrawablesWithIntrinsicBounds( + BitmapDrawable(res, HabiticaIconsHelper.imageOfChatReplyIcon()), + null, null, null + ) binding.copyButton.setOnClickListener { chatMessage?.let { onCopyMessage?.invoke(it) } } - binding.copyButton.setCompoundDrawablesWithIntrinsicBounds(BitmapDrawable(res, HabiticaIconsHelper.imageOfChatCopyIcon()), - null, null, null) + binding.copyButton.setCompoundDrawablesWithIntrinsicBounds( + BitmapDrawable(res, HabiticaIconsHelper.imageOfChatCopyIcon()), + null, null, null + ) binding.reportButton.setOnClickListener { chatMessage?.let { onFlagMessage?.invoke(it) } } - binding.reportButton.setCompoundDrawablesWithIntrinsicBounds(BitmapDrawable(res, HabiticaIconsHelper.imageOfChatReportIcon()), - null, null, null) + binding.reportButton.setCompoundDrawablesWithIntrinsicBounds( + BitmapDrawable(res, HabiticaIconsHelper.imageOfChatReportIcon()), + null, null, null + ) binding.deleteButton.setOnClickListener { chatMessage?.let { onDeleteMessage?.invoke(it) } } - binding.deleteButton.setCompoundDrawablesWithIntrinsicBounds(BitmapDrawable(res, HabiticaIconsHelper.imageOfChatDeleteIcon()), - null, null, null) + binding.deleteButton.setCompoundDrawablesWithIntrinsicBounds( + BitmapDrawable(res, HabiticaIconsHelper.imageOfChatDeleteIcon()), + null, null, null + ) } fun bind(msg: ChatMessage, uuid: String, user: User?, isExpanded: Boolean) { @@ -177,13 +181,16 @@ class ChatRecyclerMessageViewHolder(itemView: View, private var userId: String, if (msg.parsedText == null) { binding.messageText.text = chatMessage?.text Maybe.just(chatMessage?.text ?: "") - .map { MarkdownParser.parseMarkdown(it) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ parsedText -> + .map { MarkdownParser.parseMarkdown(it) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { parsedText -> chatMessage?.parsedText = parsedText binding.messageText.setParsedMarkdown(parsedText) - }, { it.printStackTrace() }) + }, + { it.printStackTrace() } + ) } val username = user?.formattedUsername @@ -235,4 +242,4 @@ class ChatRecyclerMessageViewHolder(itemView: View, private var userId: String, private fun shouldShowDelete(): Boolean { return chatMessage?.isSystemMessage != true && (chatMessage?.uuid == userId || user?.contributor?.admin == true || chatMessage?.isInboxMessage == true) } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MemberViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MemberViewHolder.kt index 107f17e0f..9dde3f289 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MemberViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MemberViewHolder.kt @@ -10,7 +10,6 @@ import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper - class GroupMemberViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView.ViewHolder(itemView), PopupMenu.OnMenuItemClickListener { private val binding = PartyMemberBinding.bind(itemView) private var currentUserID: String? = null 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 f665a2cb7..874a4da38 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,14 +8,11 @@ import androidx.core.graphics.drawable.toBitmap import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.MountOverviewItemBinding import com.habitrpg.android.habitica.extensions.inflate -import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.inventory.Mount import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.menu.BottomSheetMenu import com.habitrpg.android.habitica.ui.menu.BottomSheetMenuItem -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.subjects.PublishSubject class MountViewHolder(parent: ViewGroup, private val equipEvents: PublishSubject) : androidx.recyclerview.widget.RecyclerView.ViewHolder(parent.inflate(R.layout.mount_overview_item)), View.OnClickListener { 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 6fb3db579..2c176b612 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 @@ -9,15 +9,12 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.PetDetailItemBinding import com.habitrpg.android.habitica.events.commands.FeedCommand import com.habitrpg.android.habitica.extensions.inflate -import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.inventory.* import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.menu.BottomSheetMenu import com.habitrpg.android.habitica.ui.menu.BottomSheetMenuItem import com.habitrpg.android.habitica.ui.views.dialogs.PetSuggestHatchDialog -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.subjects.PublishSubject import org.greenrobot.eventbus.EventBus @@ -101,7 +98,7 @@ class PetViewHolder(parent: ViewGroup, private val equipEvents: PublishSubject - dialog.configure(it, - ingredients.first, - ingredients.second, - eggCount, - potionCount, - hasUnlockedEgg, - hasUnlockedPotion, - hasMount) + dialog.configure( + it, + ingredients.first, + ingredients.second, + eggCount, + potionCount, + hasUnlockedEgg, + hasUnlockedPotion, + 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 159786335..e0753d359 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 @@ -26,7 +26,7 @@ class SectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { init { itemView.findViewById(R.id.purchaseSetButton)?.visibility = View.GONE - selectionSpinner?.onItemSelectedListener = object: AdapterView.OnItemSelectedListener { + selectionSpinner?.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onNothingSelected(parent: AdapterView<*>?) { spinnerSelectionChanged?.invoke() } @@ -57,16 +57,16 @@ class SectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { } var spinnerAdapter: ArrayAdapter? = null - set(value) { - field = value - selectionSpinner?.adapter = field - selectionSpinner?.visibility = if (value != null) View.VISIBLE else View.GONE - } + set(value) { + field = value + selectionSpinner?.adapter = field + selectionSpinner?.visibility = if (value != null) View.VISIBLE else View.GONE + } var selectedItem: Int = 0 get() = selectionSpinner?.selectedItemPosition ?: 0 - set(value) { - field = value - selectionSpinner?.setSelection(field) - } + set(value) { + field = value + selectionSpinner?.setSelection(field) + } } 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 f8a71269a..2ea926b63 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 @@ -24,10 +24,10 @@ class ShopItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vi var purchaseCardAction: ((ShopItem) -> Unit)? = null var isPinned = false - set(value) { - field = value - binding.pinIndicator.visibility = if (isPinned) View.VISIBLE else View.GONE - } + set(value) { + field = value + binding.pinIndicator.visibility = if (isPinned) View.VISIBLE else View.GONE + } init { itemView.setOnClickListener(this) @@ -59,13 +59,13 @@ class ShopItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vi binding.unlockLabel.visibility = View.VISIBLE } if (numberOwned > 0) { - binding.itemDetailIndicator.text = numberOwned.toString() - binding.itemDetailIndicator.background = if (context.isUsingNightModeResources()) { - BitmapDrawable(context.resources, HabiticaIconsHelper.imageOfItemIndicatorNumberDark(item.isLimited || item.event?.end != null)) - } else { - BitmapDrawable(context.resources, HabiticaIconsHelper.imageOfItemIndicatorNumber(item.isLimited || item.event?.end != null)) - } - binding.itemDetailIndicator.visibility = View.VISIBLE + binding.itemDetailIndicator.text = numberOwned.toString() + binding.itemDetailIndicator.background = if (context.isUsingNightModeResources()) { + BitmapDrawable(context.resources, HabiticaIconsHelper.imageOfItemIndicatorNumberDark(item.isLimited || item.event?.end != null)) + } else { + BitmapDrawable(context.resources, HabiticaIconsHelper.imageOfItemIndicatorNumber(item.isLimited || item.event?.end != null)) + } + binding.itemDetailIndicator.visibility = View.VISIBLE } else if (item.locked) { binding.itemDetailIndicator.background = if (context.isUsingNightModeResources()) { BitmapDrawable(context.resources, HabiticaIconsHelper.imageOfItemIndicatorLockedDark(item.isLimited || item.event?.end != null)) 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 26f479681..c5cf27b57 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 @@ -8,7 +8,6 @@ import android.view.ViewGroup import android.widget.* import androidx.appcompat.widget.AppCompatImageView import androidx.core.content.ContextCompat -import androidx.core.text.TextUtilsCompat import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.dpToPx import com.habitrpg.android.habitica.extensions.getThemeColor @@ -19,8 +18,8 @@ import com.habitrpg.android.habitica.ui.helpers.* import com.habitrpg.android.habitica.ui.viewHolders.BindableViewHolder import com.habitrpg.android.habitica.ui.views.EllipsisTextView import io.noties.markwon.utils.NoCopySpannableFactory -import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.functions.Action import io.reactivex.rxjava3.schedulers.Schedulers import kotlinx.coroutines.Dispatchers @@ -87,11 +86,11 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: titleTextView.setOnClickListener { onTouch(it, null) } notesTextView?.setOnClickListener { onTouch(it, null) } - errorIconView?.setOnClickListener { errorButtonClicked?.run()} + errorIconView?.setOnClickListener { errorButtonClicked?.run() } - //Re enable when we find a way to only react when a link is tapped. - //notesTextView.movementMethod = LinkMovementMethod.getInstance() - //titleTextView.movementMethod = LinkMovementMethod.getInstance() + // Re enable when we find a way to only react when a link is tapped. + // notesTextView.movementMethod = LinkMovementMethod.getInstance() + // titleTextView.movementMethod = LinkMovementMethod.getInstance() expandNotesButton?.setOnClickListener { expandTask() } iconViewChallenge?.setOnClickListener { @@ -134,7 +133,7 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: if (data.notes?.isNotEmpty() == true) { notesTextView?.visibility = View.VISIBLE notesTextView?.setTextColor(ContextCompat.getColor(context, R.color.text_ternary)) - //expandNotesButton.visibility = if (notesTextView.hadEllipses() || notesExpanded) View.VISIBLE else View.GONE + // expandNotesButton.visibility = if (notesTextView.hadEllipses() || notesExpanded) View.VISIBLE else View.GONE } else { notesTextView?.visibility = View.GONE } @@ -147,14 +146,17 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: titleTextView.setSpannableFactory(NoCopySpannableFactory.getInstance()) if (data.text.isNotEmpty()) { Single.just(data.text) - .map { TextUtils.concat(it, "\u200B").toString() } - .map { MarkdownParser.parseMarkdown(it) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ parsedText -> + .map { TextUtils.concat(it, "\u200B").toString() } + .map { MarkdownParser.parseMarkdown(it) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { parsedText -> data.parsedText = parsedText titleTextView.setParsedMarkdown(parsedText) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } if (displayMode != "minimal") { if (data.parsedNotes != null) { @@ -162,19 +164,22 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: } else { notesTextView?.text = data.notes notesTextView?.setSpannableFactory(NoCopySpannableFactory.getInstance()) - data.notes?.let {notes -> + data.notes?.let { notes -> if (notes.isEmpty()) { return@let } Single.just(notes) - .map { TextUtils.concat(it, "\u200B").toString() } - .map { MarkdownParser.parseMarkdown(it) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ parsedNotes -> + .map { TextUtils.concat(it, "\u200B").toString() } + .map { MarkdownParser.parseMarkdown(it) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { parsedNotes -> notesTextView?.text = parsedNotes notesTextView?.setParsedMarkdown(parsedNotes) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } } } else { @@ -215,7 +220,6 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: taskIconWrapper?.visibility = View.GONE } - if (data.isPendingApproval) { approvalRequiredTextView?.visibility = View.VISIBLE } else { @@ -226,7 +230,6 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: errorIconView?.visibility = if (task?.hasErrored == true) View.VISIBLE else View.GONE } - protected open fun configureSpecialTaskTextView(task: Task) { specialTaskTextView?.visibility = View.INVISIBLE calendarIconView?.visibility = View.GONE @@ -257,7 +260,7 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: onRightActionTouched() return true } - } else { + } else { if (motionEvent.y <= (checkboxHolder.height + 5.dpToPx(context))) { if (motionEvent.x <= 72.dpToPx(context)) { onLeftActionTouched() @@ -283,4 +286,4 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: this.openTaskDisabled = openTaskDisabled this.taskActionsDisabled = taskActionsDisabled } -} \ No newline at end of file +} 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 fffd5ed39..d2e643365 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 @@ -16,8 +16,8 @@ import com.habitrpg.android.habitica.models.tasks.ChecklistItem import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.ui.helpers.MarkdownParser import com.habitrpg.android.habitica.ui.helpers.setParsedMarkdown -import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.schedulers.Schedulers abstract class ChecklistedViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Unit), var scoreChecklistItemFunc: ((Task, ChecklistItem) -> Unit), openTaskFunc: ((Task) -> Unit), brokenTaskFunc: ((Task) -> Unit)) : BaseTaskViewHolder(itemView, scoreTaskFunc, openTaskFunc, brokenTaskFunc) { @@ -83,7 +83,7 @@ abstract class ChecklistedViewHolder(itemView: View, scoreTaskFunc: ((Task, Task abstract fun shouldDisplayAsActive(newTask: Task?): Boolean private fun updateChecklistDisplay() { - //This needs to be a LinearLayout, as ListViews can not be inside other ListViews. + // This needs to be a LinearLayout, as ListViews can not be inside other ListViews. if (this.shouldDisplayExpandedChecklist()) { val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater if (this.task?.checklist?.isValid == true) { @@ -94,27 +94,35 @@ abstract class ChecklistedViewHolder(itemView: View, scoreTaskFunc: ((Task, Task if (task?.type == Task.TYPE_TODO) { checkboxBackground?.setBackgroundResource(R.drawable.round_checklist_unchecked) } - checkboxBackground?.backgroundTintList = ContextCompat.getColorStateList(context, (if (context.isUsingNightModeResources()) { - if (task?.completed == true || (task?.type == Task.TYPE_DAILY && task?.isDue == false)) { - R.color.checkbox_fill - } else { - task?.lightTaskColor - } - } else { - R.color.checkbox_fill - }) ?: R.color.checkbox_fill) + checkboxBackground?.backgroundTintList = ContextCompat.getColorStateList( + context, + ( + if (context.isUsingNightModeResources()) { + if (task?.completed == true || (task?.type == Task.TYPE_DAILY && task?.isDue == false)) { + R.color.checkbox_fill + } else { + task?.lightTaskColor + } + } else { + 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 textView?.text = item.text textView?.setTextColor(ContextCompat.getColor(context, if (item.completed) R.color.text_dimmed else R.color.text_secondary)) if (item.text != null) { Observable.just(item.text) - .map { MarkdownParser.parseMarkdown(it) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ + .map { MarkdownParser.parseMarkdown(it) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { textView?.setParsedMarkdown(it) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } val checkmark = itemView?.findViewById(R.id.checkmark) checkmark?.drawable?.setTintMode(PorterDuff.Mode.SRC_ATOP) @@ -123,14 +131,17 @@ abstract class ChecklistedViewHolder(itemView: View, scoreTaskFunc: ((Task, Task checkboxHolder?.setOnClickListener { _ -> task?.let { scoreChecklistItemFunc(it, item) } } - val color = ContextCompat.getColor(context, if (task?.completed == true || (task?.type == Task.TYPE_DAILY && task?.isDue == false)) { - checkmark?.drawable?.setTint(ContextCompat.getColor(context, R.color.text_dimmed)) - R.color.offset_background - } else { - val color = if (context.isUsingNightModeResources()) task?.darkestTaskColor else task?.darkTaskColor - checkmark?.drawable?.setTint(ContextCompat.getColor(context, color ?: R.color.text_dimmed)) - task?.extraLightTaskColor ?: R.color.offset_background - }) + val color = ContextCompat.getColor( + context, + if (task?.completed == true || (task?.type == Task.TYPE_DAILY && task?.isDue == false)) { + checkmark?.drawable?.setTint(ContextCompat.getColor(context, R.color.text_dimmed)) + R.color.offset_background + } else { + val color = if (context.isUsingNightModeResources()) task?.darkestTaskColor 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) } 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 fb6160e3b..3fad51806 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 @@ -39,7 +39,7 @@ class DailyViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> U reminderString += formatter.format(nextReminder.time) } if ((data.reminders?.size ?: 0) > 1) { - reminderString = "$reminderString (+${(data.reminders?.size ?: 0)-1})" + reminderString = "$reminderString (+${(data.reminders?.size ?: 0) - 1})" } reminderTextView.text = reminderString } 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 530036f51..c05d92bd9 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 @@ -1,18 +1,14 @@ package com.habitrpg.android.habitica.ui.viewHolders.tasks -import android.graphics.Color import android.graphics.PorterDuff -import android.graphics.drawable.BitmapDrawable import android.view.View import android.widget.Button import android.widget.FrameLayout import android.widget.ImageView import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.android.habitica.models.responses.TaskDirection import com.habitrpg.android.habitica.models.tasks.Task -import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper class HabitViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Unit), openTaskFunc: ((Task) -> Unit), brokenTaskFunc: ((Task) -> Unit)) : BaseTaskViewHolder(itemView, scoreTaskFunc, openTaskFunc, brokenTaskFunc) { @@ -107,7 +103,6 @@ class HabitViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> U this.btnMinus.isClickable = false } - var streakString = "" if (data.counterUp != null && data.counterUp ?: 0 > 0 && data.counterDown != null && data.counterDown ?: 0 > 0) { streakString = streakString + "+" + data.counterUp.toString() + " | -" + data.counterDown?.toString() 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 c6ba11ca4..a915d8633 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 @@ -3,9 +3,7 @@ package com.habitrpg.android.habitica.ui.viewHolders.tasks import android.view.View import com.habitrpg.android.habitica.models.responses.TaskDirection import com.habitrpg.android.habitica.models.tasks.ChecklistItem - import com.habitrpg.android.habitica.models.tasks.Task - import java.text.DateFormat class TodoViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Unit), scoreChecklistItemFunc: ((Task, ChecklistItem) -> Unit), openTaskFunc: ((Task) -> Unit), brokenTaskFunc: ((Task) -> Unit)) : ChecklistedViewHolder(itemView, scoreTaskFunc, scoreChecklistItemFunc, openTaskFunc, brokenTaskFunc) { 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 dcfbd4ec5..87933102d 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 @@ -12,7 +12,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.CompositeDisposable import javax.inject.Inject -abstract class BaseViewModel: ViewModel() { +abstract class BaseViewModel : ViewModel() { @Inject lateinit var userRepository: UserRepository 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 81df3f1cc..881ff802c 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 @@ -17,9 +17,9 @@ import com.habitrpg.android.habitica.models.notifications.NewChatMessageData import com.habitrpg.android.habitica.models.social.Challenge import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.social.Group +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.subjects.BehaviorSubject import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -76,113 +76,149 @@ open class GroupViewModel : BaseViewModel() { if (groupID == groupIDSubject.value?.value) return groupIDSubject.onNext(groupID.asOptional()) - disposable.add(notificationsManager.getNotifications().firstElement().map { it.filter { notification -> - val data = notification.data as? NewChatMessageData - data?.group?.id == groupID - } } + disposable.add( + notificationsManager.getNotifications().firstElement().map { + it.filter { notification -> + val data = notification.data as? NewChatMessageData + data?.group?.id == groupID + } + } .filter { it.isNotEmpty() } .flatMapPublisher { userRepository.readNotification(it.first().id) } - .subscribe({ - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + }, + RxErrorHandler.handleEmptyError() + ) + ) } val groupID: String? - get() = groupIDSubject.value?.value + get() = groupIDSubject.value?.value val isMember: Boolean - get() = isMemberData.value ?: false + get() = isMemberData.value ?: false val leaderID: String? - get() = group.value?.leaderID + get() = group.value?.leaderID fun getGroupData(): LiveData = group fun getLeaderData(): LiveData = leader fun getIsMemberData(): LiveData = isMemberData private fun loadGroupFromLocal() { - disposable.add(groupIDFlowable + disposable.add( + groupIDFlowable .filterOptionalDoOnEmpty { group.value = null } .flatMap { socialRepository.getGroup(it) } .map { socialRepository.getUnmanagedCopy(it) } .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ group.value = it }, RxErrorHandler.handleEmptyError())) + .subscribe({ group.value = it }, RxErrorHandler.handleEmptyError()) + ) } private fun loadLeaderFromLocal() { - disposable.add(groupIDFlowable + disposable.add( + groupIDFlowable .filterOptionalDoOnEmpty { leader.value = null } .flatMap { socialRepository.getGroup(it) } .distinctUntilChanged { group1, group2 -> group1.id == group2.id } .flatMap { socialRepository.getMember(it.leaderID) } .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ leader.value = it }, RxErrorHandler.handleEmptyError())) + .subscribe({ leader.value = it }, RxErrorHandler.handleEmptyError()) + ) } private fun loadMembershipFromLocal() { - disposable.add(groupIDFlowable + disposable.add( + groupIDFlowable .filterOptionalDoOnEmpty { isMemberData.value = null } .flatMap { socialRepository.getGroupMemberships() } .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - isMemberData.value = it.firstOrNull { membership -> membership.groupID == groupID } != null - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + isMemberData.value = it.firstOrNull { membership -> membership.groupID == groupID } != null + }, + RxErrorHandler.handleEmptyError() + ) + ) } fun getChatMessages(): Flowable> { return groupIDFlowable - .filterMapEmpty() - .flatMap { socialRepository.getGroupChat(it) } + .filterMapEmpty() + .flatMap { socialRepository.getGroupChat(it) } } fun retrieveGroup(function: (() -> Unit)?) { if (groupID?.isNotEmpty() == true) { - disposable.add(socialRepository.retrieveGroup(groupID ?: "") + disposable.add( + socialRepository.retrieveGroup(groupID ?: "") .filter { groupViewType == GroupViewType.PARTY } .flatMap { group1 -> socialRepository.retrieveGroupMembers(group1.id, true) } .doOnComplete { function?.invoke() } - .subscribe({ }, RxErrorHandler.handleEmptyError())) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } } fun inviteToGroup(inviteData: HashMap) { - disposable.add(socialRepository.inviteToGroup(group.value?.id ?: "", inviteData) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + disposable.add( + socialRepository.inviteToGroup(group.value?.id ?: "", inviteData) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } fun updateOrCreateGroup(bundle: Bundle?) { if (group.value == null) { - socialRepository.createGroup(bundle?.getString("name"), - bundle?.getString("description"), - bundle?.getString("leader"), - bundle?.getString("groupType"), - bundle?.getString("privacy"), - bundle?.getBoolean("leaderCreateChallenge")) + socialRepository.createGroup( + bundle?.getString("name"), + bundle?.getString("description"), + bundle?.getString("leader"), + bundle?.getString("groupType"), + bundle?.getString("privacy"), + bundle?.getBoolean("leaderCreateChallenge") + ) } else { - disposable.add(socialRepository.updateGroup(group.value, bundle?.getString("name"), + disposable.add( + socialRepository.updateGroup( + group.value, bundle?.getString("name"), bundle?.getString("description"), bundle?.getString("leader"), - bundle?.getBoolean("leaderCreateChallenge")) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + bundle?.getBoolean("leaderCreateChallenge") + ) + .subscribe({ }, RxErrorHandler.handleEmptyError()) + ) } } fun leaveGroup(groupChallenges: List, keepChallenges: Boolean = true, function: (() -> Unit)? = null) { - if(!keepChallenges) { + if (!keepChallenges) { for (challenge in groupChallenges) { challengeRepository.leaveChallenge(challenge, "remove-all").subscribe({}, RxErrorHandler.handleEmptyError()) } } - disposable.add(socialRepository.leaveGroup(this.group.value?.id ?: "", keepChallenges) + disposable.add( + socialRepository.leaveGroup(this.group.value?.id ?: "", keepChallenges) .flatMap { userRepository.retrieveUser(withTasks = false, forced = true) } - .subscribe({ - function?.invoke() - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + function?.invoke() + }, + RxErrorHandler.handleEmptyError() + ) + ) } fun joinGroup(id: String? = null, function: (() -> Unit)? = null) { - disposable.add(socialRepository.joinGroup(id ?: groupID).subscribe({ - function?.invoke() - }, RxErrorHandler.handleEmptyError())) + disposable.add( + socialRepository.joinGroup(id ?: groupID).subscribe( + { + function?.invoke() + }, + RxErrorHandler.handleEmptyError() + ) + ) } fun rejectGroupInvite(id: String? = null) { @@ -209,12 +245,15 @@ open class GroupViewModel : BaseViewModel() { fun postGroupChat(chatText: String, onComplete: () -> Unit, onError: () -> Unit) { groupIDSubject.value?.value?.let { - socialRepository.postGroupChat(it, chatText).subscribe({ - onComplete() - }, { error -> - RxErrorHandler.reportError(error) - onError() - }) + socialRepository.postGroupChat(it, chatText).subscribe( + { + onComplete() + }, + { error -> + RxErrorHandler.reportError(error) + onError() + } + ) } } @@ -224,20 +263,29 @@ open class GroupViewModel : BaseViewModel() { onComplete() return } - disposable.add(socialRepository.retrieveGroupChat(groupID) + disposable.add( + socialRepository.retrieveGroupChat(groupID) .delay(500, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - onComplete() - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + onComplete() + }, + RxErrorHandler.handleEmptyError() + ) + ) } fun updateGroup(bundle: Bundle?) { - disposable.add(socialRepository.updateGroup(group.value, + disposable.add( + socialRepository.updateGroup( + group.value, bundle?.getString("name"), bundle?.getString("description"), bundle?.getString("leader"), - bundle?.getBoolean("leaderOnlyChallenges")) - .subscribe({}, RxErrorHandler.handleEmptyError())) + bundle?.getBoolean("leaderOnlyChallenges") + ) + .subscribe({}, RxErrorHandler.handleEmptyError()) + ) } -} \ No newline at end of file +} 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 edb8f9ad4..9fea82048 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 @@ -16,9 +16,9 @@ import com.habitrpg.android.habitica.extensions.filterOptionalDoOnEmpty import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.social.ChatMessage +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.subjects.BehaviorSubject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope @@ -26,15 +26,14 @@ import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.math.ceil - class InboxViewModel(recipientID: String?, recipientUsername: String?) : BaseViewModel() { @Inject lateinit var socialRepository: SocialRepository private val config = PagedList.Config.Builder() - .setPageSize(10) - .setEnablePlaceholders(false) - .build() + .setPageSize(10) + .setEnablePlaceholders(false) + .build() val dataSourceFactory = MessagesDataSourceFactory(socialRepository, recipientID, ChatMessage()) val messages: LiveData> = dataSourceFactory.toLiveData(config) @@ -44,11 +43,13 @@ class InboxViewModel(recipientID: String?, recipientUsername: String?) : BaseVie fun getMemberData(): LiveData = member private fun loadMemberFromLocal() { - disposable.add(memberIDFlowable + disposable.add( + memberIDFlowable .filterOptionalDoOnEmpty { member.value = null } .flatMap { socialRepository.getMember(it) } .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ member.value = it }, RxErrorHandler.handleEmptyError())) + .subscribe({ member.value = it }, RxErrorHandler.handleEmptyError()) + ) } protected var memberIDSubject = BehaviorSubject.create>() @@ -75,18 +76,21 @@ class InboxViewModel(recipientID: String?, recipientUsername: String?) : BaseVie setMemberID(recipientID) loadMemberFromLocal() } else if (recipientUsername?.isNotBlank() == true) { - socialRepository.getMemberWithUsername(recipientUsername).subscribe({ - setMemberID(it.id ?: "") - member.value = it - dataSourceFactory.updateRecipientID(memberIDSubject.value?.value) - invalidateDataSource() - }, RxErrorHandler.handleEmptyError()) + socialRepository.getMemberWithUsername(recipientUsername).subscribe( + { + setMemberID(it.id ?: "") + member.value = it + dataSourceFactory.updateRecipientID(memberIDSubject.value?.value) + invalidateDataSource() + }, + RxErrorHandler.handleEmptyError() + ) } } } -class MessagesDataSource(val socialRepository: SocialRepository, var recipientID: String?, var footer : ChatMessage?): - PositionalDataSource() { +class MessagesDataSource(val socialRepository: SocialRepository, var recipientID: String?, var footer: ChatMessage?) : + PositionalDataSource() { private var lastFetchWasEnd = false override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback) { if (lastFetchWasEnd) { @@ -97,14 +101,16 @@ class MessagesDataSource(val socialRepository: SocialRepository, var recipientID if (recipientID?.isNotBlank() != true) { return@launch } val page = ceil(params.startPosition.toFloat() / params.loadSize.toFloat()).toInt() socialRepository.retrieveInboxMessages(recipientID ?: "", page) - .subscribe( { + .subscribe( + { if (it.size < 10) { lastFetchWasEnd = true callback.onResult(it) - } - else + } else callback.onResult(it) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } } @@ -112,33 +118,36 @@ class MessagesDataSource(val socialRepository: SocialRepository, var recipientID lastFetchWasEnd = false GlobalScope.launch(Dispatchers.Main.immediate) { socialRepository.getInboxMessages(recipientID) - .map { socialRepository.getUnmanagedCopy(it) } - .firstElement() - .flatMapPublisher { - if (it.isEmpty()) { - if (recipientID?.isNotBlank() != true) { return@flatMapPublisher Flowable.just(it) } - socialRepository.retrieveInboxMessages(recipientID ?: "", 0) - .doOnNext { messages -> - if (messages.size < 10) { - lastFetchWasEnd = true - } - } - } else { - Flowable.just(it) - } + .map { socialRepository.getUnmanagedCopy(it) } + .firstElement() + .flatMapPublisher { + if (it.isEmpty()) { + if (recipientID?.isNotBlank() != true) { return@flatMapPublisher Flowable.just(it) } + socialRepository.retrieveInboxMessages(recipientID ?: "", 0) + .doOnNext { messages -> + if (messages.size < 10) { + lastFetchWasEnd = true + } + } + } else { + Flowable.just(it) } - .subscribe( { + } + .subscribe( + { if (it.size < 10 && footer != null) callback.onResult(it.plusElement(footer!!), 0) else callback.onResult(it, 0) - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } } } -class MessagesDataSourceFactory(val socialRepository: SocialRepository, var recipientID: String?, val footer : ChatMessage?) : - DataSource.Factory() { +class MessagesDataSourceFactory(val socialRepository: SocialRepository, var recipientID: String?, val footer: ChatMessage?) : + DataSource.Factory() { val sourceLiveData = MutableLiveData() var latestSource: MessagesDataSource = MessagesDataSource(socialRepository, recipientID, footer) @@ -159,4 +168,4 @@ class InboxViewModelFactory(private val recipientID: String?, private val recipi override fun create(modelClass: Class): T { return InboxViewModel(recipientID, recipientUsername) as T } -} \ No newline at end of file +} 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 f155c96a9..37cbd2372 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 @@ -12,9 +12,9 @@ import com.habitrpg.android.habitica.models.Notification import com.habitrpg.android.habitica.models.notifications.* import com.habitrpg.android.habitica.models.social.UserParty import com.habitrpg.android.habitica.models.user.User +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.functions.BiFunction import io.reactivex.rxjava3.subjects.BehaviorSubject import java.util.* @@ -28,18 +28,18 @@ open class NotificationsViewModel : BaseViewModel() { lateinit var socialRepository: SocialRepository 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.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 ) private val actionableNotificationTypes = listOf( - Notification.Type.GUILD_INVITATION.type, - Notification.Type.PARTY_INVITATION.type, - Notification.Type.QUEST_INVITATION.type + Notification.Type.GUILD_INVITATION.type, + Notification.Type.PARTY_INVITATION.type, + Notification.Type.QUEST_INVITATION.type ) private var party: UserParty? = null @@ -53,63 +53,67 @@ open class NotificationsViewModel : BaseViewModel() { init { customNotifications.onNext(emptyList()) - disposable.add(userRepository.getUser() - .subscribe({ - party = it.party - var notifications = convertInvitationsToNotifications(it) - if (it.flags?.newStuff == true) { - val notification = Notification() - notification.id = "new-stuff-notification" - notification.type = Notification.Type.NEW_STUFF.type - val data = NewStuffData() - notification.data = data - notifications.add(notification) - } - customNotifications.onNext(notifications) - }, RxErrorHandler.handleEmptyError())) + disposable.add( + userRepository.getUser() + .subscribe( + { + party = it.party + var notifications = convertInvitationsToNotifications(it) + if (it.flags?.newStuff == true) { + val notification = Notification() + notification.id = "new-stuff-notification" + notification.type = Notification.Type.NEW_STUFF.type + val data = NewStuffData() + notification.data = data + notifications.add(notification) + } + customNotifications.onNext(notifications) + }, + RxErrorHandler.handleEmptyError() + ) + ) } - fun getNotifications(): Flowable> { val serverNotifications = notificationsManager.getNotifications() - .map { filterSupportedTypes(it) } + .map { filterSupportedTypes(it) } return Flowable.combineLatest( - serverNotifications, - customNotifications.toFlowable(BackpressureStrategy.LATEST), - BiFunction, List, List> { - serverNotificationsList, customNotificationsList -> - if (serverNotificationsList.firstOrNull { notification -> notification.type == Notification.Type.NEW_STUFF.type } != null) { - return@BiFunction serverNotificationsList + customNotificationsList.filter { notification -> notification.type != Notification.Type.NEW_STUFF.type } - } - return@BiFunction serverNotificationsList + customNotificationsList + serverNotifications, + customNotifications.toFlowable(BackpressureStrategy.LATEST), + BiFunction, List, List> { + serverNotificationsList, customNotificationsList -> + if (serverNotificationsList.firstOrNull { notification -> notification.type == Notification.Type.NEW_STUFF.type } != null) { + return@BiFunction serverNotificationsList + customNotificationsList.filter { notification -> notification.type != Notification.Type.NEW_STUFF.type } } + return@BiFunction serverNotificationsList + customNotificationsList + } ) - .map { it.sortedBy { notification -> notification.priority } } - .observeOn(AndroidSchedulers.mainThread()) + .map { it.sortedBy { notification -> notification.priority } } + .observeOn(AndroidSchedulers.mainThread()) } fun getNotificationCount(): Flowable { return getNotifications() - .map { it.count() } - .distinctUntilChanged() + .map { it.count() } + .distinctUntilChanged() } fun allNotificationsSeen(): Flowable { return getNotifications() - .map { it.all { notification -> notification.seen != false } } - .distinctUntilChanged() + .map { it.all { notification -> notification.seen != false } } + .distinctUntilChanged() } fun getHasPartyNotification(): Flowable { return getNotifications() - .map { - it.find { notification -> - val data = notification.data as? NewChatMessageData - isPartyMessage(data) - } != null - } - .distinctUntilChanged() + .map { + it.find { notification -> + val data = notification.data as? NewChatMessageData + isPartyMessage(data) + } != null + } + .distinctUntilChanged() } fun refreshNotifications(): Flowable<*> { @@ -123,25 +127,29 @@ open class NotificationsViewModel : BaseViewModel() { 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 = it - notification.data = data - notification - } ?: emptyList()) + 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 = it + 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 = it - 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 = it + notification.data = data + notification + } ?: emptyList() + ) val quest = user.party?.quest if (quest != null && quest.RSVPNeeded) { @@ -179,15 +187,17 @@ open class NotificationsViewModel : BaseViewModel() { return } - disposable.add(userRepository.readNotification(notification.id) - .subscribe({}, RxErrorHandler.handleEmptyError())) + disposable.add( + userRepository.readNotification(notification.id) + .subscribe({}, RxErrorHandler.handleEmptyError()) + ) } fun dismissAllNotifications(notifications: List) { val dismissableIds = notifications - .filter { !isCustomNotification(it) } - .filter { !actionableNotificationTypes.contains(it.type) } - .map { it.id } + .filter { !isCustomNotification(it) } + .filter { !actionableNotificationTypes.contains(it.type) } + .map { it.id } if (dismissableIds.isEmpty()) { return @@ -196,15 +206,17 @@ open class NotificationsViewModel : BaseViewModel() { val notificationIds = HashMap>() notificationIds["notificationIds"] = dismissableIds - disposable.add(userRepository.readNotifications(notificationIds) - .subscribe({}, RxErrorHandler.handleEmptyError())) + disposable.add( + userRepository.readNotifications(notificationIds) + .subscribe({}, RxErrorHandler.handleEmptyError()) + ) } fun markNotificationsAsSeen(notifications: List) { val unseenIds = notifications - .filter { !isCustomNotification(it) } - .filter { it.seen == false } - .map { it.id } + .filter { !isCustomNotification(it) } + .filter { it.seen == false } + .map { it.id } if (unseenIds.isEmpty()) { return @@ -213,8 +225,10 @@ open class NotificationsViewModel : BaseViewModel() { val notificationIds = HashMap>() notificationIds["notificationIds"] = unseenIds - disposable.add(userRepository.seeNotifications(notificationIds) - .subscribe({}, RxErrorHandler.handleEmptyError())) + disposable.add( + userRepository.seeNotifications(notificationIds) + .subscribe({}, RxErrorHandler.handleEmptyError()) + ) } private fun findNotification(id: String): Notification? { @@ -312,41 +326,61 @@ open class NotificationsViewModel : BaseViewModel() { private fun acceptGroupInvitation(groupId: String?) { groupId?.let { - disposable.add(socialRepository.joinGroup(it) + disposable.add( + socialRepository.joinGroup(it) .flatMap { userRepository.retrieveUser(false, forced = true) } - .subscribe({ - refreshNotifications() - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + refreshNotifications() + }, + RxErrorHandler.handleEmptyError() + ) + ) } } fun rejectGroupInvite(groupId: String?) { groupId?.let { - disposable.add(socialRepository.rejectGroupInvite(it) + disposable.add( + socialRepository.rejectGroupInvite(it) .flatMap { userRepository.retrieveUser(false, forced = true) } - .subscribe({ - refreshNotifications() - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + refreshNotifications() + }, + RxErrorHandler.handleEmptyError() + ) + ) } } private fun acceptQuestInvitation() { party?.id?.let { - disposable.add(socialRepository.acceptQuest(null, it) + disposable.add( + socialRepository.acceptQuest(null, it) .flatMap { userRepository.retrieveUser(false, forced = true) } - .subscribe({ - refreshNotifications() - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + refreshNotifications() + }, + RxErrorHandler.handleEmptyError() + ) + ) } } private fun rejectQuestInvitation() { party?.id?.let { - disposable.add(socialRepository.rejectQuest(null, it) + disposable.add( + socialRepository.rejectQuest(null, it) .flatMap { userRepository.retrieveUser(false, forced = true) } - .subscribe({ - refreshNotifications() - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + refreshNotifications() + }, + RxErrorHandler.handleEmptyError() + ) + ) } } 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 d121b72a0..d7dcb6b86 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 @@ -8,18 +8,20 @@ import com.habitrpg.android.habitica.extensions.filterOptionalDoOnEmpty import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar -import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.BackpressureStrategy import org.greenrobot.eventbus.EventBus -class PartyViewModel: GroupViewModel() { +class PartyViewModel : GroupViewModel() { internal val isQuestActive: Boolean get() = getGroupData().value?.quest?.active == true internal val isUserOnQuest: Boolean - get() = !(getGroupData().value?.quest?.members?.none { it.key == getUserData().value?.id } - ?: true) + get() = !( + getGroupData().value?.quest?.members?.none { it.key == getUserData().value?.id } + ?: true + ) private val members: MutableLiveData?> by lazy { MutableLiveData?>() @@ -37,38 +39,50 @@ class PartyViewModel: GroupViewModel() { fun getMembersData(): LiveData?> = members private fun loadMembersFromLocal() { - disposable.add(groupIDSubject.toFlowable(BackpressureStrategy.LATEST) + disposable.add( + groupIDSubject.toFlowable(BackpressureStrategy.LATEST) .filterOptionalDoOnEmpty { members.value = null } .flatMap { socialRepository.getGroupMembers(it) } .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ members.value = it }, RxErrorHandler.handleEmptyError())) + .subscribe({ members.value = it }, RxErrorHandler.handleEmptyError()) + ) } fun acceptQuest() { groupIDSubject.value?.value?.let { groupID -> - disposable.add(socialRepository.acceptQuest(null, groupID) + disposable.add( + socialRepository.acceptQuest(null, groupID) .flatMap { userRepository.retrieveUser() } .flatMap { socialRepository.retrieveGroup(groupID) } - .subscribe({ - val event = ShowSnackbarEvent() - event.type = HabiticaSnackbar.SnackbarDisplayType.SUCCESS - event.text = "Quest invitation accepted" - EventBus.getDefault().post(event) - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + val event = ShowSnackbarEvent() + event.type = HabiticaSnackbar.SnackbarDisplayType.SUCCESS + event.text = "Quest invitation accepted" + EventBus.getDefault().post(event) + }, + RxErrorHandler.handleEmptyError() + ) + ) } } fun rejectQuest() { groupIDSubject.value?.value?.let { groupID -> - disposable.add(socialRepository.rejectQuest(null, groupID) + disposable.add( + socialRepository.rejectQuest(null, groupID) .flatMap { userRepository.retrieveUser() } .flatMap { socialRepository.retrieveGroup(groupID) } - .subscribe({ - val event = ShowSnackbarEvent() - event.type = HabiticaSnackbar.SnackbarDisplayType.FAILURE - event.text = "Quest invitation rejected" - EventBus.getDefault().post(event) - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { + val event = ShowSnackbarEvent() + event.type = HabiticaSnackbar.SnackbarDisplayType.FAILURE + event.text = "Quest invitation rejected" + EventBus.getDefault().post(event) + }, + RxErrorHandler.handleEmptyError() + ) + ) } } @@ -78,11 +92,16 @@ class PartyViewModel: GroupViewModel() { } fun loadPartyID() { - disposable.add(userRepository.getUser() + disposable.add( + userRepository.getUser() .map { it.party?.id ?: "" } .distinctUntilChanged() - .subscribe({ groupID -> - setGroupID(groupID) - }, RxErrorHandler.handleEmptyError())) + .subscribe( + { groupID -> + setGroupID(groupID) + }, + RxErrorHandler.handleEmptyError() + ) + ) } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AdventureGuideDrawerArrowDrawable.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AdventureGuideDrawerArrowDrawable.kt index 380395c93..ae695f8b7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AdventureGuideDrawerArrowDrawable.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AdventureGuideDrawerArrowDrawable.kt @@ -6,7 +6,6 @@ import androidx.appcompat.graphics.drawable.DrawerArrowDrawable import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R - class AdventureGuideDrawerArrowDrawable(context: Context?) : DrawerArrowDrawable(context) { private val backgroundPaint: Paint = Paint() private val icon: Bitmap = BitmapFactory.decodeResource(context?.resources, R.drawable.star) @@ -44,4 +43,4 @@ class AdventureGuideDrawerArrowDrawable(context: Context?) : DrawerArrowDrawable context?.let { backgroundPaint.color = ContextCompat.getColor(it, R.color.yellow_10) } backgroundPaint.isAntiAlias = true } -} \ No newline at end of file +} 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 a9098c66c..eb4acf799 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 @@ -16,63 +16,63 @@ import com.habitrpg.android.habitica.extensions.layoutInflater class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : LinearLayout(context, attrs) { val infoIconView: ImageView - get() = binding.infoIconView + get() = binding.infoIconView private val binding = ViewCollapsibleSectionBinding.inflate(context.layoutInflater, this) private var preferences: SharedPreferences? = null private val padding = context.resources?.getDimension(R.dimen.spacing_large)?.toInt() ?: 0 private val bottomPadding = context.resources?.getDimension(R.dimen.collapsible_section_padding)?.toInt() ?: 0 var title: CharSequence - get() { - return binding.titleTextView.text - } - set(value) { - binding.titleTextView.text = value - } + get() { + return binding.titleTextView.text + } + set(value) { + binding.titleTextView.text = value + } private var isCollapsed = false - set(value) { - field = value - if (value) { - hideViews() - } else { - showViews() + set(value) { + field = value + if (value) { + hideViews() + } else { + showViews() + } } - } var caretColor: Int = 0 - set(value) { - field = value - setCaretImage() - } + set(value) { + field = value + setCaretImage() + } var identifier: String? = null var separatorColor: Int - get() { - return (binding.separator.background as? ColorDrawable)?.color ?: 0 - } - set(value) { - binding.separator.setBackgroundColor(value) - } + get() { + return (binding.separator.background as? ColorDrawable)?.color ?: 0 + } + set(value) { + binding.separator.setBackgroundColor(value) + } private fun showViews() { updatePreferences() setCaretImage() (0 until childCount) - .map { getChildAt(it) } - .forEach { it.visibility = View.VISIBLE } + .map { getChildAt(it) } + .forEach { it.visibility = View.VISIBLE } } private fun hideViews() { updatePreferences() setCaretImage() (2 until childCount) - .map { getChildAt(it) } - .filter { it != binding.sectionTitleView } - .forEach { - it.visibility = View.GONE - } + .map { getChildAt(it) } + .filter { it != binding.sectionTitleView } + .forEach { + it.visibility = View.GONE + } } private fun updatePreferences() { @@ -88,13 +88,13 @@ class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : LinearLay private fun setChildMargins() { (2 until childCount) - .map { getChildAt(it) } - .filter { it != binding.sectionTitleView } - .forEach { - val lp = it.layoutParams as? LayoutParams - lp?.setMargins(padding, 0, padding, bottomPadding) - it.layoutParams = lp - } + .map { getChildAt(it) } + .filter { it != binding.sectionTitleView } + .forEach { + val lp = it.layoutParams as? LayoutParams + lp?.setMargins(padding, 0, padding, bottomPadding) + it.layoutParams = lp + } } override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { @@ -109,13 +109,13 @@ class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : LinearLay measureChildWithMargins(binding.sectionTitleView, widthMeasureSpec, 0, heightMeasureSpec, height) height += binding.sectionTitleView.measuredHeight (2 until childCount) - .map { getChildAt(it) } - .forEach { - if (it.visibility != View.GONE) { - measureChildWithMargins(it, widthMeasureSpec, 0, heightMeasureSpec, height) - height += it.measuredHeight + bottomPadding - } + .map { getChildAt(it) } + .forEach { + if (it.visibility != View.GONE) { + measureChildWithMargins(it, widthMeasureSpec, 0, heightMeasureSpec, height) + height += it.measuredHeight + bottomPadding } + } if (!isCollapsed) { height += padding } @@ -129,9 +129,10 @@ class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : LinearLay isCollapsed = !isCollapsed } val attributes = context.theme?.obtainStyledAttributes( - attrs, - R.styleable.CollapsibleSectionView, - 0, 0) + attrs, + R.styleable.CollapsibleSectionView, + 0, 0 + ) title = attributes?.getString(R.styleable.CollapsibleSectionView_title) ?: "" identifier = attributes?.getString(R.styleable.CollapsibleSectionView_identifier) @@ -161,4 +162,4 @@ class CollapsibleSectionView(context: Context, attrs: AttributeSet?) : LinearLay fun setCaretOffset(offset: Int) { binding.caretView.setPadding(0, 0, offset, 0) } -} \ No newline at end of file +} 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 5517ccf79..a39781901 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 @@ -30,9 +30,10 @@ class CurrencyView : androidx.appcompat.widget.AppCompatTextView { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { val attributes = context.theme?.obtainStyledAttributes( - attrs, - R.styleable.CurrencyViews, - 0, 0) + attrs, + R.styleable.CurrencyViews, + 0, 0 + ) val fallBackLight = !context.isUsingNightModeResources() lightBackground = try { attributes?.getBoolean(R.styleable.CurrencyView_hasLightBackground, fallBackLight) ?: fallBackLight @@ -87,39 +88,43 @@ class CurrencyView : androidx.appcompat.widget.AppCompatTextView { private var drawable: BitmapDrawable? = null var icon: Bitmap? = null - set(value) { - field = value - if (value != null) { - drawable = BitmapDrawable(resources, value) - this.setCompoundDrawablesWithIntrinsicBounds(drawable, - null, null, null) - val padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, - 6f, context.resources.displayMetrics).toInt() - compoundDrawablePadding = padding - this.gravity = Gravity.CENTER_VERTICAL + set(value) { + field = value + if (value != null) { + drawable = BitmapDrawable(resources, value) + this.setCompoundDrawablesWithIntrinsicBounds( + drawable, + null, null, null + ) + val padding = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + 6f, context.resources.displayMetrics + ).toInt() + compoundDrawablePadding = padding + this.gravity = Gravity.CENTER_VERTICAL + } } - } var value = 0.0 - set(value) { - field = value - val abbreviatedValue = NumberAbbreviator.abbreviate(context, value) - text = abbreviatedValue - contentDescription = "$abbreviatedValue $currencyContentDescription" - updateVisibility() - } + set(value) { + field = value + val abbreviatedValue = NumberAbbreviator.abbreviate(context, value) + text = abbreviatedValue + contentDescription = "$abbreviatedValue $currencyContentDescription" + updateVisibility() + } var isLocked = false - set(value) { - field = value - if (isLocked) { - this.setTextColor(ContextCompat.getColor(context, R.color.text_quad)) - drawable?.alpha = 127 - } else { - drawable?.alpha = 255 + set(value) { + field = value + if (isLocked) { + this.setTextColor(ContextCompat.getColor(context, R.color.text_quad)) + drawable?.alpha = 127 + } else { + drawable?.alpha = 255 + } + this.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) } - this.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) - } private fun updateVisibility() { visibility = if (hideWhenEmpty) { 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 c2b70fcc9..8eaa8bc02 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 @@ -9,12 +9,12 @@ import com.habitrpg.android.habitica.extensions.isUsingNightModeResources class CurrencyViews : LinearLayout { var lightBackground: Boolean = false - set(value) { - field = value - hourglassTextView.lightBackground = value - gemTextView.lightBackground = value - goldTextView.lightBackground = value - } + set(value) { + field = value + hourglassTextView.lightBackground = value + gemTextView.lightBackground = value + goldTextView.lightBackground = value + } private val hourglassTextView: CurrencyView = CurrencyView(context, "hourglasses", lightBackground) private val goldTextView: CurrencyView = CurrencyView(context, "gold", lightBackground) private val gemTextView: CurrencyView = CurrencyView(context, "gems", lightBackground) @@ -42,12 +42,12 @@ class CurrencyViews : LinearLayout { get() = gemTextView.visibility set(value) { gemTextView.visibility = value } - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { val attributes = context?.theme?.obtainStyledAttributes( - attrs, - R.styleable.CurrencyViews, - 0, 0) + attrs, + R.styleable.CurrencyViews, + 0, 0 + ) setupViews() val fallBackLight = context?.isUsingNightModeResources() != true lightBackground = attributes?.getBoolean(R.styleable.CurrencyViews_hasLightBackground, fallBackLight) ?: fallBackLight 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 ac487cdb6..a18106831 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 @@ -7,16 +7,16 @@ import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.isUsingNightModeResources - class DayNightTextView(context: Context, attrs: AttributeSet?) : AppCompatTextView(context, attrs) { init { val attributes = context.theme?.obtainStyledAttributes(attrs, R.styleable.DayNightTextView, 0, 0) - setTextColor(if (context.isUsingNightModeResources()) { - attributes?.getColor(R.styleable.DayNightTextView_nightTextColor, 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)) + setTextColor( + if (context.isUsingNightModeResources()) { + attributes?.getColor(R.styleable.DayNightTextView_nightTextColor, 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) + ) } - -} \ No newline at end of file +} 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 be220397d..b4cbe2790 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 @@ -246,7 +246,7 @@ open class DragLinearLayout @JvmOverloads constructor(context: Context, attrs: A */ private fun startDetectingDrag(child: View) { if (draggedItem.detecting) - return // existing drag in process, only one at a time is allowed + return // existing drag in process, only one at a time is allowed val position = indexOfChild(child) @@ -273,19 +273,23 @@ open class DragLinearLayout @JvmOverloads constructor(context: Context, attrs: A * 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.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) + 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() - }) + 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() @@ -293,7 +297,7 @@ open class DragLinearLayout @JvmOverloads constructor(context: Context, attrs: A override fun onAnimationEnd(animation: Animator) { if (!draggedItem.detecting) { - return // already stopped + return // already stopped } draggedItem.settleAnimation = null @@ -367,7 +371,7 @@ open class DragLinearLayout @JvmOverloads constructor(context: Context, attrs: A switchViewObserver.removeOnPreDrawListener(this) val switchAnimator = ObjectAnimator.ofFloat(switchView, "y", switchViewStartY, switchView.top.toFloat()) - .setDuration(getTranslateAnimationDuration(switchView.top - switchViewStartY)) + .setDuration(getTranslateAnimationDuration(switchView.top - switchViewStartY)) switchAnimator.addListener(object : AnimatorListenerAdapter() { override fun onAnimationStart(animation: Animator) { draggableChildren.get(originalPosition).swapAnimation = switchAnimator 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 2d4caaa49..2f70aeabf 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 @@ -13,7 +13,6 @@ package com.habitrpg.android.habitica.ui.views * http://stackoverflow.com/questions/4005933/how-do-i-tell-if-my-textview-has-been-ellipsized */ - import android.content.Context import android.util.AttributeSet import androidx.appcompat.widget.AppCompatTextView @@ -65,4 +64,4 @@ class EllipsisTextView : AppCompatTextView { listener.ellipsisStateChanged(ellipses) } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EquipmentItemRow.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EquipmentItemRow.kt index f53dda804..7ec4e3979 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EquipmentItemRow.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EquipmentItemRow.kt @@ -13,27 +13,28 @@ class EquipmentItemRow(context: Context, attrs: AttributeSet?) : LinearLayout(co private val binding: ItemImageRowBinding = ItemImageRowBinding.inflate(context.layoutInflater, this) var equipmentIdentifier: String? = null - set(value) { - field = value - val imageName = if (equipmentIdentifier?.isNotEmpty() == true && equipmentIdentifier?.endsWith("base_0") == false) "shop_$equipmentIdentifier" else "head_0" - DataBindingUtils.loadImage(binding.imageView, imageName) - } + set(value) { + field = value + val imageName = if (equipmentIdentifier?.isNotEmpty() == true && equipmentIdentifier?.endsWith("base_0") == false) "shop_$equipmentIdentifier" else "head_0" + DataBindingUtils.loadImage(binding.imageView, imageName) + } var customizationIdentifier: String? = null - set(value) { - field = value - val imageName = if (customizationIdentifier?.isNotEmpty() == true) customizationIdentifier else "head_0" - DataBindingUtils.loadImage(binding.imageView, imageName) - } + set(value) { + field = value + val imageName = if (customizationIdentifier?.isNotEmpty() == true) customizationIdentifier else "head_0" + DataBindingUtils.loadImage(binding.imageView, imageName) + } init { View.inflate(context, R.layout.item_image_row, this) isClickable = true val attributes = context.theme?.obtainStyledAttributes( - attrs, - R.styleable.EquipmentItemRow, - 0, 0) + attrs, + R.styleable.EquipmentItemRow, + 0, 0 + ) binding.titleTextView.text = attributes?.getString(R.styleable.EquipmentItemRow_equipmentTitle) binding.valueTextView.visibility = View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.kt index a3f634a45..76c2cfaac 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.kt @@ -1,13 +1,12 @@ package com.habitrpg.android.habitica.ui.views import android.content.Context -import androidx.viewpager.widget.ViewPager import android.util.AttributeSet import android.view.MotionEvent import android.view.View +import androidx.viewpager.widget.ViewPager import kotlin.math.abs - class FadingViewPager : ViewPager { var disableFading: Boolean = false diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaAutocompleteTextView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaAutocompleteTextView.kt index d1df8238f..4ee70b4b8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaAutocompleteTextView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaAutocompleteTextView.kt @@ -5,12 +5,10 @@ import android.text.InputType import android.util.AttributeSet import androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView - class HabiticaAutocompleteTextView(context: Context, attrs: AttributeSet?) : AppCompatMultiAutoCompleteTextView(context, attrs) { init { val removed = this.inputType and (this.inputType xor InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) this.inputType = removed } - -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaProgressBar.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaProgressBar.kt index 4e5fb59c8..ba7597093 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaProgressBar.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaProgressBar.kt @@ -16,21 +16,20 @@ import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import kotlin.math.min - class HabiticaProgressBar(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { val binding = ProgressBarBinding.inflate(context.layoutInflater, this) var barForegroundColor: Int = 0 - set(value) { - field = value - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { - DataBindingUtils.setRoundedBackground(binding.bar, value) - } else { - val bar: ImageView = findViewById(R.id.bar) - ImageViewCompat.setImageTintList(bar, ColorStateList.valueOf(field)) - ImageViewCompat.setImageTintMode(bar, PorterDuff.Mode.SRC_IN) + set(value) { + field = value + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { + DataBindingUtils.setRoundedBackground(binding.bar, value) + } else { + val bar: ImageView = findViewById(R.id.bar) + ImageViewCompat.setImageTintList(bar, ColorStateList.valueOf(field)) + ImageViewCompat.setImageTintMode(bar, PorterDuff.Mode.SRC_IN) + } } - } var barPendingColor: Int = 0 set(value) { @@ -39,12 +38,12 @@ class HabiticaProgressBar(context: Context, attrs: AttributeSet?) : FrameLayout( } var barBackgroundColor: Int = 0 - set(value) { - field = value - if (value != 0) { - DataBindingUtils.setRoundedBackground(this, value) + set(value) { + field = value + if (value != 0) { + DataBindingUtils.setRoundedBackground(this, value) + } } - } private var currentValue: Double = 0.0 private var maxValue: Double = 0.0 @@ -73,16 +72,16 @@ class HabiticaProgressBar(context: Context, attrs: AttributeSet?) : FrameLayout( View.inflate(context, R.layout.progress_bar, this) val attributes = context.theme?.obtainStyledAttributes( - attrs, - R.styleable.HabiticaProgressBar, - 0, 0) + attrs, + R.styleable.HabiticaProgressBar, + 0, 0 + ) barForegroundColor = attributes?.getColor(R.styleable.HabiticaProgressBar_barForegroundColor, 0) ?: 0 barPendingColor = attributes?.getColor(R.styleable.HabiticaProgressBar_barPendingColor, 0) ?: 0 barBackgroundColor = attributes?.getColor(R.styleable.HabiticaProgressBar_barBackgroundColor, 0) ?: 0 } - private fun setBarWeight(percent: Double) { setLayoutWeight(binding.bar, percent) setLayoutWeight(binding.emptyBarSpace, 1.0f - percent) @@ -92,7 +91,6 @@ class HabiticaProgressBar(context: Context, attrs: AttributeSet?) : FrameLayout( setLayoutWeight(binding.pendingEmptyBarSpace, 1.0f - percent) } - fun set(value: Double, valueMax: Double) { currentValue = value maxValue = valueMax @@ -120,4 +118,4 @@ class HabiticaProgressBar(context: Context, attrs: AttributeSet?) : FrameLayout( view.layoutParams = layout } } -} \ No newline at end of file +} 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 8d47a7f4a..d2775f104 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 @@ -117,7 +117,6 @@ private constructor(parent: ViewGroup, content: View, callback: ContentViewCallb return customSnackbar } - fun showSnackbar(container: ViewGroup, content: CharSequence?, displayType: SnackbarDisplayType, isCelebratory: Boolean = false) { showSnackbar(container, null, null, content, null, null, 0, null, displayType, isCelebratory) } @@ -126,7 +125,6 @@ private constructor(parent: ViewGroup, content: View, callback: ContentViewCallb showSnackbar(container, leftImage, title, content, null, null, 0, null, displayType, isCelebratory) } - fun showSnackbar(container: ViewGroup, title: CharSequence?, content: CharSequence?, rightIcon: Drawable, rightTextColor: Int, rightText: String, displayType: SnackbarDisplayType, isCelebratory: Boolean = false) { showSnackbar(container, null, title, content, null, rightIcon, rightTextColor, rightText, displayType, isCelebratory) } @@ -137,11 +135,11 @@ private constructor(parent: ViewGroup, content: View, callback: ContentViewCallb fun showSnackbar(container: ViewGroup, leftImage: Drawable?, title: CharSequence?, content: CharSequence?, specialView: View?, rightIcon: Drawable?, rightTextColor: Int, rightText: String?, displayType: SnackbarDisplayType, isCelebratory: Boolean = false) { val snackbar = make(container, Snackbar.LENGTH_LONG) - .setTitle(title) - .setText(content) - .setSpecialView(specialView) - .setLeftIcon(leftImage) - .setRightDiff(rightIcon, rightTextColor, rightText) + .setTitle(title) + .setText(content) + .setSpecialView(specialView) + .setLeftIcon(leftImage) + .setRightDiff(rightIcon, rightTextColor, rightText) when (displayType) { SnackbarDisplayType.FAILURE -> snackbar.setBackgroundResource(R.drawable.snackbar_background_red) @@ -153,32 +151,35 @@ private constructor(parent: ViewGroup, content: View, callback: ContentViewCallb snackbar.show() if (isCelebratory) { - container.postDelayed({ - ParticleSystem(container, 30, ContextCompat.getDrawable(container.context, R.drawable.confetti_blue), 6000) + container.postDelayed( + { + ParticleSystem(container, 30, ContextCompat.getDrawable(container.context, R.drawable.confetti_blue), 6000) .setAcceleration(0.00070f, 90) .setRotationSpeed(144f) .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) + ParticleSystem(container, 30, ContextCompat.getDrawable(container.context, R.drawable.confetti_red), 6000) .setAcceleration(0.00060f, 90) .setRotationSpeed(144f) .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) + ParticleSystem(container, 30, ContextCompat.getDrawable(container.context, R.drawable.confetti_yellow), 6000) .setAcceleration(0.00070f, 90) .setRotationSpeed(144f) .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) + ParticleSystem(container, 30, ContextCompat.getDrawable(container.context, R.drawable.confetti_purple), 6000) .setAcceleration(0.00090f, 90) .setRotationSpeed(144f) .setSpeedByComponentsRange(-0.15f, 0.15f, -0.15f, -0.45f) .setFadeOut(200, AccelerateInterpolator()) .emitWithGravity(container, Gravity.BOTTOM, 7, 1000) - }, 500) + }, + 500 + ) } } } 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 48308f1df..e266e64a0 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 @@ -13,8 +13,8 @@ import com.habitrpg.android.habitica.databinding.NpcBannerBinding import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils -import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Observable import kotlin.math.roundToInt class NPCBannerView(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { @@ -32,10 +32,10 @@ class NPCBannerView(context: Context, attrs: AttributeSet?) : FrameLayout(contex } } var identifier: String = "" - set(value) { - field = value - setImage() - } + set(value) { + field = value + setImage() + } private fun setImage() { DataBindingUtils.loadImage(binding.sceneView, identifier + "_scene" + shopSpriteSuffix) @@ -49,10 +49,13 @@ class NPCBannerView(context: Context, attrs: AttributeSet?) : FrameLayout(contex val drawable = BitmapDrawable(context.resources, Bitmap.createScaledBitmap(it.toBitmap(), width, height, false)) drawable.tileModeX = Shader.TileMode.REPEAT Observable.just(drawable) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { binding.backgroundView.background = it - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } } -} \ No newline at end of file +} 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 2d45e9d68..b67e7866d 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 @@ -26,7 +26,8 @@ class SupportCollapsibleSection : LinearLayout { private fun init(attrs: AttributeSet?, defStyle: Int) { val binding = SupportCollapsibleSectionBinding.inflate(context.layoutInflater, this) val a = context.obtainStyledAttributes( - attrs, R.styleable.SupportCollapsibleSection, defStyle, 0) + attrs, R.styleable.SupportCollapsibleSection, defStyle, 0 + ) orientation = VERTICAL @@ -40,10 +41,10 @@ class SupportCollapsibleSection : LinearLayout { a.recycle() setOnClickListener { - binding.descriptionView.visibility = if (binding.descriptionView.visibility == View.VISIBLE){ + binding.descriptionView.visibility = if (binding.descriptionView.visibility == View.VISIBLE) { binding.caretView.setImageResource(R.drawable.ic_keyboard_arrow_down_black_24dp) View.GONE - } else{ + } else { binding.caretView.setImageResource(R.drawable.ic_keyboard_arrow_up_black_24dp) View.VISIBLE } 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 34dce71ce..e12e12b42 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 @@ -1,13 +1,11 @@ package com.habitrpg.android.habitica.ui.views - import android.content.Context -import androidx.core.content.ContextCompat import android.text.Spannable import android.text.SpannableStringBuilder import android.text.style.ForegroundColorSpan import android.util.AttributeSet - +import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R import kotlinx.coroutines.* @@ -24,7 +22,6 @@ class Typewriter : androidx.appcompat.widget.AppCompatTextView { val isAnimating: Boolean get() = index < stringBuilder?.length ?: 0 - constructor(context: Context) : super(context) { setupTextColors(context) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValueBar.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValueBar.kt index 3b09118a4..1c18d420f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValueBar.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValueBar.kt @@ -16,7 +16,6 @@ import com.habitrpg.android.habitica.extensions.layoutInflater import java.math.RoundingMode import java.text.NumberFormat - class ValueBar(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { var descriptionIconVisibility: Int @@ -58,18 +57,18 @@ class ValueBar(context: Context, attrs: AttributeSet?) : FrameLayout(context, at } var barHeight: Int? = null - set(value) { - field = value - if (value != null) { - binding.progressBar.layoutParams.height = value + set(value) { + field = value + if (value != null) { + binding.progressBar.layoutParams.height = value + } } - } var description: String = "" - set(value) { - field = value - binding.descriptionTextView.text = description - } + set(value) { + field = value + binding.descriptionTextView.text = description + } private fun updateBar() { binding.progressBar.set(currentValue, maxValue) @@ -80,9 +79,10 @@ class ValueBar(context: Context, attrs: AttributeSet?) : FrameLayout(context, at init { val attributes = context.theme?.obtainStyledAttributes( - attrs, - R.styleable.ValueBar, - 0, 0) + attrs, + R.styleable.ValueBar, + 0, 0 + ) setLightBackground(attributes?.getBoolean(R.styleable.ValueBar_lightBackground, !context.isUsingNightModeResources()) == true) binding.progressBar.barForegroundColor = attributes?.getColor(R.styleable.ValueBar_barForegroundColor, 0) ?: 0 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/adventureGuide/AdventureGuideMenuBanner.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/adventureGuide/AdventureGuideMenuBanner.kt index b2b8a0ce8..7250bac54 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/adventureGuide/AdventureGuideMenuBanner.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/adventureGuide/AdventureGuideMenuBanner.kt @@ -12,7 +12,9 @@ import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.models.user.User class AdventureGuideMenuBanner @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { private var binding = AdventureGuideMenuBannerBinding.inflate(context.layoutInflater, this) @@ -30,4 +32,4 @@ class AdventureGuideMenuBanner @JvmOverloads constructor( binding.progressBar.progress = completed binding.countView.text = "$completed / ${achievements.size}" } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt index b7e9f7394..f233bf867 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt @@ -5,14 +5,13 @@ import android.view.LayoutInflater import android.view.View import android.widget.ImageView import android.widget.TextView -import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.DialogAchievementDetailBinding import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.extensions.fromHtml import com.habitrpg.android.habitica.models.Achievement import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils -class AchievementDetailDialog(val achievement: Achievement, context: Context): HabiticaAlertDialog(context) { +class AchievementDetailDialog(val achievement: Achievement, context: Context) : HabiticaAlertDialog(context) { private var iconView: ImageView? private var descriptionView: TextView? @@ -34,4 +33,4 @@ class AchievementDetailDialog(val achievement: Achievement, context: Context): H DataBindingUtils.loadImage(iconView, iconName) addCloseButton(true) } -} \ No newline at end of file +} 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 96bbd1821..43ac339c2 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 @@ -54,7 +54,7 @@ class AchievementDialog(context: Context) : HabiticaAlertDialog(context) { DataBindingUtils.loadImage(binding.iconView, "achievement-${iconName}2x") if (iconName == "onboardingComplete") { setTitle(R.string.onboardingComplete_achievement_title) - binding.titleView.setTextSize(TypedValue.COMPLEX_UNIT_SP,14f) + binding.titleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) binding.achievementWrapper.visibility = View.GONE binding.onboardingDoneIcon.visibility = View.VISIBLE binding.titleView.typeface = Typeface.DEFAULT diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/DetailDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/DetailDialog.kt index 1bb123db2..908b50adc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/DetailDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/DetailDialog.kt @@ -8,17 +8,17 @@ import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialogQuestContent class DetailDialog(context: Context) : HabiticaAlertDialog(context) { var quest: QuestContent? = null - set(value) { - field = value - if (value == null) return + set(value) { + field = value + if (value == null) return - val contentView = PurchaseDialogQuestContent(context) - contentView.setQuestContent(value) - contentView.setQuestContentItem(value) - setAdditionalContentView(contentView) - } + val contentView = PurchaseDialogQuestContent(context) + contentView.setQuestContent(value) + contentView.setQuestContentItem(value) + setAdditionalContentView(contentView) + } init { addCloseButton() } -} \ No newline at end of file +} 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 216119ab2..4ae3dba98 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 @@ -18,19 +18,17 @@ import com.habitrpg.android.habitica.ui.activities.BaseActivity import com.habitrpg.android.habitica.ui.views.login.LockableScrollView import com.plattysoft.leonids.ParticleSystem import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.lang.ref.WeakReference - open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style.HabiticaAlertDialogTheme) { var buttonAxis: Int = LinearLayout.VERTICAL - set(value) { - field = value - updateButtonLayout() - } + set(value) { + field = value + updateButtonLayout() + } var isCelebratory: Boolean = false private val view: RelativeLayout = LayoutInflater.from(context).inflate(R.layout.dialog_habitica_base, null) as RelativeLayout private val dialogWrapper: LinearLayout @@ -47,27 +45,27 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. internal var additionalContentView: View? = null var isScrollingLayout: Boolean = false - get() { - if (forceScrollableLayout) return true - return field - } - set(value) { - field = value - updateButtonLayout() - } + get() { + if (forceScrollableLayout) return true + return field + } + set(value) { + field = value + updateButtonLayout() + } var forceScrollableLayout = false - set(value) { - field = value - updateButtonLayout() - } + set(value) { + field = value + updateButtonLayout() + } var dialogWidth = 320 - set(value) { - field = value - val layoutParams = dialogWrapper.layoutParams - layoutParams.width = value - dialogWrapper.layoutParams = layoutParams - } + set(value) { + field = value + val layoutParams = dialogWrapper.layoutParams + layoutParams.width = value + dialogWrapper.layoutParams = layoutParams + } init { setView(view) @@ -199,7 +197,6 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. return addButton(button, autoDismiss, function) as Button } - fun addButton(buttonView: View, autoDismiss: Boolean = true, function: ((HabiticaAlertDialog, Int) -> Unit)? = null): View { val weakThis = WeakReference(this) val buttonIndex = buttonsWrapper.childCount @@ -254,29 +251,29 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. titleTextView.post { val confettiContainer = view.findViewById(R.id.confetti_container) ParticleSystem(confettiContainer, 40, ContextCompat.getDrawable(context, R.drawable.confetti_blue), 6000) - .setAcceleration(0.00010f, 90) - .setRotationSpeed(144f) - .setSpeedByComponentsRange(-0.15f, 0.15f, -0.1f, -0.4f) - .setFadeOut(200, AccelerateInterpolator()) - .emitWithGravity(titleTextView, Gravity.BOTTOM, 10, 2000) + .setAcceleration(0.00010f, 90) + .setRotationSpeed(144f) + .setSpeedByComponentsRange(-0.15f, 0.15f, -0.1f, -0.4f) + .setFadeOut(200, AccelerateInterpolator()) + .emitWithGravity(titleTextView, Gravity.BOTTOM, 10, 2000) ParticleSystem(confettiContainer, 40, ContextCompat.getDrawable(context, R.drawable.confetti_red), 6000) - .setAcceleration(0.00010f, 90) - .setRotationSpeed(144f) - .setSpeedByComponentsRange(-0.15f, 0.15f, -0.1f, -0.4f) - .setFadeOut(200, AccelerateInterpolator()) - .emitWithGravity(titleTextView, Gravity.BOTTOM, 10, 2000) + .setAcceleration(0.00010f, 90) + .setRotationSpeed(144f) + .setSpeedByComponentsRange(-0.15f, 0.15f, -0.1f, -0.4f) + .setFadeOut(200, AccelerateInterpolator()) + .emitWithGravity(titleTextView, Gravity.BOTTOM, 10, 2000) ParticleSystem(confettiContainer, 40, ContextCompat.getDrawable(context, R.drawable.confetti_yellow), 6000) - .setAcceleration(0.00010f, 90) - .setRotationSpeed(144f) - .setSpeedByComponentsRange(-0.15f, 0.15f, -0.1f, -0.4f) - .setFadeOut(200, AccelerateInterpolator()) - .emitWithGravity(titleTextView, Gravity.BOTTOM, 10, 2000) + .setAcceleration(0.00010f, 90) + .setRotationSpeed(144f) + .setSpeedByComponentsRange(-0.15f, 0.15f, -0.1f, -0.4f) + .setFadeOut(200, AccelerateInterpolator()) + .emitWithGravity(titleTextView, Gravity.BOTTOM, 10, 2000) ParticleSystem(confettiContainer, 40, ContextCompat.getDrawable(context, R.drawable.confetti_purple), 6000) - .setAcceleration(0.00010f, 90) - .setRotationSpeed(144f) - .setSpeedByComponentsRange(-0.15f, 0.15f, -0.1f, -0.4f) - .setFadeOut(200, AccelerateInterpolator()) - .emitWithGravity(titleTextView, Gravity.BOTTOM, 10, 2000) + .setAcceleration(0.00010f, 90) + .setRotationSpeed(144f) + .setSpeedByComponentsRange(-0.15f, 0.15f, -0.1f, -0.4f) + .setFadeOut(200, AccelerateInterpolator()) + .emitWithGravity(titleTextView, Gravity.BOTTOM, 10, 2000) } } @@ -294,8 +291,11 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. if ((dialogQueue[0].context as? BaseActivity)?.isFinishing != true) { (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)) { + if (dialogQueue.size > 0 && ( + (dialogQueue[0].context as? Activity)?.isFinishing == false || + ((dialogQueue[0].context as? ContextThemeWrapper)?.baseContext as? Activity)?.isFinishing == false + ) + ) { dialogQueue[0].show() } } @@ -321,4 +321,4 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. } } } -} \ No newline at end of file +} 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 781083c84..e2874a5bf 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 @@ -19,4 +19,4 @@ class HabiticaProgressDialog(context: Context) : HabiticaAlertDialog(context) { return dialog } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/OpenedMysteryitemDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/OpenedMysteryitemDialog.kt index 40f18843d..960f09123 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/OpenedMysteryitemDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/OpenedMysteryitemDialog.kt @@ -5,7 +5,7 @@ import com.habitrpg.android.habitica.databinding.DialogOpenMysteryitemBinding import com.habitrpg.android.habitica.extensions.dpToPx import com.habitrpg.android.habitica.extensions.layoutInflater -class OpenedMysteryitemDialog(context: Context): HabiticaAlertDialog(context) { +class OpenedMysteryitemDialog(context: Context) : HabiticaAlertDialog(context) { val binding = DialogOpenMysteryitemBinding.inflate(context.layoutInflater) @@ -13,4 +13,4 @@ class OpenedMysteryitemDialog(context: Context): HabiticaAlertDialog(context) { setAdditionalContentView(binding.root) dialogWidth = 302.dpToPx(context) } -} \ No newline at end of file +} 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 52128915b..54000224b 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 @@ -16,15 +16,13 @@ import com.habitrpg.android.habitica.models.inventory.Item import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.views.CurrencyView +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import java.util.* - class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { - private lateinit var binding: DialogPetSuggestHatchBinding init { @@ -69,9 +67,11 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { } if (hasEgg && hasPotion) { - binding.descriptionView.text = context.getString(R.string.can_hatch_pet, - eggName, - potionName) + binding.descriptionView.text = context.getString( + R.string.can_hatch_pet, + eggName, + potionName + ) addButton(R.string.hatch, true, false) { _, _ -> val thisPotion = potion ?: return@addButton val thisEgg = egg ?: return@addButton @@ -109,7 +109,6 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { if (!hasPotion) { hatchPrice += getItemPrice(pet, potion, hasUnlockedPotion) - } addButton(R.string.close, true) @@ -132,26 +131,31 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { observable = observable.flatMap { activity.inventoryRepository.purchaseItem("hatchingPotions", thisPotion.key, 1) } } observable - .flatMap { activity.userRepository.retrieveUser(true, forced = true) } - .subscribe({ - (getActivity() as? MainActivity)?.hatchPet(thisPotion, thisEgg) - }, RxErrorHandler.handleEmptyError()) + .flatMap { activity.userRepository.retrieveUser(true, forced = true) } + .subscribe( + { + (getActivity() as? MainActivity)?.hatchPet(thisPotion, thisEgg) + }, + RxErrorHandler.handleEmptyError() + ) } } setTitle(R.string.unhatched_pet) } - val imageName = "stable_Pet-${pet.animal}-${pet.color}" DataBindingUtils.loadImage(context, imageName) { val resources = context.resources ?: return@loadImage val drawable = if (hasMount) it else BitmapDrawable(resources, it.toBitmap().extractAlpha()) Observable.just(drawable) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { binding.petView.background = drawable - }, RxErrorHandler.handleEmptyError()) + }, + RxErrorHandler.handleEmptyError() + ) } } 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 0352531ff..3ad23967f 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,4 +34,4 @@ class QuestCompletedDialog(context: Context) : HabiticaAlertDialog(context) { dialog?.enqueue() } } -} \ No newline at end of file +} 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 4bc0aa721..e1bce2fce 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 @@ -20,7 +20,6 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper class QuestCompletedDialogContent : LinearLayout { - private lateinit var binding: DialogCompletedQuestContentBinding constructor(context: Context) : super(context) { @@ -47,8 +46,8 @@ class QuestCompletedDialogContent : LinearLayout { if (questContent.drop != null && questContent.drop?.items != null) { questContent.drop?.items - ?.filterNot { it.onlyOwner } - ?.forEach { addRewardsRow(inflater, it, binding.rewardsList) } + ?.filterNot { it.onlyOwner } + ?.forEach { addRewardsRow(inflater, it, binding.rewardsList) } var hasOwnerRewards = false for (item in questContent.drop?.items ?: emptyList()) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewItem.kt index c49eaac50..55834b0bb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewItem.kt @@ -13,7 +13,9 @@ import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper class EquipmentOverviewItem @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 ) : LinearLayout(context, attrs, defStyleAttr) { private var binding: EquipmentOverviewItemBinding = EquipmentOverviewItemBinding.inflate(context.layoutInflater, this) @@ -52,4 +54,4 @@ class EquipmentOverviewItem @JvmOverloads constructor( } } } -} \ No newline at end of file +} 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 60b8d5129..81a919cd5 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 @@ -11,7 +11,9 @@ import com.habitrpg.android.habitica.extensions.setScaledPadding import com.habitrpg.android.habitica.models.user.Outfit class EquipmentOverviewView @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 ) : LinearLayout(context, attrs, defStyleAttr) { var onNavigate: ((String, String) -> Unit)? = null @@ -19,7 +21,7 @@ class EquipmentOverviewView @JvmOverloads constructor( init { background = ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_gray_50) - setScaledPadding(context, 12, 12, 12 ,12) + setScaledPadding(context, 12, 12, 12, 12) orientation = VERTICAL binding.weaponItem.setOnClickListener { onNavigate?.invoke("weapon", binding.weaponItem.identifier) } @@ -30,7 +32,6 @@ class EquipmentOverviewView @JvmOverloads constructor( binding.bodyItem.setOnClickListener { onNavigate?.invoke("body", binding.bodyItem.identifier) } binding.backItem.setOnClickListener { onNavigate?.invoke("back", binding.backItem.identifier) } binding.eyewearItem.setOnClickListener { onNavigate?.invoke("eyewear", binding.eyewearItem.identifier) } - } fun updateData(outfit: Outfit?, isWeaponTwoHanded: Boolean = false) { @@ -43,4 +44,4 @@ class EquipmentOverviewView @JvmOverloads constructor( binding.backItem.set(outfit?.back) binding.eyewearItem.set(outfit?.eyeWear) } -} \ No newline at end of file +} 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 faaf7f40c..115e0f181 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 @@ -14,7 +14,7 @@ class InsufficientHourglassesDialog(context: Context) : InsufficientCurrencyDial imageView.setImageBitmap(HabiticaIconsHelper.imageOfHourglassShop()) textView.setText(R.string.insufficientHourglasses) - addButton(R.string.get_hourglasses, true) { _, _ -> MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", true))) } + addButton(R.string.get_hourglasses, true) { _, _ -> MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", true))) } addCloseButton() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.kt index 3b5711a79..994549a22 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.kt @@ -23,5 +23,4 @@ class LockableScrollView(context: Context, attrs: AttributeSet) : NestedScrollVi else super.onInterceptTouchEvent(ev) } - } 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 4d00285fa..977cbf12c 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.views.login - import android.animation.ObjectAnimator import android.animation.ValueAnimator import android.content.Context @@ -118,7 +117,7 @@ class LoginBackgroundView(context: Context, attrs: AttributeSet?) : RelativeLayo } private fun updateStarLayoutParams() { - if (viewWidth <= 0 ||viewHeight <= 0 || didLayoutStars || starViews?.size == 0) { + if (viewWidth <= 0 || viewHeight <= 0 || didLayoutStars || starViews?.size == 0) { return } for (view in starViews ?: emptyList()) { 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 bf0ed39d2..d7c004062 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 @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.views.login - import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.ObjectAnimator @@ -13,7 +12,6 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper class StarView : AppCompatImageView { - private var blinkDurations: List? = null private var blinkIndex = 0 @@ -61,6 +59,5 @@ class StarView : AppCompatImageView { animator.start() } catch (ignored: NullPointerException) { } - } } 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 b69541490..b38d34798 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,7 +15,9 @@ import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.extensions.setTintWith class BottomNavigationItem @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 ) : RelativeLayout(context, attrs, defStyleAttr) { private var selectedIcon: Drawable? = null private var icon: Drawable? = null @@ -25,41 +27,42 @@ class BottomNavigationItem @JvmOverloads constructor( 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 ) + 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.iconView.drawable.setTintWith(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP ) + binding.selectedTitleView.visibility = View.GONE + binding.iconView.setImageDrawable(icon) + binding.titleView.visibility = deselectedVisibility + binding.iconView.drawable.setTintWith(context.getThemeColor(R.attr.textColorPrimaryDark), PorterDuff.Mode.SRC_ATOP) } - } else { - binding.selectedTitleView.visibility = View.GONE - binding.iconView.setImageDrawable(icon) - 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() + 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) + attrs, + R.styleable.BottomNavigationItem, + 0, 0 + ) if (attributes != null) { icon = attributes.getDrawable(R.styleable.BottomNavigationItem_iconDrawable) selectedIcon = attributes.getDrawable(R.styleable.BottomNavigationItem_selectedIconDrawable) @@ -68,5 +71,4 @@ class BottomNavigationItem @JvmOverloads constructor( binding.selectedTitleView.text = attributes.getString(R.styleable.BottomNavigationItem_title) } } - -} \ No newline at end of file +} 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 047db3356..e737a6801 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,28 +8,30 @@ import com.habitrpg.android.habitica.databinding.BottomNavigationSubmenuBinding import com.habitrpg.android.habitica.extensions.layoutInflater class BottomNavigationSubmenuItem @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 ) : RelativeLayout(context, attrs, defStyleAttr) { private val binding = BottomNavigationSubmenuBinding.inflate(context.layoutInflater, this) var onAddListener: (() -> Unit)? = null val measuredTitleWidth: Int - get() { - binding.titleView.measure(width, height) - return binding.titleView.measuredWidth - } + get() { + binding.titleView.measure(width, height) + return binding.titleView.measuredWidth + } var icon: Drawable? = null - set(value) { - field = value - binding.iconView.setImageDrawable(value) - } + set(value) { + field = value + binding.iconView.setImageDrawable(value) + } var title: String? = null - set(value) { - field = value - binding.titleView.text = title - } + set(value) { + field = value + binding.titleView.text = title + } init { binding.iconView.setOnClickListener { onAddListener?.invoke() } @@ -41,5 +43,4 @@ class BottomNavigationSubmenuItem @JvmOverloads constructor( layoutParams?.width = width binding.titleView.layoutParams = layoutParams } - -} \ No newline at end of file +} 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 72884454d..bf228f07b 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 @@ -27,52 +27,54 @@ interface HabiticaBottomNavigationViewListener { } class HabiticaBottomNavigationView @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + 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) { - Task.TYPE_DAILY -> 1 - Task.TYPE_REWARD -> 2 - Task.TYPE_TODO -> 3 - else -> 0 + get() { + return when (activeTaskType) { + Task.TYPE_DAILY -> 1 + Task.TYPE_REWARD -> 2 + Task.TYPE_TODO -> 3 + else -> 0 + } } - } - set(value) { - activeTaskType = when (value) { - 1 -> Task.TYPE_DAILY - 2 -> Task.TYPE_TODO - 3 -> Task.TYPE_REWARD - else -> Task.TYPE_HABIT + set(value) { + activeTaskType = when (value) { + 1 -> Task.TYPE_DAILY + 2 -> Task.TYPE_TODO + 3 -> Task.TYPE_REWARD + else -> Task.TYPE_HABIT + } } - } var listener: HabiticaBottomNavigationViewListener? = null var activeTaskType: String = Task.TYPE_HABIT - set(value) { - val wasChanged = field != value - field = value - if (wasChanged) { - updateItemSelection() - listener?.onTabSelected(value, true) + set(value) { + val wasChanged = field != value + field = value + if (wasChanged) { + updateItemSelection() + listener?.onTabSelected(value, true) + } } - } var canAddTasks = true - set(value) { - field = value - if (field) { - binding.cutoutWrapper.visibility = View.VISIBLE - binding.cutoutSpace.visibility = View.VISIBLE - binding.addButtonBackground.visibility = View.VISIBLE - } else { - binding.cutoutWrapper.visibility = View.GONE - binding.cutoutSpace.visibility = View.GONE - binding.addButtonBackground.visibility = View.GONE + set(value) { + field = value + if (field) { + binding.cutoutWrapper.visibility = View.VISIBLE + binding.cutoutSpace.visibility = View.VISIBLE + binding.addButtonBackground.visibility = View.VISIBLE + } else { + binding.cutoutWrapper.visibility = View.GONE + binding.cutoutSpace.visibility = View.GONE + binding.addButtonBackground.visibility = View.GONE + } } - } val barHeight: Int get() = binding.itemWrapper.measuredHeight @@ -225,7 +227,7 @@ class HabiticaBottomNavigationView @JvmOverloads constructor( } fun tabWithId(id: Int): BottomNavigationItem? { - return when(id) { + return when (id) { R.id.habits_tab -> binding.habitsTab R.id.dailies_tab -> binding.dailiesTab R.id.todos_tab -> binding.todosTab @@ -240,4 +242,4 @@ class HabiticaBottomNavigationView @JvmOverloads constructor( binding.todosTab.isActive = activeTaskType == Task.TYPE_TODO binding.rewardsTab.isActive = activeTaskType == Task.TYPE_REWARD } -} \ No newline at end of file +} 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 aa6b38f0c..0c0924b9a 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,14 +13,16 @@ import com.habitrpg.android.habitica.databinding.PromoMenuBinding import com.habitrpg.android.habitica.extensions.layoutInflater class PromoMenuView @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + 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 - } + set(value) { + field = value + binding.closeButton.visibility = if (value) View.VISIBLE else View.GONE + } var binding: PromoMenuBinding = PromoMenuBinding.inflate(context.layoutInflater, this) init { @@ -68,4 +70,4 @@ class PromoMenuView @JvmOverloads constructor( view.visibility = View.GONE } } -} \ No newline at end of file +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuViewHolder.kt index 180c50317..d3a18a31c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuViewHolder.kt @@ -8,4 +8,4 @@ class PromoMenuViewHolder(val promoView: PromoMenuView) : RecyclerView.ViewHolde fun bind(promo: HabiticaPromotion) { promo.configurePromoMenuView(promoView) } -} \ No newline at end of file +} 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 c9832154a..09f1e76d5 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 @@ -11,7 +11,9 @@ import com.habitrpg.android.habitica.extensions.inflate import com.habitrpg.android.habitica.helpers.MainNavigationController class SubscriptionBuyGemsPromoView @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 ) : RelativeLayout(context, attrs, defStyleAttr) { init { @@ -22,4 +24,4 @@ class SubscriptionBuyGemsPromoView @JvmOverloads constructor( clipToOutline = false findViewById