diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index c55ce6d60..5873482a7 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -1352,6 +1352,7 @@
To keep the party going, we’ll be giving away Party Robes, 20 Gems, and a limited edition Cape set and Background!
This is a limited time event that starts on %1$s and will end %2$s. The Limited Edition Jubilant Gryphatrice and ten Magic Hatching Potions will be available to buy during this time. The other Gifts listed in the Four for Free section will be automatically delivered to all accounts that were active in the 30 days prior to day the gift is sent. Accounts created after the gifts are sent will not be able to claim them.
Visit the Market
+ Visit Market
Exclusive items and gifts await
Ends in %s
See More
@@ -1469,6 +1470,8 @@
Subscribe to buy Gems with Gold and receive these other exclusive benefits!
Subscribers get Mystic Hourglasses to buy items in the Time Travelers Shop and these other exclusive benefits!
SUBSCRIBER BENEFIT
+ You don\'t have any Saddles
+ Saddles instantly raise a Pet to a Mount. You can purchase one from the Market.
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 bccd6cb54..76bdd40cb 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
@@ -57,6 +57,9 @@ interface ApiService {
@GET("user/")
suspend fun getUser(): HabitResponse
+ @GET("user/stat-sync")
+ suspend fun syncUserStats(): HabitResponse
+
@GET("inbox/messages")
suspend fun getInboxMessages(@Query("conversation") uuid: String, @Query("page") page: Int): HabitResponse>
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt
index d34aedcd0..723a1a310 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
@@ -283,4 +283,5 @@ interface ApiClient {
suspend fun markTaskNeedsWork(taskID: String, userID: String): Task?
suspend fun retrievePartySeekingUsers(page: Int): List?
suspend fun getGroupInvites(groupId: String, includeAllPublicFields: Boolean?): List?
+ suspend fun syncUserStats(): User?
}
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 7ff6508aa..4592371bf 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
@@ -85,4 +85,5 @@ interface UserRepository : BaseRepository {
fun getTeamPlans(): Flow>
suspend fun retrieveTeamPlan(teamID: String): Group?
fun getTeamPlan(teamID: String): Flow
+ suspend fun syncUserStats(): User?
}
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 b1e31be3f..9d5b8b701 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
@@ -390,6 +390,8 @@ class ApiClientImpl(
override suspend fun getStatus(): Status? = process { apiService.getStatus() }
+ override suspend fun syncUserStats(): User? = process { apiService.syncUserStats() }
+
override suspend fun getContent(language: String?): ContentResult? {
return process { apiService.getContent(language ?: this.languageCode) }
}
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 fb137124e..24de57ab5 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
@@ -52,6 +52,14 @@ class UserRepositoryImpl(
override fun getUser(): Flow = authenticationHandler.userIDFlow.flatMapLatest { getUser(it) }
override fun getUser(userID: String): Flow = localRepository.getUser(userID)
+ override suspend fun syncUserStats(): User? {
+ val user = apiClient.syncUserStats()
+ if (user != null) {
+ localRepository.saveUser(user)
+ }
+ return user
+ }
+
private suspend fun updateUser(userID: String, updateData: Map): User? {
val networkUser = apiClient.updateUser(updateData) ?: return null
val oldUser = localRepository.getUser(userID).firstOrNull()
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 d736326b6..effadad46 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
@@ -109,7 +109,7 @@ class FullProfileActivity : BaseActivity() {
binding.avatarWithBars.setContent {
HabiticaTheme {
- AppHeaderView(member.value, isMyProfile = isMyProfile(), onMemberRowClicked = {}, onClassSelectionClicked = {})
+ AppHeaderView(member.value, isMyProfile = false, onMemberRowClicked = {}, onClassSelectionClicked = {})
}
}
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 64a498f17..aa57a993a 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
@@ -601,7 +601,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity {
inventoryRepository.getQuestContent(user.party?.quest?.completed ?: "")
.firstOrNull()
if (questContent != null) {
- QuestCompletedDialog.showWithQuest(this@MainActivity, questContent)
+ QuestCompletedDialog.showWithQuest(this@MainActivity, questContent, userRepository)
}
viewModel.updateUser("party.quest.completed", "")
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt
index 91d88261b..4562ccf81 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt
@@ -182,7 +182,7 @@ fun AppHeaderView(
disabled = true,
modifier = Modifier.weight(1f)
)
- } else if (user?.hasClass == false && isMyProfile && isPlayerOptedOutOfClass == false) {
+ } else if (user?.hasClass == false && isMyProfile && !isPlayerOptedOutOfClass) {
HabiticaButton(
background = HabiticaTheme.colors.basicButtonColor(),
color = MaterialTheme.colors.onPrimary,
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 3ad23967f..6bd9feb02 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
@@ -2,10 +2,15 @@ package com.habitrpg.android.habitica.ui.views.dialogs
import android.content.Context
import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.models.inventory.QuestContent
+import kotlinx.coroutines.MainScope
+import kotlinx.coroutines.launch
class QuestCompletedDialog(context: Context) : HabiticaAlertDialog(context) {
+ lateinit var userRepository: UserRepository
+
var quest: QuestContent? = null
set(value) {
field = value
@@ -17,21 +22,26 @@ class QuestCompletedDialog(context: Context) : HabiticaAlertDialog(context) {
}
override fun dismiss() {
- dialog = null
+ MainScope().launch {
+ userRepository.syncUserStats()
+ }
+ isShowingDialog = false
super.dismiss()
}
companion object {
- private var dialog: QuestCompletedDialog? = null
+ private var isShowingDialog = false
- fun showWithQuest(context: Context, quest: QuestContent) {
- if (dialog != null) return
+ fun showWithQuest(context: Context, quest: QuestContent, userRepository: UserRepository) {
+ if (isShowingDialog) return
- dialog = QuestCompletedDialog(context)
- dialog?.quest = quest
- dialog?.setTitle(R.string.quest_completed)
- dialog?.addButton(R.string.onwards, isPrimary = true, isDestructive = false)
- dialog?.enqueue()
+ val dialog = QuestCompletedDialog(context)
+ dialog.userRepository = userRepository
+ dialog.quest = quest
+ dialog.setTitle(R.string.quest_completed)
+ dialog.addButton(R.string.onwards, isPrimary = true, isDestructive = false)
+ dialog.enqueue()
+ isShowingDialog = true
}
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stable/PetBottomSheet.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stable/PetBottomSheet.kt
index c263c4e79..896527df8 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stable/PetBottomSheet.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stable/PetBottomSheet.kt
@@ -65,6 +65,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.zIndex
import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.extensions.addCloseButton
import com.habitrpg.android.habitica.interactors.ShareMountUseCase
import com.habitrpg.android.habitica.interactors.SharePetUseCase
import com.habitrpg.android.habitica.models.inventory.Food
@@ -74,6 +75,7 @@ import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.HabiticaButton
import com.habitrpg.android.habitica.ui.views.PixelArtView
+import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.common.habitica.extensions.getThemeColor
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.common.habitica.helpers.launchCatching
@@ -256,6 +258,7 @@ fun PetBottomSheet(
horizontalArrangement = Arrangement.spacedBy(16.dp),
modifier = Modifier.padding(bottom = 16.dp)
) {
+ val context = LocalContext.current
HabiticaButton(
Color(LocalContext.current.getThemeColor(R.attr.colorTintedBackgroundOffset)),
HabiticaTheme.colors.textPrimary,
@@ -267,7 +270,13 @@ fun PetBottomSheet(
onFeed?.invoke(pet, saddle)
}
} else {
- MainNavigationController.navigate(R.id.marketFragment)
+ val dialog = HabiticaAlertDialog(context)
+ dialog.setTitle(R.string.no_saddles)
+ dialog.setMessage(R.string.purchase_saddles_in_market)
+ dialog.addButton(R.string.visit_market, isPrimary = true) { _, _ ->
+ MainNavigationController.navigate(R.id.marketFragment)
+ }
+ dialog.addCloseButton()
}
onDismiss()
}, modifier = Modifier
diff --git a/version.properties b/version.properties
index 772215471..d3b831d16 100644
--- a/version.properties
+++ b/version.properties
@@ -1,2 +1,2 @@
-NAME=4.3.1
-CODE=6761
\ No newline at end of file
+NAME=4.3.2
+CODE=6781
\ No newline at end of file