diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 38e49f375..715e6f3fa 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -15,7 +15,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.4' + classpath 'com.android.tools.build:gradle:7.1.0' classpath 'net.sourceforge.pmd:pmd-java:5.5.3' } } @@ -155,9 +155,9 @@ android { vectorDrawables.useSupportLibrary = true buildConfigField "String", "STORE", "\"google\"" 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" + 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 3223 + versionCode 3227 versionName "3.5" targetSdkVersion 32 @@ -169,9 +169,6 @@ android { viewBinding true } - lintOptions { - abortOnError false - } signingConfigs { release @@ -271,10 +268,6 @@ android { jvmTarget = JavaVersion.VERSION_1_8.toString() } - lintOptions { - disable 'MissingTranslation','InvalidPackage' - enable 'LogConditional','IconExpectedSize','MissingRegistered','TypographyQuotes' - } bundle { language { @@ -285,6 +278,11 @@ android { enableSplit = false } } + lint { + abortOnError false + disable 'MissingTranslation', 'InvalidPackage' + enable 'LogConditional', 'IconExpectedSize', 'MissingRegistered', 'TypographyQuotes' + } } android.testOptions { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java index 128148286..230d47796 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java @@ -106,6 +106,7 @@ import com.habitrpg.android.habitica.ui.viewmodels.MainActivityViewModel; import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel; import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel; import com.habitrpg.android.habitica.ui.viewmodels.inventory.equipment.EquipmentOverviewViewModel; +import com.habitrpg.android.habitica.ui.views.dialogs.PetSuggestHatchDialog; import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientGemsDialog; import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog; import com.habitrpg.android.habitica.ui.views.social.ChatBarView; @@ -355,4 +356,6 @@ public interface UserComponent { void inject(@NotNull GuidelinesActivity guidelinesActivity); void inject(@NotNull MainUserViewModel mainUserViewModel); + + void inject(@NotNull PetSuggestHatchDialog petSuggestHatchDialog); } 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 1a0ce4c77..4f290e9f0 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 @@ -49,8 +49,8 @@ interface InventoryRepository : BaseRepository { fun sellItem(type: String, key: String): Flowable fun sellItem(item: OwnedItem): Flowable - fun equipGear(user: User?, equipment: String, asCostume: Boolean): Flowable - fun equip(user: User?, type: String, key: String): Flowable + fun equipGear(equipment: String, asCostume: Boolean): Flowable + fun equip(type: String, key: String): Flowable fun feedPet(pet: Pet, food: Food): Flowable 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 16d7590fb..246ebaaa5 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 @@ -146,13 +146,15 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie } } - override fun equipGear(user: User?, equipment: String, asCostume: Boolean): Flowable { - return equip(user, if (asCostume) "costume" else "equipped", equipment) + override fun equipGear(equipment: String, asCostume: Boolean): Flowable { + return equip(if (asCostume) "costume" else "equipped", equipment) } - override fun equip(user: User?, type: String, key: String): Flowable { - if (user != null) { - localRepository.modify(user) { liveUser -> + override fun equip(type: String, key: String): Flowable { + val liveUser = localRepository.getLiveUser(userID) + + if (liveUser != null) { + localRepository.modify(liveUser) { liveUser -> if (type == "mount") { liveUser.items?.currentMount = key } else if (type == "pet") { @@ -177,10 +179,8 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie } return apiClient.equipItem(type, key) .doOnNext { items -> - if (user == null) { - return@doOnNext - } - localRepository.modify(user) { liveUser -> + if (liveUser == null) return@doOnNext + localRepository.modify(liveUser) { liveUser -> val newEquipped = items.gear?.equipped val oldEquipped = liveUser.items?.gear?.equipped val newCostume = items.gear?.costume 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 19156f165..80c95c9d4 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 @@ -386,12 +386,10 @@ 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 - } - ) + apiClient.getGroup(teamID), apiClient.getTeamPlanTasks(teamID)) { team, tasks -> + team.tasks = tasks + team + } .doOnNext { localRepository.save(it) } .doOnNext { team -> val id = team.id 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 1bbbb18f6..821caa424 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,6 +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.User import io.realm.Realm interface BaseLocalRepository { @@ -24,4 +25,6 @@ interface BaseLocalRepository { fun save(`object`: T) fun saveSyncronous(`object`: T) fun delete(obj: T) + + fun getLiveUser(id: String): User? } 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 9d149c217..046b18dfb 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 @@ -85,6 +85,10 @@ abstract class RealmBaseLocalRepository internal constructor(override var realm: } } + override fun getLiveUser(id: String): User? { + return realm.where(User::class.java).equalTo("id", id).findFirst() + } + override fun getLiveObject(obj: T): T? { if (isClosed) return null if (obj !is RealmObject || !obj.isManaged) return obj diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/HatchPetUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/HatchPetUseCase.kt index 6d63e4b40..4ecf9bcdf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/HatchPetUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/HatchPetUseCase.kt @@ -32,7 +32,7 @@ constructor(private val inventoryRepository: InventoryRepository, postExecutionT dialog.setTitle(requestValues.context.getString(R.string.hatched_pet_title, potionName, eggName)) dialog.setAdditionalContentView(petWrapper) dialog.addButton(R.string.equip, true) { _, _ -> - inventoryRepository.equip(null, "pet", requestValues.egg.key + "-" + requestValues.potion.key) + inventoryRepository.equip("pet", requestValues.egg.key + "-" + requestValues.potion.key) .subscribe({}, RxErrorHandler.handleEmptyError()) } dialog.addButton(R.string.share, false) { hatchingDialog, _ -> 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 a25996bc9..fc9221a88 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 @@ -66,7 +66,7 @@ abstract class BaseActivity : AppCompatActivity() { return (getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater).inflate(getLayoutResId(), null) } - protected var compositeSubscription = CompositeDisposable() + var compositeSubscription = CompositeDisposable() private val habiticaApplication: HabiticaApplication get() = application as HabiticaApplication 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 7e02ed842..dd692bc20 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 @@ -379,6 +379,13 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction, Snack if (user.flags?.welcomed == false) { viewModel.updateUser("flags.welcomed", true) } + + val title = binding.toolbarTitle.text + if (title.isBlank()) { + viewModel.getToolbarTitle(0, null, null) { newTitle -> + this.title = newTitle + } + } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt index 2f5e9d9b6..b0e711b5f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt @@ -54,7 +54,7 @@ class AvatarEquipmentFragment : adapter.getSelectCustomizationEvents() .flatMap { equipment -> val key = (if (equipment.key?.isNotBlank() != true) activeEquipment else equipment.key) ?: "" - inventoryRepository.equip(userViewModel.user.value, if (userViewModel.user.value?.preferences?.costume == true) "costume" else "equipped", key) + inventoryRepository.equip(if (userViewModel.user.value?.preferences?.costume == true) "costume" else "equipped", key) } .subscribe({ }, RxErrorHandler.handleEmptyError()) ) 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 f7c278f11..597073473 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 @@ -44,7 +44,7 @@ class EquipmentDetailFragment : savedInstanceState: Bundle? ): View? { compositeSubscription.add( - this.adapter.equipEvents.flatMapMaybe { key -> inventoryRepository.equipGear(null, key, isCostume ?: false).firstElement() } + this.adapter.equipEvents.flatMapMaybe { key -> inventoryRepository.equipGear(key, isCostume ?: false).firstElement() } .subscribe({ }, RxErrorHandler.handleEmptyError()) ) return super.onCreateView(inflater, container, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt index f208af7a5..d21b799fb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt @@ -150,7 +150,7 @@ class ItemDialogFragment : BaseDialogFragment(), SwipeRefr 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("equipped", it.key ?: "").subscribe({}, RxErrorHandler.handleEmptyError()) } dialog.addCloseButton() dialog.enqueue() @@ -204,7 +204,7 @@ class ItemDialogFragment : BaseDialogFragment(), SwipeRefr private fun feedPet(food: Food) { val pet = feedingPet ?: return (activity as? BaseActivity)?.let { - compositeSubscription.add(feedPetUseCase.observable( + it.compositeSubscription.add(feedPetUseCase.observable( FeedPetUseCase.RequestValues( pet, food, it 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 b03141c18..a145cfca2 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 @@ -136,7 +136,7 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL dialog.binding.titleView.text = it.text dialog.binding.descriptionView.text = it.notes dialog.addButton(R.string.equip, true) { _, _ -> - inventoryRepository.equip(userViewModel.user.value, "equipped", it.key ?: "").subscribe({}, RxErrorHandler.handleEmptyError()) + inventoryRepository.equip("equipped", it.key ?: "").subscribe({}, RxErrorHandler.handleEmptyError()) } dialog.addCloseButton() dialog.enqueue() 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 5c385c316..3757d58c9 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 @@ -89,7 +89,7 @@ class MountDetailRecyclerFragment : binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() this.loadItems() - adapter?.getEquipFlowable()?.flatMap { key -> inventoryRepository.equip(null, "mount", key) } + adapter?.getEquipFlowable()?.flatMap { key -> inventoryRepository.equip("mount", key) } ?.subscribe( { adapter?.currentMount = it.currentMount diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt index 3bbe400c7..a8325b5a7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt @@ -112,7 +112,7 @@ class PetDetailRecyclerFragment : compositeSubscription.add( adapter.getEquipFlowable() - .flatMap { key -> inventoryRepository.equip(null, "pet", key) } + .flatMap { key -> inventoryRepository.equip("pet", key) } .subscribe( { adapter.currentPet = it.currentPet 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 84a2a1f79..3f231fb38 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 @@ -120,7 +120,7 @@ class StableRecyclerFragment : adapter?.let { compositeSubscription.add( it.getEquipFlowable() - .flatMap { key -> inventoryRepository.equip(null, if (itemType == "pets") "pet" else "mount", key) } + .flatMap { key -> inventoryRepository.equip(if (itemType == "pets") "pet" else "mount", key) } .subscribe({ }, RxErrorHandler.handleEmptyError()) ) } 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 e7cdb480e..a194ef050 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 @@ -57,7 +57,7 @@ class AvatarSetupFragment : BaseFragment() { this.adapter = CustomizationSetupAdapter() this.adapter?.userSize = this.user?.preferences?.size ?: "slim" adapter?.updateUserEvents?.flatMap { userRepository.updateUser(it) }?.subscribeWithErrorHandler {}?.let { compositeSubscription.add(it) } - adapter?.equipGearEvents?.flatMap { inventoryRepository.equip(user, "equipped", it) }?.subscribeWithErrorHandler {}?.let { compositeSubscription.add(it) } + adapter?.equipGearEvents?.flatMap { inventoryRepository.equip("equipped", it) }?.subscribeWithErrorHandler {}?.let { compositeSubscription.add(it) } this.adapter?.user = this.user val layoutManager = LinearLayoutManager(activity) diff --git a/build.gradle b/build.gradle index 92d9f55ba..fb04a0a6a 100644 --- a/build.gradle +++ b/build.gradle @@ -8,15 +8,15 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } } dependencies { - classpath 'com.android.tools.build:gradle:7.0.4' + classpath 'com.android.tools.build:gradle:7.1.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.google.gms:google-services:4.3.10' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' classpath "io.realm:realm-gradle-plugin:10.8.1" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.19.0" - classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5" - classpath 'com.google.firebase:perf-plugin:1.4.0' + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.5.0-alpha01" + classpath 'com.google.firebase:perf-plugin:1.4.1' } }