diff --git a/Habitica/res/drawable/task_form_control_bg.xml b/Habitica/res/drawable/task_form_control_bg.xml
index 9c58286f2..0ea4196cb 100644
--- a/Habitica/res/drawable/task_form_control_bg.xml
+++ b/Habitica/res/drawable/task_form_control_bg.xml
@@ -9,7 +9,7 @@
-
-
+
diff --git a/Habitica/res/layout/activity_task_form.xml b/Habitica/res/layout/activity_task_form.xml
index aa6ecac52..4c3e4f1fb 100644
--- a/Habitica/res/layout/activity_task_form.xml
+++ b/Habitica/res/layout/activity_task_form.xml
@@ -177,7 +177,7 @@
android:id="@+id/habit_adjust_positive_input_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
- app:boxBackgroundColor="?attr/colorTintedBackgroundOffset"
+ android:background="@drawable/task_form_control_bg"
android:hint="@string/positive_habit_form"
android:layout_weight="1">
-
(localRepository, apiClient, userID), UserRepository {
- private var lastSync: Date? = null
+ companion object {
+ private var lastReadNotification: String? = null
+ private var lastSync: Date? = null
+ }
+
override fun getUser(): Flow = getUser(userID)
override fun getUser(userID: String): Flow = localRepository.getUser(userID)
@@ -64,7 +68,7 @@ class UserRepositoryImpl(
@Suppress("ReturnCount")
override suspend fun retrieveUser(withTasks: Boolean, forced: Boolean, overrideExisting: Boolean): User? {
// Only retrieve again after 3 minutes or it's forced.
- if (forced || this.lastSync == null || Date().time - (this.lastSync?.time ?: 0) > 180000) {
+ if (forced || lastSync == null || Date().time - (lastSync?.time ?: 0) > 180000) {
val user = apiClient.retrieveUser(withTasks) ?: return null
lastSync = Date()
withContext(Dispatchers.Main) {
@@ -154,11 +158,12 @@ class UserRepositoryImpl(
override suspend fun unlockPath(path: String, price: Int): UnlockResponse? {
val unlockResponse = apiClient.unlockPath(path) ?: return null
val user = localRepository.getUser(userID).firstOrNull() ?: return unlockResponse
- user.preferences = unlockResponse.preferences
- user.purchased = unlockResponse.purchased
- user.items = unlockResponse.items
- user.balance = user.balance - (price / 4.0)
- localRepository.saveUser(user, false)
+ localRepository.modify(user) { liveUser ->
+ liveUser.preferences = unlockResponse.preferences
+ liveUser.purchased = unlockResponse.purchased
+ liveUser.items = unlockResponse.items
+ liveUser.balance = liveUser.balance - (price / 4.0)
+ }
return unlockResponse
}
@@ -166,7 +171,6 @@ class UserRepositoryImpl(
runCron(ArrayList())
}
- private var lastReadNotification: String? = null
override suspend fun readNotification(id: String): List? {
if (lastReadNotification == id) return null
lastReadNotification = id
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 08ccb0359..0cfa9fb2b 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
@@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.models.promotions.HabiticaWebPromotion
import com.habitrpg.android.habitica.models.promotions.getHabiticaPromotionFromKey
import com.habitrpg.common.habitica.helpers.AppTestingLevel
import kotlinx.coroutines.MainScope
+import java.util.Date
class AppConfigManager(contentRepository: ContentRepository?): com.habitrpg.common.habitica.helpers.AppConfigManager() {
@@ -169,6 +170,6 @@ class AppConfigManager(contentRepository: ContentRepository?): com.habitrpg.comm
fun getBirthdayEvent(): WorldStateEvent? {
val events = ((worldState?.events as? List) ?: listOf(worldState?.currentEvent))
- return events.firstOrNull { it?.eventKey == "birthday10" }
+ return events.firstOrNull { it?.eventKey == "birthday10" && it.end?.after(Date()) == true }
}
}
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 a8fbfa936..10403547b 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
@@ -24,16 +24,19 @@ import com.habitrpg.android.habitica.helpers.ExceptionHandler
import com.habitrpg.android.habitica.helpers.launchCatching
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel
+import com.habitrpg.common.habitica.extensions.loadImage
import com.habitrpg.common.habitica.models.Notification
import com.habitrpg.common.habitica.models.notifications.GroupTaskApprovedData
import com.habitrpg.common.habitica.models.notifications.GroupTaskNeedsWorkData
import com.habitrpg.common.habitica.models.notifications.GroupTaskRequiresApprovalData
import com.habitrpg.common.habitica.models.notifications.GuildInvitationData
+import com.habitrpg.common.habitica.models.notifications.ItemReceivedData
import com.habitrpg.common.habitica.models.notifications.NewChatMessageData
import com.habitrpg.common.habitica.models.notifications.NewStuffData
import com.habitrpg.common.habitica.models.notifications.PartyInvitationData
import com.habitrpg.common.habitica.models.notifications.QuestInvitationData
import com.habitrpg.common.habitica.models.notifications.UnallocatedPointsData
+import com.habitrpg.common.habitica.views.PixelArtView
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import javax.inject.Inject
@@ -134,6 +137,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
Notification.Type.PARTY_INVITATION.type -> createPartyInvitationNotification(it)
Notification.Type.GUILD_INVITATION.type -> createGuildInvitationNotification(it)
Notification.Type.QUEST_INVITATION.type -> createQuestInvitationNotification(it)
+ Notification.Type.ITEM_RECEIVED.type -> createItemReceivedNotification(it)
else -> null
}
@@ -165,6 +169,15 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
)
}
+ private fun createItemReceivedNotification(notification: Notification): View? {
+ val data = notification.data as? ItemReceivedData
+ return createDismissableNotificationItem(
+ notification,
+ fromHtml("" + data?.title + "
" + data?.text),
+ imageName = data?.icon
+ )
+ }
+
private fun createNewStuffNotification(notification: Notification): View? {
val data = notification.data as? NewStuffData
val text = if (data?.title != null) {
@@ -206,7 +219,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
notification,
fromHtml(message),
null,
- R.color.yellow_5
+ textColor = R.color.yellow_5
)
}
@@ -218,7 +231,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
notification,
fromHtml(message),
null,
- R.color.green_10
+ textColor = R.color.green_10
)
}
@@ -252,6 +265,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
notification: Notification,
messageText: CharSequence,
imageResourceId: Int? = null,
+ imageName: String? = null,
textColor: Int? = null
): View? {
val item = inflater?.inflate(R.layout.notification_item, binding.notificationItems, false)
@@ -276,6 +290,12 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
notificationImage?.visibility = View.VISIBLE
}
+ if (imageName != null) {
+ val notificationImage = item?.findViewById(R.id.notification_image) as? PixelArtView
+ notificationImage?.loadImage(imageName)
+ notificationImage?.visibility = View.VISIBLE
+ }
+
if (textColor != null) {
messageTextView?.setTextColor(ContextCompat.getColor(this, textColor))
}
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 26a345932..48743196d 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
@@ -110,7 +110,8 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler
var lastSet = CustomizationSet()
val today = Date()
for (customization in newCustomizationList) {
- val isUsable = customization.isUsable(ownedCustomizations.contains(customization.id))
+ val isOwned = ownedCustomizations.contains(customization.id)
+ val isUsable = customization.isUsable(isOwned)
if (customization.availableFrom != null || customization.availableUntil != null) {
if (((customization.availableFrom?.compareTo(today)
?: 0) > 0 || (customization.availableUntil?.compareTo(today)
@@ -119,7 +120,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler
continue
}
}
- if ((customization.identifier?.contains("HabitversaryBash") == true || customization.identifier?.contains("birthday") == true) && !isUsable) {
+ if (customization.identifier?.contains("birthday_bash") == true && !isOwned) {
continue
}
if (customization.customizationSet != null && customization.customizationSet != lastSet.identifier) {
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 4bcc53db2..556cacc34 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
@@ -252,7 +252,7 @@ abstract class BaseTaskViewHolder constructor(
val completedCount = data.group?.assignedUsersDetail?.filter { it.completed }?.size ?: 0
if (completedCount > 0) {
- completedCountTextView.text = "$completedCount / ${data?.group?.assignedUsersDetail?.size}"
+ completedCountTextView.text = "$completedCount/${data?.group?.assignedUsersDetail?.size}"
completedCountTextView.visibility = View.VISIBLE
} else {
completedCountTextView.visibility = View.GONE
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 292a1465c..1d313468c 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
@@ -16,6 +16,7 @@ import com.habitrpg.common.habitica.models.Notification
import com.habitrpg.common.habitica.models.notifications.GroupTaskRequiresApprovalData
import com.habitrpg.common.habitica.models.notifications.GuildInvitationData
import com.habitrpg.common.habitica.models.notifications.GuildInvite
+import com.habitrpg.common.habitica.models.notifications.ItemReceivedData
import com.habitrpg.common.habitica.models.notifications.NewChatMessageData
import com.habitrpg.common.habitica.models.notifications.NewStuffData
import com.habitrpg.common.habitica.models.notifications.PartyInvitationData
@@ -41,7 +42,8 @@ open class NotificationsViewModel : BaseViewModel() {
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.UNALLOCATED_STATS_POINTS.type,
+ Notification.Type.ITEM_RECEIVED.type
)
private val actionableNotificationTypes = listOf(
@@ -262,6 +264,19 @@ open class NotificationsViewModel : BaseViewModel() {
// Group tasks should go to Group tasks view if that is added to this app at some point
Notification.Type.GROUP_TASK_APPROVED.type -> navController.navigate(R.id.tasksFragment)
Notification.Type.GROUP_TASK_NEEDS_WORK.type -> navController.navigate(R.id.tasksFragment)
+ Notification.Type.ITEM_RECEIVED.type -> clickItemReceivedNotification(notification, navController)
+ }
+ }
+
+ private fun clickItemReceivedNotification(
+ notification: Notification,
+ navController: MainNavigationController
+ ) {
+ val data = notification.data as? ItemReceivedData
+ when (data?.destination) {
+ "equipment" -> navController.navigate(R.id.equipmentOverviewFragment)
+ "customization" -> navController.navigate(R.id.avatarCustomizationFragment)
+ else -> navController.navigate(R.id.itemsFragment)
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/BirthdayMenuView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/BirthdayMenuView.kt
index 81b72dc30..3ac7cf869 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/BirthdayMenuView.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/BirthdayMenuView.kt
@@ -1,7 +1,5 @@
package com.habitrpg.android.habitica.ui.views.promo
-import android.os.Handler
-import android.os.Looper
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
@@ -17,7 +15,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -25,34 +23,30 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.getShortRemainingString
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.views.PixelArtView
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.delay
import java.util.Date
+import kotlin.time.Duration.Companion.hours
+import kotlin.time.Duration.Companion.milliseconds
+import kotlin.time.Duration.Companion.minutes
+import kotlin.time.Duration.Companion.seconds
@Composable
fun BirthdayBanner(endDate: Date, modifier: Modifier = Modifier) {
- var value by remember { mutableStateOf(0) }
-
- DisposableEffect(Unit) {
- val handler = Handler(Looper.getMainLooper())
-
- val runnable = {
- value += 1
- }
-
- handler.postDelayed(runnable, 1000)
-
- onDispose {
- handler.removeCallbacks(runnable)
- }
+ if (endDate.before(Date())) {
+ return
}
Column(
modifier
@@ -114,11 +108,9 @@ fun BirthdayBanner(endDate: Date, modifier: Modifier = Modifier) {
.background(colorResource(R.color.brand_300))
.padding(horizontal = 10.dp)
) {
- Text(
- stringResource(
- R.string.ends_in_x,
- endDate.getShortRemainingString()
- ).uppercase(),
+ TimeRemainingText(
+ endDate,
+ R.string.ends_in_x,
color = colorResource(R.color.yellow_50),
fontSize = 12.sp,
fontWeight = FontWeight.Bold
@@ -133,4 +125,35 @@ fun BirthdayBanner(endDate: Date, modifier: Modifier = Modifier) {
}
}
}
+}
+
+@Composable
+fun TimeRemainingText(
+ endDate: Date,
+ formatString: Int,
+ color: Color,
+ fontSize: TextUnit,
+ fontWeight: FontWeight
+) {
+ var value by remember { mutableStateOf(0) }
+ LaunchedEffect(Unit) {
+ val diff = endDate.time - Date().time
+ if (diff.milliseconds > 1.hours) {
+ delay(1.minutes)
+ } else if (diff < 0) {
+ this.cancel()
+ } else {
+ delay(1.seconds)
+ }
+ value += 1
+ }
+ Text(
+ stringResource(
+ formatString,
+ endDate.getShortRemainingString()
+ ).uppercase(),
+ color = color,
+ fontSize = fontSize,
+ fontWeight = fontWeight
+ )
}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt
index a8ed7f41f..5b14c75bc 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt
@@ -401,9 +401,13 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop
observable = { inventoryRepository.purchaseItem(shopItem.purchaseType, shopItem.key, quantity) }
}
lifecycleScope.launchCatching {
- val result = observable() ?: return@launchCatching
- val text = snackbarText[0].ifEmpty {
- context.getString(R.string.successful_purchase, shopItem.text)
+ observable()
+ val text = snackbarText[0].ifBlank {
+ if (shopItem.text?.isNotBlank() == true) {
+ context.getString(R.string.successful_purchase, shopItem.text)
+ } else {
+ context.getString(R.string.purchased)
+ }
}
val rightTextColor = when (item.currency) {
"gold" -> ContextCompat.getColor(context, R.color.text_yellow)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/AssignedView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/AssignedView.kt
index 6c76f2203..10ba61978 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/AssignedView.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/AssignedView.kt
@@ -93,7 +93,7 @@ fun AssignedView(
Image(
painterResource(R.drawable.edit),
null,
- colorFilter = ColorFilter.tint(MaterialTheme.colors.primary)
+ colorFilter = ColorFilter.tint(color)
)
Text(
stringResource(R.string.edit_assignees), color = color,
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/TaskDifficultyButtons.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/TaskDifficultyButtons.kt
index f0c1c486c..317718187 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/TaskDifficultyButtons.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/TaskDifficultyButtons.kt
@@ -79,9 +79,12 @@ private fun TaskDifficultySelection(
) {
val selectedState = updateTransition(selected)
val context = LocalContext.current
- val textColor = selectedState.animateColor {
+ val iconColor = selectedState.animateColor {
if (it) HabiticaTheme.colors.tintedUiDetails else Color(context.getThemeColor(R.attr.textColorTintedSecondary))
}
+ val textColor = selectedState.animateColor {
+ if (it) Color(context.getThemeColor(R.attr.textColorTintedPrimary)) else Color(context.getThemeColor(R.attr.textColorTintedSecondary))
+ }
Column(horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(6.dp), modifier = modifier) {
Box(
contentAlignment = Alignment.Center, modifier = Modifier
@@ -105,7 +108,7 @@ private fun TaskDifficultySelection(
.background(HabiticaTheme.colors.tintedUiMain, MaterialTheme.shapes.medium)
)
}
- Image(icon, null, colorFilter = ColorFilter.tint(textColor.value))
+ Image(icon, null, colorFilter = ColorFilter.tint(iconColor.value))
}
Text(
text,
diff --git a/common/src/main/java/com/habitrpg/common/habitica/models/Notification.kt b/common/src/main/java/com/habitrpg/common/habitica/models/Notification.kt
index 47d84823b..bce925a82 100644
--- a/common/src/main/java/com/habitrpg/common/habitica/models/Notification.kt
+++ b/common/src/main/java/com/habitrpg/common/habitica/models/Notification.kt
@@ -7,6 +7,7 @@ import com.habitrpg.common.habitica.models.notifications.GroupTaskApprovedData
import com.habitrpg.common.habitica.models.notifications.GroupTaskNeedsWorkData
import com.habitrpg.common.habitica.models.notifications.GroupTaskRequiresApprovalData
import com.habitrpg.common.habitica.models.notifications.GuildInvitationData
+import com.habitrpg.common.habitica.models.notifications.ItemReceivedData
import com.habitrpg.common.habitica.models.notifications.LoginIncentiveData
import com.habitrpg.common.habitica.models.notifications.NewChatMessageData
import com.habitrpg.common.habitica.models.notifications.NewStuffData
@@ -27,6 +28,7 @@ class Notification {
GROUP_TASK_REQUIRES_APPROVAL("GROUP_TASK_REQUIRES_APPROVAL"),
UNALLOCATED_STATS_POINTS("UNALLOCATED_STATS_POINTS"),
WON_CHALLENGE("WON_CHALLENGE"),
+ ITEM_RECEIVED("ITEM_RECEIVED"),
// Achievements
ACHIEVEMENT_PARTY_UP("ACHIEVEMENT_PARTY_UP"),
@@ -93,6 +95,7 @@ class Notification {
Type.FIRST_DROP.type -> FirstDropData::class.java
Type.ACHIEVEMENT_GENERIC.type -> AchievementData::class.java
Type.WON_CHALLENGE.type -> ChallengeWonData::class.java
+ Type.ITEM_RECEIVED.type -> ItemReceivedData::class.java
Type.ACHIEVEMENT_ALL_YOUR_BASE.type -> AchievementData::class.java
Type.ACHIEVEMENT_BACK_TO_BASICS.type -> AchievementData::class.java
diff --git a/common/src/main/java/com/habitrpg/common/habitica/models/notifications/ItemReceivedData.kt b/common/src/main/java/com/habitrpg/common/habitica/models/notifications/ItemReceivedData.kt
new file mode 100644
index 000000000..31b12e756
--- /dev/null
+++ b/common/src/main/java/com/habitrpg/common/habitica/models/notifications/ItemReceivedData.kt
@@ -0,0 +1,8 @@
+package com.habitrpg.common.habitica.models.notifications
+
+open class ItemReceivedData: NotificationData {
+ var title: String? = null
+ var text: String? = null
+ var icon: String? = null
+ var destination: String? = null
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/habitrpg/common/habitica/models/notifications/QuestInvitationData.kt b/common/src/main/java/com/habitrpg/common/habitica/models/notifications/QuestInvitationData.kt
index a8a9eb67a..fb268cb9f 100644
--- a/common/src/main/java/com/habitrpg/common/habitica/models/notifications/QuestInvitationData.kt
+++ b/common/src/main/java/com/habitrpg/common/habitica/models/notifications/QuestInvitationData.kt
@@ -1,6 +1,5 @@
package com.habitrpg.common.habitica.models.notifications
open class QuestInvitationData : NotificationData {
-
var questKey: String? = null
}
diff --git a/version.properties b/version.properties
index a7b7d53e5..b4641220f 100644
--- a/version.properties
+++ b/version.properties
@@ -1,2 +1,2 @@
NAME=4.1
-CODE=5071
\ No newline at end of file
+CODE=5081
\ No newline at end of file