diff --git a/Habitica/res/layout/quest_progress.xml b/Habitica/res/layout/quest_progress.xml index 2b9020ccf..b051afc45 100644 --- a/Habitica/res/layout/quest_progress.xml +++ b/Habitica/res/layout/quest_progress.xml @@ -147,6 +147,12 @@ android:orientation="vertical" android:paddingStart="@dimen/spacing_large" android:paddingEnd="@dimen/spacing_large"/> + + \ No newline at end of file diff --git a/Habitica/res/values-fr/strings.xml b/Habitica/res/values-fr/strings.xml index da2773509..93d634e2a 100644 --- a/Habitica/res/values-fr/strings.xml +++ b/Habitica/res/values-fr/strings.xml @@ -220,6 +220,7 @@ Quêtes Familiers Montures + Vous avez trouvé %d objets pour la quête Vous avez trouvé une pièce d\'équipement rare dans l\'Armoire : %s! Génial ! Vous farfouillez dans l\'Armoire et trouvez une %1$s %2$s. Qu\'est-ce que ça fait là ? Vous luttez contre l\'Armoire et gagnez de l\'expérience. Prends ça ! diff --git a/Habitica/res/values-pl/strings.xml b/Habitica/res/values-pl/strings.xml index cdab434df..389d84e21 100644 --- a/Habitica/res/values-pl/strings.xml +++ b/Habitica/res/values-pl/strings.xml @@ -213,6 +213,7 @@ Misje Zwierzaki Wierzchowce + Znalazłeś %d przedmiot(y/ów) z zadania Znalazłeś element rzadkiego Ekwipunku w Skrzyni: %s! Super! Przeszukujesz Skrzynię i znajdujesz %1$s %2$s. Co to tam robi? Mocujesz się ze Skrzynią i zyskujesz Doświadczenie. A masz! diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 72c0a4a19..17a83b5d9 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -271,6 +271,7 @@ Pets Mounts + You\'ve found %d quest items You found %s in the Armoire You rummage in the Armoire and find %1$s %2$s. What\'s that doing in here? You wrestle with the Armoire and gain Experience. Take that! diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt index d4fdf1409..0bf5f7339 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.data +import com.habitrpg.android.habitica.data.local.UserQuestStatus import com.habitrpg.android.habitica.models.Achievement import com.habitrpg.android.habitica.models.QuestAchievement import com.habitrpg.android.habitica.models.Skill @@ -77,5 +78,5 @@ interface UserRepository : BaseRepository { fun getAchievements(): Flowable> fun getQuestAchievements(): Flowable> - fun getIsUserOnQuest(): Flowable + fun getUserQuestStatus(): Flowable } 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 932d500cd..7bc59e2ed 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 @@ -73,6 +73,7 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli result.goldDelta = localData.gp - (stats?.gp ?: 0.0) result.hasLeveledUp = localData.lvl > stats?.lvl ?: 0 result.questDamage = localData._tmp?.quest?.progressDelta + result.questItemsFound = localData._tmp?.quest?.collection result.drop = localData._tmp?.drop notifyFunc?.invoke(result) @@ -105,6 +106,7 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli result.goldDelta = res.gp - (stats?.gp ?: 0.0) result.hasLeveledUp = res.lvl > stats?.lvl ?: 0 result.questDamage = res._tmp?.quest?.progressDelta + result.questItemsFound = res._tmp?.quest?.collection result.drop = res._tmp?.drop if (localData == null) { notifyFunc?.invoke(result) 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 cdee022e5..e8abf485e 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 @@ -4,6 +4,7 @@ import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.local.UserLocalRepository +import com.habitrpg.android.habitica.data.local.UserQuestStatus import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.Achievement @@ -171,8 +172,8 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } override fun readNotification(id: String): Flowable> = apiClient.readNotification(id) - override fun getIsUserOnQuest(): Flowable { - return localRepository.getIsUserOnQuest(userID) + override fun getUserQuestStatus(): Flowable { + return localRepository.getUserQuestStatus(userID) } override fun readNotifications(notificationIds: Map>): Flowable> = diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt index abd490bde..8193a221b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt @@ -9,6 +9,13 @@ import com.habitrpg.android.habitica.models.user.User import io.reactivex.Flowable import io.realm.RealmResults +enum class UserQuestStatus { + NO_QUEST, + QUEST_COLLECT, + QUEST_BOSS, + QUEST_UNKNOWN +} + interface UserLocalRepository : BaseLocalRepository { fun getTutorialSteps(): Flowable> @@ -24,5 +31,5 @@ interface UserLocalRepository : BaseLocalRepository { fun getSpecialItems(user: User): Flowable> fun getAchievements(): Flowable> fun getQuestAchievements(userID: String): Flowable> - fun getIsUserOnQuest(userID: String): Flowable + fun getUserQuestStatus(userID: String): Flowable } 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 75ec17204..67e911f19 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 @@ -1,6 +1,7 @@ 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 @@ -13,7 +14,7 @@ import io.realm.Realm import io.realm.RealmResults class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), UserLocalRepository { - override fun getIsUserOnQuest(userID: String): Flowable { + override fun getUserQuestStatus(userID: String): Flowable { return getUser(userID) .map { it.party?.id ?: "" } .filter { it.isNotBlank() } @@ -25,7 +26,12 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), .filter { groups -> groups.size > 0 } .map { groups -> groups.first() } } - .map { it.quest?.members?.find { questMember -> questMember.key == userID } != null } + .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> { 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 092b0a057..5369513e8 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 @@ -1,14 +1,18 @@ package com.habitrpg.android.habitica.interactors +import android.content.Context import android.os.Handler +import android.provider.Settings.Global.getString import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity +import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.executors.PostExecutionThread import com.habitrpg.android.habitica.executors.ThreadExecutor import com.habitrpg.android.habitica.helpers.SoundManager import com.habitrpg.android.habitica.models.responses.TaskScoringResult import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import io.reactivex.Flowable +import java.lang.StringBuilder import javax.inject.Inject class DisplayItemDropUseCase @Inject @@ -17,11 +21,18 @@ constructor(private val soundManager: SoundManager, threadExecutor: ThreadExecut override fun buildUseCaseObservable(requestValues: RequestValues): Flowable { return Flowable.defer { val data = requestValues.data + var snackbarText = StringBuilder(data?.drop?.dialog ?: "") - if (data?.drop != null) { + if (data?.questItemsFound ?: 0 > 0 && requestValues.showQuestItems) { + if (snackbarText.isNotEmpty()) + snackbarText.append('\n') + snackbarText.append(requestValues.context.getString(R.string.quest_items_found, data!!.questItemsFound)) + } + + if (snackbarText.isNotEmpty()) { Handler().postDelayed({ HabiticaSnackbar.showSnackbar(requestValues.snackbarTargetView, - data.drop?.dialog, HabiticaSnackbar.SnackbarDisplayType.DROP) + snackbarText, HabiticaSnackbar.SnackbarDisplayType.DROP) soundManager.loadAndPlayAudio(SoundManager.SoundItemDrop) }, 3000L) } @@ -30,5 +41,5 @@ constructor(private val soundManager: SoundManager, threadExecutor: ThreadExecut } } - class RequestValues(val data: TaskScoringResult?, val context: AppCompatActivity, val snackbarTargetView: ViewGroup) : UseCase.RequestValues + 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/models/inventory/QuestProgress.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestProgress.kt index eed63d322..8ab4e1d8e 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 @@ -11,6 +11,7 @@ open class QuestProgress : RealmObject() { var key: String? = null var hp: Double = 0.0 var rage: Double = 0.0 + var collectedItems: Int = 0 var collect: RealmList? = null var down: Float = 0.0f var up: Float = 0.0f 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 42f4e3e7c..3d31263ba 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 @@ -9,6 +9,7 @@ class TaskDirectionDataTemp { class TaskDirectionDataQuest { var progressDelta: Double = 0.0 + var collection: Int = 0 } class TaskDirectionDataDrop { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskScoringResult.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskScoringResult.kt index bd20eb9b1..c27faede5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskScoringResult.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/TaskScoringResult.kt @@ -9,4 +9,5 @@ class TaskScoringResult { var manaDelta: Double? = null var hasLeveledUp: Boolean = false var questDamage: Double? = null + var questItemsFound: Int? = null } 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 744c40a09..9fea7c83f 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 @@ -33,6 +33,7 @@ import com.habitrpg.android.habitica.api.HostConfig import com.habitrpg.android.habitica.api.MaintenanceApiService import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.* +import com.habitrpg.android.habitica.data.local.UserQuestStatus import com.habitrpg.android.habitica.databinding.ActivityMainBinding import com.habitrpg.android.habitica.events.* import com.habitrpg.android.habitica.events.commands.FeedCommand @@ -80,7 +81,6 @@ import io.reactivex.schedulers.Schedulers import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import java.util.* -import java.util.concurrent.TimeUnit import javax.inject.Inject open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { @@ -134,7 +134,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { private var drawerFragment: NavigationDrawerFragment? = null var drawerToggle: ActionBarDrawerToggle? = null private var resumeFromActivity = false - private var userIsOnQuest = false + private var userQuestStatus = UserQuestStatus.NO_QUEST val userID: String get() = user?.id ?: "" @@ -180,9 +180,9 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { this@MainActivity.user = newUser this@MainActivity.setUserData() }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(userRepository.getIsUserOnQuest().subscribeWithErrorHandler { - userIsOnQuest = it - }) + compositeSubscription.add(userRepository.getUserQuestStatus().subscribeWithErrorHandler(Consumer { + userQuestStatus = it + })) val viewModel = ViewModelProvider(this).get(NotificationsViewModel::class.java) notificationsViewModel = viewModel @@ -527,13 +527,23 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { internal fun displayTaskScoringResponse(data: TaskScoringResult?) { if (user != null && data != null) { + val damageValue = when (userQuestStatus) { + UserQuestStatus.QUEST_BOSS, + UserQuestStatus.QUEST_UNKNOWN -> data.questDamage + else -> 0.0 + } compositeSubscription.add(notifyUserUseCase.observable(NotifyUserUseCase.RequestValues(this, snackbarContainer, - user, data.experienceDelta, data.healthDelta, data.goldDelta, data.manaDelta, if (userIsOnQuest) data.questDamage else 0.0, data.hasLeveledUp)) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + user, data.experienceDelta, data.healthDelta, data.goldDelta, data.manaDelta, damageValue, data.hasLeveledUp)) + .subscribe(Consumer { }, RxErrorHandler.handleEmptyError())) } - compositeSubscription.add(displayItemDropUseCase.observable(DisplayItemDropUseCase.RequestValues(data, this, snackbarContainer)) - .subscribe({ }, RxErrorHandler.handleEmptyError())) + val showItemsFound = when (userQuestStatus) { + UserQuestStatus.QUEST_COLLECT, + UserQuestStatus.QUEST_UNKNOWN -> true + else -> false + } + compositeSubscription.add(displayItemDropUseCase.observable(DisplayItemDropUseCase.RequestValues(data, this, snackbarContainer, showItemsFound)) + .subscribe(Consumer { }, RxErrorHandler.handleEmptyError())) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt index 458eae88e..263c38dd0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt @@ -76,10 +76,12 @@ class OldQuestProgressView : LinearLayout { } binding.bossNameView.visibility = View.VISIBLE binding.bossHealthView.visibility = View.VISIBLE + binding.collectedItemsNumberView.visibility = View.GONE } else { binding.bossNameView.visibility = View.GONE binding.bossHealthView.visibility = View.GONE binding.bossRageView.visibility = View.GONE + binding.collectedItemsNumberView.visibility = View.VISIBLE if (progress != null) { val inflater = LayoutInflater.from(context) @@ -101,14 +103,17 @@ class OldQuestProgressView : LinearLayout { fun configure(user: User, userOnQuest: Boolean?) { val value = (user.party?.quest?.progress?.up ?: 0F).toDouble() + val collectedItems = user.party?.quest?.progress?.collectedItems if (userOnQuest == true) { binding.bossHealthView.pendingValue = value binding.bossHealthView.description = String.format("%.01f dmg pending", value) binding.bossHealthView.descriptionIconVisibility = View.VISIBLE + binding.collectedItemsNumberView.text = context.getString(R.string.quest_items_found, collectedItems) } else { binding.bossHealthView.pendingValue = 0.0 binding.bossHealthView.description = "" binding.bossHealthView.descriptionIconVisibility = View.GONE + binding.collectedItemsNumberView.text = "" } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt index 1ea70457b..a610af116 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt @@ -119,6 +119,7 @@ class QuestProgressView : LinearLayout { binding.bossNameView.visibility = View.VISIBLE binding.bossHealthView.visibility = View.VISIBLE binding.bossHealthView.set(progress.progress?.hp ?: 0.0, quest.boss?.hp?.toDouble() ?: 0.0) + binding.collectedItemsNumberView.visibility = View.GONE if (quest.boss?.hasRage() == true) { binding.rageMeterView.visibility = View.VISIBLE @@ -141,6 +142,7 @@ class QuestProgressView : LinearLayout { binding.rageMeterView.visibility = View.GONE binding.bossRageView.visibility = View.GONE binding.rageStrikeDescriptionView.visibility = View.GONE + binding.collectedItemsNumberView.visibility = View.VISIBLE val collection = progress.progress?.collect if (collection != null) { @@ -168,6 +170,8 @@ class QuestProgressView : LinearLayout { fun configure(user: User) { binding.pendingDamageTextView.text = String.format("%.01f dmg pending", (user.party?.quest?.progress?.up ?: 0F) ) + val collectedItems = user.party?.quest?.progress?.collectedItems ?: 0 + binding.collectedItemsNumberView.text = context.getString(R.string.quest_items_found, collectedItems) } private fun setupRageStrikeViews() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.kt index 346919239..eecff35b8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.kt @@ -33,6 +33,9 @@ class QuestDeserializer : JsonDeserializer { if (progressObj.has("down")) { progress.down = progressObj.get("down").asFloat } + if (progressObj.has("collectedItems")) { + progress.collectedItems = progressObj.get("collectedItems").asInt + } if (progressObj.has("collect")) { progress.collect = RealmList() for ((key, value) in progressObj.getAsJsonObject("collect").entrySet()) {