diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/HabiticaTestCase.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/HabiticaTestCase.kt index ba4829717..6d04fe669 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/HabiticaTestCase.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/HabiticaTestCase.kt @@ -95,17 +95,17 @@ open class HabiticaTestCase : TestCase() { content = loadJsonFile("content", ContentResult::class.java) every { inventoryRepository.getPets() } returns Flowable.just(content.pets) every { inventoryRepository.getMounts() } returns Flowable.just(content.mounts) - every { inventoryRepository.getItems(Food::class.java) } returns Flowable.just(content.food) - every { inventoryRepository.getItems(Egg::class.java) } returns Flowable.just(content.eggs) - every { inventoryRepository.getItems(HatchingPotion::class.java) } returns Flowable.just(content.hatchingPotions) - every { inventoryRepository.getItems(QuestContent::class.java) } returns Flowable.just(content.quests) + every { inventoryRepository.getItemsFlowable(Food::class.java) } returns Flowable.just(content.food) + every { inventoryRepository.getItemsFlowable(Egg::class.java) } returns Flowable.just(content.eggs) + every { inventoryRepository.getItemsFlowable(HatchingPotion::class.java) } returns Flowable.just(content.hatchingPotions) + every { inventoryRepository.getItemsFlowable(QuestContent::class.java) } returns Flowable.just(content.quests) - every { inventoryRepository.getItems(Food::class.java, any()) } returns Flowable.just(content.food) - every { inventoryRepository.getItems(Egg::class.java, any()) } answers { + every { inventoryRepository.getItemsFlowable(Food::class.java, any()) } returns Flowable.just(content.food) + every { inventoryRepository.getItemsFlowable(Egg::class.java, any()) } answers { Flowable.just(content.eggs) } - every { inventoryRepository.getItems(HatchingPotion::class.java, any()) } returns Flowable.just(content.hatchingPotions) - every { inventoryRepository.getItems(QuestContent::class.java, any()) } returns Flowable.just(content.quests) + every { inventoryRepository.getItemsFlowable(HatchingPotion::class.java, any()) } returns Flowable.just(content.hatchingPotions) + every { inventoryRepository.getItemsFlowable(QuestContent::class.java, any()) } returns Flowable.just(content.quests) } internal fun loadJsonFile(s: String, type: Type): T { diff --git a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragmentTest.kt b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragmentTest.kt index d4806812c..f347c70da 100644 --- a/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragmentTest.kt +++ b/Habitica/src/androidTest/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragmentTest.kt @@ -115,7 +115,7 @@ internal class ItemRecyclerFragmentTest : FragmentTestCase fun togglePinnedItem(item: ShopItem): Flowable> - fun getItems(itemClass: Class, keys: Array): Flow> - fun getItems(itemClass: Class): Flowable> + fun getItemsFlowable(itemClass: Class, keys: Array): Flow> + fun getItemsFlowable(itemClass: Class): Flowable> + fun getItems(itemClass: Class): Flow> fun getLatestMysteryItem(): Flowable fun getItem(type: String, key: String): Flowable fun getAvailableLimitedItems(): Flowable> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt index c4e52a386..422e46e9c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt @@ -75,11 +75,15 @@ class InventoryRepositoryImpl( return localRepository.getOwnedItems(userID, includeZero) } - override fun getItems(itemClass: Class, keys: Array): Flow> { - return localRepository.getItems(itemClass, keys) + override fun getItemsFlowable(itemClass: Class, keys: Array): Flow> { + return localRepository.getItemsFlowable(itemClass, keys) } - override fun getItems(itemClass: Class): Flowable> { + override fun getItemsFlowable(itemClass: Class): Flowable> { + return localRepository.getItemsFlowable(itemClass) + } + + override fun getItems(itemClass: Class): Flow> { return localRepository.getItems(itemClass) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt index 68300cea3..252e454f5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt @@ -35,8 +35,8 @@ interface InventoryLocalRepository : ContentLocalRepository { fun getOwnedEquipment(type: String): Flowable> - fun getItems(itemClass: Class, keys: Array): Flow> - fun getItems(itemClass: Class): Flowable> + fun getItemsFlowable(itemClass: Class, keys: Array): Flow> + fun getItemsFlowable(itemClass: Class): Flowable> fun getOwnedItems(itemType: String, userID: String, includeZero: Boolean): Flow> fun getOwnedItems(userID: String, includeZero: Boolean): Flowable> fun getEquipmentType(type: String, set: String): Flowable> @@ -66,4 +66,5 @@ interface InventoryLocalRepository : ContentLocalRepository { fun save(items: Items, userID: String) fun getLiveObject(obj: OwnedItem): OwnedItem? + fun getItems(itemClass: Class): Flow> } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt index 189d620f1..366f580af 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt @@ -120,18 +120,23 @@ class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository( } } - override fun getItems(itemClass: Class, keys: Array): Flow> { + override fun getItemsFlowable(itemClass: Class, keys: Array): Flow> { return realm.where(itemClass).`in`("key", keys).findAll().toFlow() .filter { it.isLoaded } } - override fun getItems(itemClass: Class): Flowable> { + override fun getItemsFlowable(itemClass: Class): Flowable> { return RxJavaBridge.toV3Flowable( realm.where(itemClass).findAll().asFlowable() .filter { it.isLoaded } ) } + override fun getItems(itemClass: Class): Flow> { + return realm.where(itemClass).findAll().toFlow() + .filter { it.isLoaded } + } + override fun getOwnedItems(userID: String, includeZero: Boolean): Flowable> { return queryUserFlowable(userID).map { val items = HashMap() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.kt index 5feb13bd4..3431f4b88 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.kt @@ -13,9 +13,9 @@ import com.habitrpg.android.habitica.models.tasks.RemindersItem import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.receivers.NotificationPublisher import com.habitrpg.android.habitica.receivers.TaskReceiver -import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.HLogger import com.habitrpg.shared.habitica.LogLevel +import com.habitrpg.shared.habitica.models.tasks.TaskType import kotlinx.coroutines.flow.firstOrNull import java.time.ZoneId import java.time.ZonedDateTime @@ -77,12 +77,12 @@ class TaskAlarmManager( private fun setTimeForDailyReminder(remindersItem: RemindersItem?, task: Task): RemindersItem? { val newTime = (remindersItem?.let { task.getNextReminderOccurrence(it) } ?: return null) - remindersItem.time = newTime.withZoneSameLocal(ZoneId.systemDefault()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + remindersItem.time = newTime.withZoneSameLocal(ZoneId.systemDefault()) + .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) return remindersItem } - /** * If reminderItem time is before now, a new reminder will not be created until the reminder passes. * The exception to this is if the task & reminder was newly created for the same time, @@ -91,11 +91,15 @@ class TaskAlarmManager( */ private fun setAlarmForRemindersItem(reminderItemTask: Task, remindersItem: RemindersItem?) { val now = ZonedDateTime.now().withZoneSameLocal(ZoneId.systemDefault())?.toInstant() - if (remindersItem == null || (remindersItem.getLocalZonedDateTimeInstant()?.isBefore(now) == true && reminderItemTask.nextDue?.firstOrNull() != null)) { + val zonedTime = remindersItem?.getLocalZonedDateTimeInstant() + if (remindersItem == null + || (reminderItemTask.type == TaskType.DAILY && zonedTime?.isBefore(now) == true && reminderItemTask.nextDue?.firstOrNull() != null) + || (reminderItemTask.type == TaskType.TODO && zonedTime?.isBefore(now) == true) + ) { return } - val time = Date.from(remindersItem.getLocalZonedDateTimeInstant()) + val time = Date.from(zonedTime) val cal = Calendar.getInstance() cal.time = time 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 e409e17bd..c9c4c06e0 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 @@ -20,10 +20,10 @@ import com.habitrpg.android.habitica.models.inventory.StableSection import com.habitrpg.android.habitica.models.user.OwnedItem import com.habitrpg.android.habitica.models.user.OwnedMount import com.habitrpg.android.habitica.ui.fragments.inventory.stable.StableFragmentDirections -import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.android.habitica.ui.viewHolders.MountViewHolder import com.habitrpg.android.habitica.ui.viewHolders.PetViewHolder import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder +import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.views.PixelArtView import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable @@ -204,8 +204,8 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { this.animal = item val context = itemView.context val egg = eggs[item.animal] - if (egg != null) { - titleView.text = if (item.type == "drop" || itemType == "mounts") egg.mountText else egg.text + titleView.text = if (egg != null) { + if (item.type == "drop" || itemType == "mounts") egg.mountText else egg.text } else item.animal ownedTextView.visibility = View.VISIBLE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt index 985f5f2bc..60b908cfa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt @@ -296,7 +296,7 @@ class ItemDialogFragment : BaseDialogFragment() { adapter?.data = filteredItems } .map { items -> items.mapNotNull { it.key } } - .map { inventoryRepository.getItems(itemClass, it.toTypedArray()).firstOrNull() } + .map { inventoryRepository.getItemsFlowable(itemClass, it.toTypedArray()).firstOrNull() } .collect { val itemMap = mutableMapOf() for (item in it ?: emptyList()) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt index 47c5353d1..863bb60a1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt @@ -289,7 +289,7 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL } .map { items -> items.mapNotNull { it.key } } .map { - inventoryRepository.getItems(itemClass, it.toTypedArray()).firstOrNull() + inventoryRepository.getItemsFlowable(itemClass, it.toTypedArray()).firstOrNull() } .collect { val itemMap = mutableMapOf() 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 efc0511ae..dd234a2e3 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 @@ -112,10 +112,10 @@ class PetDetailRecyclerFragment : binding?.recyclerView?.layoutManager = layoutManager adapter.animalIngredientsRetriever = { animal, callback -> lifecycleScope.launch { - val egg = inventoryRepository.getItems(Egg::class.java, arrayOf(animal.animal)) + val egg = inventoryRepository.getItemsFlowable(Egg::class.java, arrayOf(animal.animal)) .firstOrNull()?.firstOrNull() as? Egg val potion = - inventoryRepository.getItems(HatchingPotion::class.java, arrayOf(animal.color)) + inventoryRepository.getItemsFlowable(HatchingPotion::class.java, arrayOf(animal.color)) .firstOrNull()?.firstOrNull() as? HatchingPotion callback(Pair(egg, potion)) } 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 5433ec79a..34df1d531 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 @@ -19,12 +19,12 @@ import com.habitrpg.android.habitica.models.inventory.Egg import com.habitrpg.android.habitica.models.inventory.HatchingPotion import com.habitrpg.android.habitica.ui.adapter.inventory.StableRecyclerAdapter import com.habitrpg.android.habitica.ui.fragments.BaseFragment -import com.habitrpg.common.habitica.helpers.EmptyItem import com.habitrpg.android.habitica.ui.helpers.MarginDecoration import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.StableViewModel import com.habitrpg.android.habitica.ui.viewmodels.StableViewModelFactory +import com.habitrpg.common.habitica.helpers.EmptyItem import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject @@ -107,8 +107,8 @@ class StableRecyclerFragment : adapter = StableRecyclerAdapter() adapter?.animalIngredientsRetriever = { animal, callback -> lifecycleScope.launch { - val egg = inventoryRepository.getItems(Egg::class.java, arrayOf(animal.animal)).firstOrNull()?.firstOrNull() as? Egg - val potion = inventoryRepository.getItems(HatchingPotion::class.java, arrayOf(animal.color)).firstOrNull()?.firstOrNull() as? HatchingPotion + val egg = inventoryRepository.getItemsFlowable(Egg::class.java, arrayOf(animal.animal)).firstOrNull()?.firstOrNull() as? Egg + val potion = inventoryRepository.getItemsFlowable(HatchingPotion::class.java, arrayOf(animal.color)).firstOrNull()?.firstOrNull() as? HatchingPotion callback(Pair(egg, potion)) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt index 9cc327d1f..95c13db11 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt @@ -10,6 +10,7 @@ import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels +import androidx.lifecycle.asFlow import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView @@ -52,6 +53,8 @@ import com.habitrpg.shared.habitica.models.tasks.TaskType import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.CompositeDisposable import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import java.util.Date import java.util.concurrent.TimeUnit @@ -149,6 +152,14 @@ open class TaskRecyclerViewFragment : BaseFragment> = MutableLiveData() val items: LiveData> = _items - private val _eggs: MutableLiveData> = MutableLiveData() - val eggs: LiveData> = _eggs + val eggs: LiveData> = inventoryRepository.getItems(Egg::class.java) + .map { + val eggMap = mutableMapOf() + it.forEach { egg -> + eggMap[egg.key] = egg as Egg + } + eggMap + } + .asLiveData() private val _ownedItems: MutableLiveData> = MutableLiveData() val ownedItems: LiveData> = _ownedItems private val _mounts: MutableLiveData> = MutableLiveData() @@ -71,22 +79,9 @@ class StableViewModel(private val application: Application?, private val itemTyp _items.value = mapAnimals(animals, it) } - disposable.add( - inventoryRepository.getItems(Egg::class.java) - .map { - val eggMap = mutableMapOf() - it.forEach { egg -> - eggMap[egg.key] = egg as Egg - } - eggMap - } - .subscribe( - { - _eggs.value = it - }, - RxErrorHandler.handleEmptyError() - ) - ) + viewModelScope.launch { + + } disposable.add(inventoryRepository.getOwnedItems(true).subscribe({ _ownedItems.value = it }, RxErrorHandler.handleEmptyError())) _mounts.value = if ("pets" == itemType) { inventoryRepository.getMounts().firstOrNull() ?: emptyList() diff --git a/shared/src/commonMain/kotlin/com/habitrpg/shared/habitica/models/responses/TaskScoringResult.kt b/shared/src/commonMain/kotlin/com/habitrpg/shared/habitica/models/responses/TaskScoringResult.kt index a4ed01aa9..2cb2953b0 100644 --- a/shared/src/commonMain/kotlin/com/habitrpg/shared/habitica/models/responses/TaskScoringResult.kt +++ b/shared/src/commonMain/kotlin/com/habitrpg/shared/habitica/models/responses/TaskScoringResult.kt @@ -5,16 +5,16 @@ import com.habitrpg.shared.habitica.HParcelize import com.habitrpg.shared.habitica.models.AvatarStats @HParcelize -data class TaskScoringResult(var hasDied: Boolean, - var drop: TaskDirectionDataDrop?, - var experienceDelta: Double, - var healthDelta: Double, - var goldDelta: Double, - var manaDelta: Double, - var hasLeveledUp: Boolean, - var level: Int, - var questDamage: Double?, - var questItemsFound: Int?): HParcelable { +data class TaskScoringResult(var hasDied: Boolean = false, + var drop: TaskDirectionDataDrop? = null, + var experienceDelta: Double = 0.0, + var healthDelta: Double = 0.0, + var goldDelta: Double = 0.0, + var manaDelta: Double = 0.0, + var hasLeveledUp: Boolean = false, + var level: Int = 0, + var questDamage: Double? = null, + var questItemsFound: Int? = null): HParcelable { constructor(data: TaskDirectionData, stats: AvatarStats?) : this( data.hp <= 0.0, diff --git a/version.properties b/version.properties index 97b264fe0..105b261d0 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ NAME=4.0.1 -CODE=4460 \ No newline at end of file +CODE=4470 \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt index 0a0ab2c29..61f178396 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt @@ -33,7 +33,7 @@ open class Task constructor(): Parcelable, BaseTask { get() = Attribute.from(attributeValue) set(value) { attributeValue = value?.value } var attributeValue: String? = Attribute.STRENGTH.value - var value: Double = 0.0 + var value: Double? = 0.0 var dateCreated: Date? = null var position: Int = 0 // Habits @@ -86,39 +86,42 @@ open class Task constructor(): Parcelable, BaseTask { val extraLightTaskColor: Int get() { + val value = value ?: 0.0 return when { - this.value < -20 -> return R.color.watch_maroon_200 - this.value < -10 -> return R.color.watch_red_200 - this.value < -1 -> return R.color.watch_orange_200 - this.value < 1 -> return R.color.watch_yellow_200 - this.value < 5 -> return R.color.watch_green_200 - this.value < 10 -> return R.color.watch_teal_200 + value < -20 -> return R.color.watch_maroon_200 + value < -10 -> return R.color.watch_red_200 + value < -1 -> return R.color.watch_orange_200 + value < 1 -> return R.color.watch_yellow_200 + value < 5 -> return R.color.watch_green_200 + value < 10 -> return R.color.watch_teal_200 else -> R.color.watch_blue_200 } } val lightTaskColor: Int get() { + val value = value ?: 0.0 return when { - this.value < -20 -> return R.color.watch_maroon_100 - this.value < -10 -> return R.color.watch_red_100 - this.value < -1 -> return R.color.watch_orange_100 - this.value < 1 -> return R.color.watch_yellow_100 - this.value < 5 -> return R.color.watch_green_100 - this.value < 10 -> return R.color.watch_teal_100 + value < -20 -> return R.color.watch_maroon_100 + value < -10 -> return R.color.watch_red_100 + value < -1 -> return R.color.watch_orange_100 + value < 1 -> return R.color.watch_yellow_100 + value < 5 -> return R.color.watch_green_100 + value < 10 -> return R.color.watch_teal_100 else -> R.color.watch_blue_100 } } val mediumTaskColor: Int get() { + val value = value ?: 0.0 return when { - this.value < -20 -> return R.color.watch_maroon_10 - this.value < -10 -> return R.color.watch_red_10 - this.value < -1 -> return R.color.watch_orange_10 - this.value < 1 -> return R.color.watch_yellow_10 - this.value < 5 -> return R.color.watch_green_10 - this.value < 10 -> return R.color.watch_teal_10 + value < -20 -> return R.color.watch_maroon_10 + value < -10 -> return R.color.watch_red_10 + value < -1 -> return R.color.watch_orange_10 + value < 1 -> return R.color.watch_yellow_10 + value < 5 -> return R.color.watch_green_10 + value < 10 -> return R.color.watch_teal_10 else -> R.color.watch_blue_10 } } @@ -190,7 +193,7 @@ open class Task constructor(): Parcelable, BaseTask { dest.writeString(this.notes) dest.writeString(this.attribute?.value) dest.writeString(this.type?.value) - dest.writeDouble(this.value) + this.value?.let { dest.writeDouble(it) } dest.writeLong(this.dateCreated?.time ?: -1) dest.writeInt(this.position) dest.writeValue(this.up)