diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 14317107a..2c05a47a1 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -162,7 +162,7 @@ android {
multiDexEnabled true
resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW"
- versionCode 2497
+ versionCode 2500
versionName "2.8"
}
diff --git a/Habitica/res/color/task_form_box_stroke.xml b/Habitica/res/color/task_form_box_stroke.xml
new file mode 100644
index 000000000..f8eaeebf9
--- /dev/null
+++ b/Habitica/res/color/task_form_box_stroke.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/pill_bg_gray.xml b/Habitica/res/drawable/pill_bg_gray.xml
index c5f636827..fc8626c84 100644
--- a/Habitica/res/drawable/pill_bg_gray.xml
+++ b/Habitica/res/drawable/pill_bg_gray.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/Habitica/res/layout/activity_task_form.xml b/Habitica/res/layout/activity_task_form.xml
index b0a33ddaa..ca908127c 100644
--- a/Habitica/res/layout/activity_task_form.xml
+++ b/Habitica/res/layout/activity_task_form.xml
@@ -17,7 +17,6 @@
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:theme="@style/Toolbar"
- android:background="@color/brand_300"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"/>
@@ -47,7 +46,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TaskFormTextInputLayoutAppearance"
- app:boxStrokeColor="?attr/colorPrimaryDark"
+ app:boxStrokeColor="?attr/colorPrimary"
+ android:backgroundTint="?attr/colorPrimary"
android:alpha="0.75">
+ android:textColor="@color/gray_200"/>
+
-
+
+
+ android:layout_width="68dp"
+ android:layout_height="68dp"
+ android:layout_gravity="center"
+ app:actualImageScaleType="fitCenter"
+ />
+
Keep %d Tasks
Delete %d Tasks
%s Challenge Task
+ %s Pets
+ %s Mounts
diff --git a/Habitica/res/values/styles.xml b/Habitica/res/values/styles.xml
index 974a440b9..f6e75cc06 100644
--- a/Habitica/res/values/styles.xml
+++ b/Habitica/res/values/styles.xml
@@ -273,7 +273,7 @@
@@ -387,6 +387,7 @@
- @dimen/pill_horizontal_padding
- @dimen/pill_vertical_padding
- @dimen/pill_vertical_padding
+ - @color/gray_200
@@ -649,9 +653,9 @@
- @color/taskform_gray
- ?attr/colorPrimaryText
- @color/gray_300
- - @color/gray_400
- - @color/brand_400
- - @color/brand_400
+ - ?attr/colorPrimary
+ - ?attr/colorPrimary
+ - ?attr/colorPrimary
- @color/brand_400
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Animal-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Animal-Extensions.kt
index 102b47cc1..1f3b97fe7 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Animal-Extensions.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Animal-Extensions.kt
@@ -9,16 +9,14 @@ fun Animal.getTranslatedType(c: Context?): String {
return type
}
- var currType: String = when (type) {
- "drop" -> c?.getString(R.string.standard).toString()
- "quest" -> c?.getString(R.string.quest).toString()
- "wacky" -> c?.getString(R.string.wacky).toString()
- "special" -> c?.getString(R.string.special).toString()
- "premium" -> c?.getString(R.string.magic_potion).toString()
+ return when (type) {
+ "drop" -> c.getString(R.string.standard)
+ "quest" -> c.getString(R.string.quest)
+ "wacky" -> c.getString(R.string.wacky)
+ "special" -> c.getString(R.string.special)
+ "premium" -> c.getString(R.string.magic_potion)
else -> {
type
}
}
-
- return currType
}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt
index 2f38a4f59..f2fe79897 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt
@@ -118,12 +118,10 @@ class TaskFormActivity : BaseActivity() {
private var tintColor: Int = 0
set(value) {
field = value
- upperTextWrapper.setBackgroundColor(value)
taskDifficultyButtons.tintColor = value
habitScoringButtons.tintColor = value
habitResetStreakButtons.tintColor = value
taskSchedulingControls.tintColor = value
- supportActionBar?.setBackgroundDrawable(ColorDrawable(value))
updateTagViewsColors()
}
@@ -153,12 +151,22 @@ class TaskFormActivity : BaseActivity() {
} else {
"purple"
}
-
super.onCreate(savedInstanceState)
+
+ if (forcedTheme == "yellow") {
+ taskDifficultyButtons.textTintColor = ContextCompat.getColor(this, R.color.yellow_5)
+ habitScoringButtons.textTintColor = ContextCompat.getColor(this, R.color.yellow_5)
+ }
+
+
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
tintColor = getThemeColor(R.attr.taskFormTint)
+ val upperTintColor = getThemeColor(R.attr.colorAccent)
+ supportActionBar?.setBackgroundDrawable(ColorDrawable(upperTintColor))
+ upperTextWrapper.setBackgroundColor(upperTintColor)
+
isChallengeTask = bundle.getBoolean(IS_CHALLENGE_TASK, false)
@@ -172,7 +180,7 @@ class TaskFormActivity : BaseActivity() {
setTagViews()
}, RxErrorHandler.handleEmptyError()))
compositeSubscription.add(userRepository.getUser().subscribe(Consumer {
- usesTaskAttributeStats = it.preferences?.allocationMode == "taskbased"
+ usesTaskAttributeStats = it.preferences?.allocationMode == "taskbased" && it.preferences?.automaticAllocation == true
configureForm()
}, RxErrorHandler.handleEmptyError()))
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.kt
index f99e55976..259eec1a0 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/MountDetailRecyclerAdapter.kt
@@ -36,7 +36,7 @@ class MountDetailRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Ada
override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) {
when (val obj = this.itemList[position]) {
- is String -> (holder as? SectionViewHolder)?.bind(obj)
+ is StableSection -> (holder as? SectionViewHolder)?.bind(obj)
is Mount -> (holder as? MountViewHolder)?.bind(obj, ownedMounts?.get(obj.key ?: "")?.owned == true)
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt
index 1ceeb000f..e0b46ec18 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt
@@ -4,6 +4,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.ContextCompat
+import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
@@ -24,6 +25,7 @@ import io.reactivex.subjects.PublishSubject
class StableRecyclerAdapter : RecyclerView.Adapter() {
+ var shopSpriteSuffix: String? = null
private var eggs: Map = mapOf()
var animalIngredientsRetriever: ((Animal) -> Pair)? = null
var itemType: String? = null
@@ -53,7 +55,14 @@ class StableRecyclerAdapter : RecyclerView.Adapter() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (val item = this.itemList[position]) {
"header" -> (holder as? StableHeaderViewHolder)?.bind()
- is StableSection -> (holder as? SectionViewHolder)?.bind(item)
+ is StableSection -> {
+ if (item.key == "drop") {
+ val params = holder.itemView.layoutParams as GridLayoutManager.LayoutParams
+ params.topMargin = -30
+ holder.itemView.layoutParams = params
+ }
+ (holder as? SectionViewHolder)?.bind(item)
+ }
is Animal -> {
val isIndividualAnimal = item.type == "special" || item.type == "wacky"
if (isIndividualAnimal) {
@@ -109,11 +118,12 @@ class StableRecyclerAdapter : RecyclerView.Adapter() {
notifyDataSetChanged()
}
- internal class StableHeaderViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder(parent.inflate(R.layout.shop_header)) {
+ internal inner class StableHeaderViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder(parent.inflate(R.layout.shop_header)) {
private var binding: ShopHeaderBinding = ShopHeaderBinding.bind(itemView)
fun bind() {
+ binding.npcBannerView.shopSpriteSuffix = shopSpriteSuffix ?: ""
binding.npcBannerView.identifier = "stable"
binding.namePlate.setText(R.string.stable_owner)
binding.descriptionView.visibility = View.GONE
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt
index 2551b98b1..988b5337f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt
@@ -135,7 +135,8 @@ class MountDetailRecyclerFragment : BaseMainFragment() {
for (mount in unsortedAnimals) {
if (mount.type == "wacky" || mount.type == "special") continue
if (mount.type != lastMount?.type) {
- currentSection = StableSection(mount.type, mount.getTranslatedType(context))
+ val title = context?.getString(R.string.pet_category, mount.getTranslatedType(context))
+ currentSection = StableSection(mount.type, title ?: "")
items.add(currentSection)
}
currentSection?.let {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt
index 37b6b6c9f..a9e9c4f2a 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt
@@ -24,6 +24,7 @@ import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.helpers.resetViews
import io.reactivex.functions.BiFunction
import io.reactivex.functions.Consumer
+import io.reactivex.rxkotlin.combineLatest
import io.realm.RealmResults
import org.greenrobot.eventbus.Subscribe
import java.util.ArrayList
@@ -140,35 +141,35 @@ class PetDetailRecyclerFragment : BaseMainFragment() {
}
.subscribe(Consumer { adapter.setOwnedMounts(it) }, RxErrorHandler.handleEmptyError()))
compositeSubscription.add(inventoryRepository.getOwnedItems(true).subscribe(Consumer { adapter.setOwnedItems(it) }, RxErrorHandler.handleEmptyError()))
- compositeSubscription.add(inventoryRepository.getPets(animalType, animalGroup, animalColor).zipWith(inventoryRepository.getOwnedPets()
+ compositeSubscription.add(inventoryRepository.getPets(animalType, animalGroup, animalColor).combineLatest(inventoryRepository.getOwnedPets()
.map { ownedPets ->
val petMap = mutableMapOf()
ownedPets.forEach { petMap[it.key ?: ""] = it }
return@map petMap
}.doOnNext {
adapter.setOwnedPets(it)
- }, BiFunction, Map, List> { unsortedAnimals, ownedAnimals ->
+ }).map {
val items = mutableListOf()
var lastPet: Pet? = null
var currentSection: StableSection? = null
- for (pet in unsortedAnimals) {
+ for (pet in it.first) {
if (pet.type == "wacky" || pet.type == "special") continue
if (pet.type != lastPet?.type) {
- currentSection = StableSection(pet.type, pet.getTranslatedType(context))
+ val title = context?.getString(R.string.pet_category, pet.getTranslatedType(context))
+ currentSection = StableSection(pet.type, title ?: "")
items.add(currentSection)
}
- currentSection?.let {
- it.totalCount += 1
- if (ownedAnimals.containsKey(pet.key)) {
- it.ownedCount += 1
+ currentSection?.let {section ->
+ section.totalCount += 1
+ if (it.second.containsKey(pet.key)) {
+ section.ownedCount += 1
}
}
items.add(pet)
lastPet = pet
}
items
- })
- .subscribe(Consumer { adapter.setItemList(it) }, RxErrorHandler.handleEmptyError()))
+ }.subscribe(Consumer { adapter.setItemList(it) }, RxErrorHandler.handleEmptyError()))
compositeSubscription.add(inventoryRepository.getMounts(animalType, animalGroup, animalColor).subscribe(Consumer> { adapter.setExistingMounts(it) }, RxErrorHandler.handleEmptyError()))
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt
index 9e8788e91..0fd1eb5c7 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt
@@ -10,6 +10,7 @@ import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.extensions.getTranslatedType
import com.habitrpg.android.habitica.extensions.inflate
+import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Animal
import com.habitrpg.android.habitica.models.inventory.Egg
@@ -31,6 +32,8 @@ class StableRecyclerFragment : BaseFragment() {
@Inject
lateinit var inventoryRepository: InventoryRepository
+ @Inject
+ lateinit var configManager: AppConfigManager
private val recyclerView: RecyclerViewEmptySupport? by bindView(R.id.recyclerView)
private val emptyView: TextView? by bindView(R.id.emptyView)
@@ -92,6 +95,7 @@ class StableRecyclerFragment : BaseFragment() {
Pair(egg as? Egg, potion as? HatchingPotion)
}
adapter?.itemType = this.itemType
+ adapter?.shopSpriteSuffix = configManager.shopSpriteSuffix()
recyclerView?.adapter = adapter
recyclerView?.itemAnimator = SafeDefaultItemAnimator()
@@ -185,7 +189,12 @@ class StableRecyclerFragment : BaseFragment() {
if (items.size > 0 && items[items.size - 1].javaClass == StableSection::class.java) {
items.removeAt(items.size - 1)
}
- val section = StableSection(animal.type, animal.getTranslatedType(context))
+ val title = if (itemType == "pets") {
+ context?.getString(R.string.pet_category, animal.getTranslatedType(context))
+ } else {
+ context?.getString(R.string.mount_category, animal.getTranslatedType(context))
+ }
+ val section = StableSection(animal.type, title ?: "")
items.add(section)
lastSection = section
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt
index 053bda468..ebe9baf97 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt
@@ -61,7 +61,7 @@ class PetViewHolder(parent: ViewGroup, private val equipEvents: PublishSubject {
- val itemContent = PurchaseDialogItemContent(context)
- if (shopItem.canPurchaseBulk) {
- itemContent.stepperView.visibility = View.VISIBLE
- itemContent.stepperView.onValueChanged = {
- purchaseQuantity = it.toInt()
- updatePurchaseTotal()
- }
- } else {
- itemContent.stepperView.visibility = View.GONE
- }
- contentView = itemContent
- }
- shopItem.isTypeQuest -> {
+ shopItem.isTypeItem -> contentView = PurchaseDialogItemContent(context)
+ shopItem.isTypeQuest -> {
contentView = PurchaseDialogQuestContent(context)
inventoryRepository.getQuestContent(shopItem.key).firstElement().subscribe(Consumer { contentView.setQuestContent(it) }, RxErrorHandler.handleEmptyError())
}
- shopItem.isTypeGear -> {
+ shopItem.isTypeGear -> {
contentView = PurchaseDialogGearContent(context)
inventoryRepository.getEquipment(shopItem.key).firstElement().subscribe(Consumer { contentView.setEquipment(it) }, RxErrorHandler.handleEmptyError())
checkGearClass()
}
- "gems" == shopItem.purchaseType -> {
- val gemContent = PurchaseDialogGemsContent(context)
- gemContent.stepperView.onValueChanged = {
+ "gems" == shopItem.purchaseType -> contentView = PurchaseDialogGemsContent(context)
+ else -> contentView = PurchaseDialogBaseContent(context)
+ }
+
+ val stepperView = contentView.findViewById(R.id.stepper_view)
+ if (stepperView != null) {
+ if (shopItem.canPurchaseBulk) {
+ stepperView.visibility = View.VISIBLE
+ stepperView.onValueChanged = {
purchaseQuantity = it.toInt()
updatePurchaseTotal()
}
- contentView = gemContent
+ } else {
+ stepperView.visibility = View.GONE
}
- else -> contentView = PurchaseDialogBaseContent(context)
}
amountErrorLabel = contentView.findViewById(R.id.amount_error_label)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/HabitScoringButtonsView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/HabitScoringButtonsView.kt
index 1ab328c21..65d9b3e95 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/HabitScoringButtonsView.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/HabitScoringButtonsView.kt
@@ -29,13 +29,14 @@ class HabitScoringButtonsView @JvmOverloads constructor(
var tintColor: Int = ContextCompat.getColor(context, R.color.brand_300)
+ var textTintColor: Int? = null
var isPositive = true
set(value) {
field = value
positiveImageView.setImageDrawable(HabiticaIconsHelper.imageOfHabitControlPlus(tintColor, value).asDrawable(resources))
if (value) {
- positiveTextView.setTextColor(tintColor)
+ positiveTextView.setTextColor(textTintColor ?: tintColor)
positiveView.contentDescription = toContentDescription(R.string.positive_habit_form, R.string.on)
positiveTextView.typeface = Typeface.create("sans-serif-medium", Typeface.NORMAL)
} else {
@@ -50,7 +51,7 @@ class HabitScoringButtonsView @JvmOverloads constructor(
field = value
negativeImageView.setImageDrawable(HabiticaIconsHelper.imageOfHabitControlMinus(tintColor, value).asDrawable(resources))
if (value) {
- negativeTextView.setTextColor(tintColor)
+ negativeTextView.setTextColor(textTintColor ?: tintColor)
negativeView.contentDescription = toContentDescription(R.string.negative_habit_form, R.string.on)
negativeTextView.typeface = Typeface.create("sans-serif-medium", Typeface.NORMAL)
} else {
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 858dc4be9..50bebcf13 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
@@ -21,6 +21,7 @@ class TaskDifficultyButtons @JvmOverloads constructor(
) : LinearLayout(context, attrs, defStyleAttr) {
var tintColor: Int = ContextCompat.getColor(context, R.color.brand_300)
+ var textTintColor: Int? = null
var selectedDifficulty: Float = 1f
set(value) {
field = value
@@ -58,7 +59,7 @@ class TaskDifficultyButtons @JvmOverloads constructor(
var difficultyColor = ContextCompat.getColor(context, R.color.white)
if (isActive) {
view.findViewById(R.id.image_view).background.mutate().setTint(tintColor)
- view.findViewById(R.id.text_view).setTextColor(tintColor)
+ view.findViewById(R.id.text_view).setTextColor(textTintColor ?: tintColor)
view.findViewById(R.id.text_view).typeface = Typeface.create("sans-serif-medium", Typeface.NORMAL)
} else {
view.findViewById(R.id.image_view).background.mutate().setTint(ContextCompat.getColor(context, R.color.taskform_gray))
diff --git a/Habitica/staff/release/output.json b/Habitica/staff/release/output.json
index de4c44ce8..dd6cdca9a 100644
--- a/Habitica/staff/release/output.json
+++ b/Habitica/staff/release/output.json
@@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"properties": [],
- "versionCode": 2459,
- "versionName": "2459",
+ "versionCode": 2500,
+ "versionName": "2500",
"enabled": true,
"outputFile": "Habitica-staff-release.apk"
}