diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 5db927fbf..9097f7117 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -238,12 +238,22 @@
Equipped
Are you sure you want to cancel this quest? All invitation acceptances will be lost. The quest owner will retain possession of the quest scroll.
Are you sure? Only %1$d of your %2$d party members have joined this quest! Quests start automatically when all players have joined or rejected the invitation.
+ 1 month ago
+ %d month ago
1d ago
%dd ago
1m ago
%dm ago
%dh ago
1h ago
+ 1 month remaining
+ %d months remaining
+ 1d remaining
+ %dd remaining
+ 1m remaining
+ %dm remaining
+ %dh remaining
+ 1h remaining
Today
Items
Eggs
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt
index 63f4f4cad..7e1fd0ef5 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt
@@ -27,8 +27,12 @@ fun Long.getAgoString(res: Resources): String {
val diffMinutes = diff / (60 * 1000) % 60
val diffHours = diff / (60 * 60 * 1000) % 24
val diffDays = diff / (24 * 60 * 60 * 1000)
+ val diffMonths = diffDays / 30
return when {
+ diffMonths != 0L -> if (diffMonths == 1L) {
+ res.getString(R.string.ago_1month)
+ } else res.getString(R.string.ago_months, diffMonths)
diffDays != 0L -> if (diffDays == 1L) {
res.getString(R.string.ago_1day)
} else res.getString(R.string.ago_days, diffDays)
@@ -38,4 +42,31 @@ fun Long.getAgoString(res: Resources): String {
diffMinutes == 1L -> res.getString(R.string.ago_1Minute)
else -> res.getString(R.string.ago_minutes, diffMinutes)
}
+}
+
+fun Date.getRemainingString(res: Resources): String {
+ return this.time.getRemainingString(res)
+}
+
+fun Long.getRemainingString(res: Resources): String {
+ val diff = this - Date().time
+
+ val diffMinutes = diff / (60 * 1000) % 60
+ val diffHours = diff / (60 * 60 * 1000) % 24
+ val diffDays = diff / (24 * 60 * 60 * 1000)
+ val diffMonths = diffDays / 30
+
+ return when {
+ diffMonths != 0L -> if (diffMonths == 1L) {
+ res.getString(R.string.remaining_1month)
+ } else res.getString(R.string.remaining_months, diffMonths)
+ diffDays != 0L -> if (diffDays == 1L) {
+ res.getString(R.string.remaining_1day)
+ } else res.getString(R.string.remaining_days, diffDays)
+ diffHours != 0L -> if (diffHours == 1L) {
+ res.getString(R.string.remaining_1hour)
+ } else res.getString(R.string.remaining_hours, diffHours)
+ diffMinutes == 1L -> res.getString(R.string.remaining_1Minute)
+ else -> res.getString(R.string.remaining_minutes, diffMinutes)
+ }
}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt
index 539cb5335..943069c8e 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt
@@ -158,7 +158,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle
if (additionalInfoView != null) {
additionalInfoView.text = drawerItem.additionalInfo
additionalInfoView.visibility = View.VISIBLE
- additionalInfoView.setTextColor(tintColor)
+ additionalInfoView.setTextColor(drawerItem.additionalInfoTextColor ?: tintColor)
}
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt
index 98f94f812..2cea1069f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt
@@ -16,6 +16,7 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
+import com.habitrpg.android.habitica.extensions.getRemainingString
import com.habitrpg.android.habitica.extensions.getThemeColor
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.AppConfigManager
@@ -232,6 +233,16 @@ class NavigationDrawerFragment : DialogFragment() {
updateItem(statsItem)
}
+ val subscriptionItem = getItemWithIdentifier(SIDEBAR_SUBSCRIPTION)
+ if (user.isSubscribed && user.purchased?.plan?.dateTerminated != null) {
+ context?.let {
+ subscriptionItem?.additionalInfo = user.purchased?.plan?.dateTerminated?.getRemainingString(it.resources)
+ subscriptionItem?.additionalInfoTextColor = it.getThemeColor(R.attr.textColorSecondary)
+ }
+ } else {
+ subscriptionItem?.additionalInfo = null
+ }
+
val promoItem = getItemWithIdentifier(SIDEBAR_SUBSCRIPTION_PROMO)
if (promoItem != null) {
promoItem.isVisible = !user.isSubscribed
@@ -268,8 +279,8 @@ class NavigationDrawerFragment : DialogFragment() {
items.add(HabiticaDrawerItem(R.id.equipmentOverviewFragment, SIDEBAR_EQUIPMENT, context.getString(R.string.sidebar_equipment)))
items.add(HabiticaDrawerItem(R.id.itemsFragment, SIDEBAR_ITEMS, context.getString(R.string.sidebar_items)))
items.add(HabiticaDrawerItem(R.id.stableFragment, SIDEBAR_STABLE, context.getString(R.string.sidebar_stable)))
- items.add(HabiticaDrawerItem(R.id.subscriptionPurchaseActivity, SIDEBAR_SUBSCRIPTION, context.getString(R.string.sidebar_subscription)))
items.add(HabiticaDrawerItem(R.id.gemPurchaseActivity, SIDEBAR_GEMS, context.getString(R.string.sidebar_gems)))
+ items.add(HabiticaDrawerItem(R.id.subscriptionPurchaseActivity, SIDEBAR_SUBSCRIPTION, context.getString(R.string.sidebar_subscription), isHeader = false, additionalInfoAsPill = false))
items.add(HabiticaDrawerItem(0, SIDEBAR_ABOUT_HEADER, context.getString(R.string.sidebar_about), true))
items.add(HabiticaDrawerItem(R.id.newsFragment, SIDEBAR_NEWS, context.getString(R.string.sidebar_news)))
items.add(HabiticaDrawerItem(R.id.FAQOverviewFragment, SIDEBAR_HELP, context.getString(R.string.sidebar_help)))
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt
index 1c1b4779f..237fffd9c 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt
@@ -1,10 +1,13 @@
package com.habitrpg.android.habitica.ui.menu
+import android.graphics.Color
+
data class HabiticaDrawerItem(val transitionId: Int, val identifier: String, val text: String, val isHeader: Boolean = false, var additionalInfoAsPill: Boolean = true) {
constructor(transitionId: Int, identifier: String) : this(transitionId, identifier, "")
var isPromo: Boolean = false
var additionalInfo: String? = null
+ var additionalInfoTextColor: Int? = null
var showBubble: Boolean = false
var isVisible: Boolean = true
var isEnabled: Boolean = true