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()) {