From 2913a7221761fa5aa02d0b2f741596d05cf76c0b Mon Sep 17 00:00:00 2001 From: Jonas L Date: Wed, 30 Jan 2019 13:01:08 +0100 Subject: [PATCH] Modularize time limit rule list items --- .../category/timelimit_rules/Adapter.kt | 88 +++++++++---------- .../CategoryTimeLimitRulesFragment.kt | 6 +- .../timelimit_rules/TimeLimitRuleItem.kt | 7 ++ 3 files changed, 55 insertions(+), 46 deletions(-) create mode 100644 app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/TimeLimitRuleItem.kt diff --git a/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/Adapter.kt b/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/Adapter.kt index 6dd2e8d..68b9742 100644 --- a/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/Adapter.kt +++ b/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/Adapter.kt @@ -33,7 +33,7 @@ class Adapter: RecyclerView.Adapter() { private const val TYPE_ADD = 2 } - var data: List? by Delegates.observable(null as List?) { _, _, _ -> notifyDataSetChanged() } + var data: List by Delegates.observable(emptyList()) { _, _, _ -> notifyDataSetChanged() } var usedTimes: List? by Delegates.observable(null as List?) { _, _, _ -> notifyDataSetChanged() } var handlers: Handlers? = null @@ -41,28 +41,23 @@ class Adapter: RecyclerView.Adapter() { setHasStableIds(true) } - private fun getItem(position: Int): TimeLimitRule { - return data!![position] - } + private fun getItem(position: Int): TimeLimitRuleItem = data[position] - override fun getItemId(position: Int): Long = when { - position == data!!.size -> 1 - else -> getItem(position).id.hashCode().toLong() - } + override fun getItemId(position: Int): Long { + val item = getItem(position) - override fun getItemCount(): Int { - val data = this.data - - if (data == null) { - return 0 + return if (item is TimeLimitRuleRuleItem) { + item.rule.id.hashCode() } else { - return data.size + 1 - } + item.hashCode() + }.toLong() } - override fun getItemViewType(position: Int) = when { - position == data!!.size -> TYPE_ADD - else -> TYPE_ITEM + override fun getItemCount(): Int = data.size + + override fun getItemViewType(position: Int) = when (getItem(position)) { + AddTimeLimitRuleItem -> TYPE_ADD + is TimeLimitRuleRuleItem -> TYPE_ITEM } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when (viewType) { @@ -91,34 +86,39 @@ class Adapter: RecyclerView.Adapter() { } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - if (position == data!!.size) { - // nothing to do - } else { - val item = getItem(position) - val binding = (holder as ItemViewHolder).view - val dayNames = binding.root.resources.getStringArray(R.array.days_of_week_array) - val usedTime = usedTimes?.mapIndexed { index, value -> - if (item.dayMask.toInt() and (1 shl index) != 0) { - value - } else { - 0 - } - }?.sum()?.toInt() ?: 0 + val item = getItem(position) - binding.maxTimeString = TimeTextUtil.time(item.maximumTimeInMillis, binding.root.context) - binding.usageAsText = TimeTextUtil.used(usedTime, binding.root.context) - binding.usageProgressInPercent = if (item.maximumTimeInMillis > 0) - (usedTime * 100 / item.maximumTimeInMillis) - else - 100 - binding.daysString = JoinUtil.join( - dayNames.filterIndexed { index, _ -> (item.dayMask.toInt() and (1 shl index)) != 0 }, - binding.root.context - ) - binding.appliesToExtraTime = item.applyToExtraTimeUsage - binding.card.setOnClickListener { handlers?.onTimeLimitRuleClicked(item) } + when (item) { + AddTimeLimitRuleItem -> { + // nothing to do + } + is TimeLimitRuleRuleItem -> { + val rule = item.rule + val binding = (holder as ItemViewHolder).view + val dayNames = binding.root.resources.getStringArray(R.array.days_of_week_array) + val usedTime = usedTimes?.mapIndexed { index, value -> + if (rule.dayMask.toInt() and (1 shl index) != 0) { + value + } else { + 0 + } + }?.sum()?.toInt() ?: 0 - binding.executePendingBindings() + binding.maxTimeString = TimeTextUtil.time(rule.maximumTimeInMillis, binding.root.context) + binding.usageAsText = TimeTextUtil.used(usedTime, binding.root.context) + binding.usageProgressInPercent = if (rule.maximumTimeInMillis > 0) + (usedTime * 100 / rule.maximumTimeInMillis) + else + 100 + binding.daysString = JoinUtil.join( + dayNames.filterIndexed { index, _ -> (rule.dayMask.toInt() and (1 shl index)) != 0 }, + binding.root.context + ) + binding.appliesToExtraTime = rule.applyToExtraTimeUsage + binding.card.setOnClickListener { handlers?.onTimeLimitRuleClicked(rule) } + + binding.executePendingBindings() + } } } } diff --git a/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/CategoryTimeLimitRulesFragment.kt b/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/CategoryTimeLimitRulesFragment.kt index e2e1cb0..6686f7b 100644 --- a/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/CategoryTimeLimitRulesFragment.kt +++ b/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/CategoryTimeLimitRulesFragment.kt @@ -81,9 +81,11 @@ class CategoryTimeLimitRulesFragment : Fragment(), EditTimeLimitRuleDialogFragme rules .map { rules -> - rules.sortedBy { it.dayMask } + rules.sortedBy { it.dayMask }.map { TimeLimitRuleRuleItem(it) } } - .observe(this, Observer { adapter.data = it }) + .observe(this, Observer { + adapter.data = it + listOf(AddTimeLimitRuleItem) + }) usedTimeItems.observe(this, Observer { usedTimes -> diff --git a/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/TimeLimitRuleItem.kt b/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/TimeLimitRuleItem.kt new file mode 100644 index 0000000..5d930b4 --- /dev/null +++ b/app/src/main/java/io/timelimit/android/ui/manage/category/timelimit_rules/TimeLimitRuleItem.kt @@ -0,0 +1,7 @@ +package io.timelimit.android.ui.manage.category.timelimit_rules + +import io.timelimit.android.data.model.TimeLimitRule + +sealed class TimeLimitRuleItem +object AddTimeLimitRuleItem: TimeLimitRuleItem() +data class TimeLimitRuleRuleItem(val rule: TimeLimitRule): TimeLimitRuleItem() \ No newline at end of file