Add setting for task list display mode

This commit is contained in:
Phillip Thelen 2020-04-22 14:52:46 +02:00
parent dc803b52f8
commit 864101288b
23 changed files with 191 additions and 52 deletions

View file

@ -64,7 +64,7 @@ dependencies {
compileOnly 'com.github.pengrad:jdk9-deps:1.0' compileOnly 'com.github.pengrad:jdk9-deps:1.0'
//App Compatibility and Material Design //App Compatibility and Material Design
implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0' implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.legacy:legacy-preference-v14:1.0.0' implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
// Emojis // Emojis
@ -162,8 +162,8 @@ android {
multiDexEnabled true 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" 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 2408 versionCode 2412
versionName "2.6" versionName "2.6.1"
} }
viewBinding { viewBinding {
@ -213,6 +213,12 @@ android {
dimension "buildType" dimension "buildType"
} }
staff {
dimension "buildType"
buildConfigField "String", "TESTING_LEVEL", "\"staff\""
resValue "string", "app_name", "Habitica Staff"
}
alpha { alpha {
dimension "buildType" dimension "buildType"
buildConfigField "String", "TESTING_LEVEL", "\"alpha\"" buildConfigField "String", "TESTING_LEVEL", "\"alpha\""

View file

@ -1014,5 +1014,5 @@
<string name="read_more">Read More</string> <string name="read_more">Read More</string>
<string name="purchase_amount_error">You are unable to buy that amount.</string> <string name="purchase_amount_error">You are unable to buy that amount.</string>
<string name="still_questions">Still have a question?</string> <string name="still_questions">Still have a question?</string>
<string name="delete_checklist_entry">Delete Checklist entry</string> <string name="task_display">Task list display</string>
</resources> </resources>

View file

@ -33,6 +33,18 @@
<item>@string/avatar_size_broad</item> <item>@string/avatar_size_broad</item>
</string-array> </string-array>
<string-array name="TaskDisplayTypes">
<item>Standard</item>
<item>Compact</item>
<item>Minimal</item>
</string-array>
<string-array name="TaskDisplayValues">
<item>standard</item>
<item>compact</item>
<item>minimal</item>
</string-array>
<string-array name="Language"> <string-array name="Language">
<item>English</item> <item>English</item>
<item>Български</item> <item>Български</item>

View file

@ -112,6 +112,13 @@
android:shouldDisableView="false" android:shouldDisableView="false"
android:summary="@string/SP_APIToken_summary" android:summary="@string/SP_APIToken_summary"
android:layout="@layout/preference_child_summary"/> android:layout="@layout/preference_child_summary"/>
<ListPreference
android:entries="@array/weekdays"
android:entryValues="@array/weekdayValues"
android:key="@string/pref_first_day_of_the_week_key"
android:layout="@layout/preference_child_summary"
android:summary="@string/pref_first_day_of_the_week_summary"
android:title="@string/pref_first_day_of_the_week_title" />
</PreferenceScreen> </PreferenceScreen>
<Preference <Preference
@ -131,11 +138,12 @@
<PreferenceCategory <PreferenceCategory
android:title="@string/app_settings" android:title="@string/app_settings"
android:layout="@layout/preference_category"> android:layout="@layout/preference_category">
<ListPreference android:title="@string/pref_first_day_of_the_week_title" <ListPreference
android:key="@string/pref_first_day_of_the_week_key" android:title="@string/task_display"
android:entries="@array/weekdays" android:key="task_display"
android:entryValues="@array/weekdayValues" android:entries="@array/TaskDisplayTypes"
android:summary="@string/pref_first_day_of_the_week_summary" android:entryValues="@array/TaskDisplayValues"
android:defaultValue="standard"
android:layout="@layout/preference_child_summary"/> android:layout="@layout/preference_child_summary"/>
<ListPreference android:title="@string/Language_title" <ListPreference android:title="@string/Language_title"
android:key="language" android:key="language"

View file

@ -76,5 +76,9 @@
<key>raiseShops</key> <key>raiseShops</key>
<value>false</value> <value>false</value>
</entry> </entry>
<entry>
<key>enableTaskDisplayMode</key>
<value>true</value>
</entry>
</defaultsMap> </defaultsMap>
<!-- END xml_defaults --> <!-- END xml_defaults -->

View file

@ -1,5 +1,7 @@
package com.habitrpg.android.habitica.helpers package com.habitrpg.android.habitica.helpers
import android.content.Context
import androidx.preference.PreferenceManager
import com.google.firebase.remoteconfig.FirebaseRemoteConfig import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
@ -82,4 +84,13 @@ class AppConfigManager {
fun raiseShops(): Boolean { fun raiseShops(): Boolean {
return remoteConfig.getBoolean("raiseShops") return remoteConfig.getBoolean("raiseShops")
} }
fun taskDisplayMode(context: Context): String {
return if (remoteConfig.getBoolean("enableTaskDisplayMode")) {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
preferences.getString("task_display", "standard") ?: "standard"
} else {
"standard"
}
}
} }

View file

@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.Button import android.widget.Button
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
@ -61,6 +62,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
internal var taskSetupFragment: TaskSetupFragment? = null internal var taskSetupFragment: TaskSetupFragment? = null
internal var user: User? = null internal var user: User? = null
private var completedSetup = false private var completedSetup = false
private var createdTasks = false
private val isLastPage: Boolean private val isLastPage: Boolean
get() = this.pager.adapter == null || this.pager.currentItem == (this.pager.adapter?.count ?: 0) - 1 get() = this.pager.adapter == null || this.pager.currentItem == (this.pager.adapter?.count ?: 0) - 1
@ -127,8 +129,13 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
if (this.taskSetupFragment == null) { if (this.taskSetupFragment == null) {
return return
} }
if (createdTasks) {
onUserReceived(user)
return
}
val newTasks = this.taskSetupFragment?.createSampleTasks() val newTasks = this.taskSetupFragment?.createSampleTasks()
this.completedSetup = true this.completedSetup = true
createdTasks = true
newTasks?.let { newTasks?.let {
this.taskRepository.createTasks(it).subscribe(Consumer { onUserReceived(user) }, RxErrorHandler.handleEmptyError()) this.taskRepository.createTasks(it).subscribe(Consumer { onUserReceived(user) }, RxErrorHandler.handleEmptyError())
} }
@ -194,14 +201,14 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
private fun onUserReceived(user: User?) { private fun onUserReceived(user: User?) {
if (completedSetup) { if (completedSetup) {
if (!compositeSubscription.isDisposed) {
compositeSubscription.dispose()
}
val additionalData = HashMap<String, Any>() val additionalData = HashMap<String, Any>()
additionalData["status"] = "completed" additionalData["status"] = "completed"
AmplitudeManager.sendEvent("setup", AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, AmplitudeManager.EVENT_HITTYPE_EVENT, additionalData) AmplitudeManager.sendEvent("setup", AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, AmplitudeManager.EVENT_HITTYPE_EVENT, additionalData)
compositeSubscription.add(userRepository.updateUser(user, "flags.welcomed", true).subscribe(Consumer { compositeSubscription.add(userRepository.updateUser(user, "flags.welcomed", true).subscribe(Consumer {
if (!compositeSubscription.isDisposed) {
compositeSubscription.dispose()
}
startMainActivity() startMainActivity()
}, RxErrorHandler.handleEmptyError())) }, RxErrorHandler.handleEmptyError()))
return return
@ -256,6 +263,29 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
} }
} }
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val item = super.instantiateItem(container, position)
when (item) {
is AvatarSetupFragment -> {
avatarSetupFragment = item
item.activity = this@SetupActivity
item.setUser(user)
item.width = pager.width
}
is TaskSetupFragment -> {
taskSetupFragment = item
item.setUser(user)
}
is WelcomeFragment -> {
welcomeFragment = item
item.nameValidEvents.toFlowable(BackpressureStrategy.DROP)?.subscribe {
setNextButtonEnabled(it)
}
}
}
return item
}
override fun getCount(): Int { override fun getCount(): Int {
return 3 return 3
} }

View file

@ -5,6 +5,7 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.SparseArray import android.util.SparseArray
import android.view.MenuItem import android.view.MenuItem
import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
@ -67,6 +68,21 @@ class SkillTasksActivity : BaseActivity() {
return fragment return fragment
} }
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val item = super.instantiateItem(container, position)
if (item is SkillTasksRecyclerViewFragment) {
item.taskType = when (position) {
0 -> Task.TYPE_HABIT
1 -> Task.TYPE_DAILY
else -> Task.TYPE_TODO
}
compositeSubscription.add(item.getTaskSelectionEvents().subscribe(Consumer { task -> taskSelected(task) }, RxErrorHandler.handleEmptyError()))
viewFragmentsDictionary.put(position, item)
}
return item
}
override fun getCount(): Int { override fun getCount(): Int {
return 3 return 3
} }

View file

@ -116,7 +116,7 @@ class ChallengeTasksRecyclerViewAdapter(taskFilterHelper: TaskFilterHelper?, lay
addBtn.setOnClickListener { newTask?.let { callback.onNext(it) } } addBtn.setOnClickListener { newTask?.let { callback.onNext(it) } }
} }
override fun bind(data: Task, position: Int) { override fun bind(data: Task, position: Int, displayMode: String) {
this.newTask = data this.newTask = data
addBtn.text = data.text addBtn.text = data.text
} }
@ -126,7 +126,7 @@ class ChallengeTasksRecyclerViewAdapter(taskFilterHelper: TaskFilterHelper?, lay
private val dividerName: TextView = itemView.findViewById(R.id.divider_name) private val dividerName: TextView = itemView.findViewById(R.id.divider_name)
override fun bind(data: Task, position: Int) { override fun bind(data: Task, position: Int, displayMode: String) {
dividerName.text = data.text dividerName.text = data.text
} }
} }

View file

@ -46,7 +46,7 @@ abstract class BaseTasksRecyclerViewAdapter<VH : BindableViewHolder<Task>>(var t
override fun onBindViewHolder(holder: VH, position: Int) { override fun onBindViewHolder(holder: VH, position: Int) {
val item = filteredContent?.get(position) val item = filteredContent?.get(position)
if (item != null) { if (item != null) {
holder.bind(item, position) holder.bind(item, position, "normal")
} }
/*if (this.displayedChecklist != null && ChecklistedViewHolder.class.isAssignableFrom(holder.getClass())) { /*if (this.displayedChecklist != null && ChecklistedViewHolder.class.isAssignableFrom(holder.getClass())) {
ChecklistedViewHolder checklistedHolder = (ChecklistedViewHolder) holder; ChecklistedViewHolder checklistedHolder = (ChecklistedViewHolder) holder;

View file

@ -24,6 +24,14 @@ abstract class RealmBaseTasksRecyclerViewAdapter<VH : BaseTaskViewHolder>(
private var updateOnModification: Boolean = false private var updateOnModification: Boolean = false
override var ignoreUpdates: Boolean = false override var ignoreUpdates: Boolean = false
override var taskDisplayMode: String = "standard"
set(value) {
if (field != value) {
field = value
notifyDataSetChanged()
}
}
private val resultsListener: OrderedRealmCollectionChangeListener<RealmResults<Task>> by lazy { private val resultsListener: OrderedRealmCollectionChangeListener<RealmResults<Task>> by lazy {
OrderedRealmCollectionChangeListener<RealmResults<Task>> { _, changeSet -> OrderedRealmCollectionChangeListener<RealmResults<Task>> { _, changeSet ->
buildChangeSet(changeSet) buildChangeSet(changeSet)
@ -128,7 +136,7 @@ abstract class RealmBaseTasksRecyclerViewAdapter<VH : BaseTaskViewHolder>(
override fun onBindViewHolder(holder: VH, position: Int) { override fun onBindViewHolder(holder: VH, position: Int) {
val item = getItem(position) val item = getItem(position)
if (item != null) { if (item != null) {
holder.bind(item, position) holder.bind(item, position, taskDisplayMode)
holder.errorButtonClicked = Action { holder.errorButtonClicked = Action {
errorButtonEventsSubject.onNext("") errorButtonEventsSubject.onNext("")
} }

View file

@ -33,6 +33,15 @@ class RewardsRecyclerViewAdapter(private var customRewards: OrderedRealmCollecti
private var purchaseCardSubject = PublishSubject.create<ShopItem>() private var purchaseCardSubject = PublishSubject.create<ShopItem>()
val purchaseCardEvents: Flowable<ShopItem> = purchaseCardSubject.toFlowable(BackpressureStrategy.LATEST) val purchaseCardEvents: Flowable<ShopItem> = purchaseCardSubject.toFlowable(BackpressureStrategy.LATEST)
override var taskDisplayMode: String = "standard"
set(value) {
if (field != value) {
field = value
notifyDataSetChanged()
}
}
private val inAppRewardCount: Int private val inAppRewardCount: Int
get() { get() {
if (inAppRewards?.isValid != true) return 0 if (inAppRewards?.isValid != true) return 0
@ -71,7 +80,7 @@ class RewardsRecyclerViewAdapter(private var customRewards: OrderedRealmCollecti
if (customRewards != null && position < customRewardCount) { if (customRewards != null && position < customRewardCount) {
val reward = customRewards?.get(position) ?: return val reward = customRewards?.get(position) ?: return
val gold = user?.stats?.gp ?: 0.0 val gold = user?.stats?.gp ?: 0.0
(holder as? RewardViewHolder)?.bind(reward, position, reward.value < gold) (holder as? RewardViewHolder)?.bind(reward, position, reward.value < gold, taskDisplayMode)
} else if (inAppRewards != null) { } else if (inAppRewards != null) {
val item = inAppRewards?.get(position - customRewardCount) ?: return val item = inAppRewards?.get(position - customRewardCount) ?: return
if (holder is ShopItemViewHolder) { if (holder is ShopItemViewHolder) {

View file

@ -11,6 +11,8 @@ interface TaskRecyclerViewAdapter {
val errorButtonEvents: Flowable<String> val errorButtonEvents: Flowable<String>
var taskDisplayMode: String
fun updateData(tasks: OrderedRealmCollection<Task>?) fun updateData(tasks: OrderedRealmCollection<Task>?)
fun filter() fun filter()

View file

@ -78,6 +78,10 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare
val themePreference = findPreference("theme_name") as? ListPreference val themePreference = findPreference("theme_name") as? ListPreference
themePreference?.isVisible = configManager.testingLevel() == AppTestingLevel.ALPHA || BuildConfig.DEBUG themePreference?.isVisible = configManager.testingLevel() == AppTestingLevel.ALPHA || BuildConfig.DEBUG
themePreference?.summary = themePreference?.entry themePreference?.summary = themePreference?.entry
val taskDisplayPreference = findPreference("task_display") as? ListPreference
taskDisplayPreference?.summary = taskDisplayPreference?.entry
} }
override fun onResume() { override fun onResume() {
@ -224,6 +228,10 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare
apiClient.updateServerUrl(sharedPreferences.getString(key, "")) apiClient.updateServerUrl(sharedPreferences.getString(key, ""))
findPreference(key).summary = sharedPreferences.getString(key, "") findPreference(key).summary = sharedPreferences.getString(key, "")
} }
"task_display" -> {
val preference = findPreference(key) as ListPreference
preference.summary = preference.entry
}
} }
} }

View file

@ -102,6 +102,8 @@ open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayou
this.recyclerAdapter?.filter() this.recyclerAdapter?.filter()
}, RxErrorHandler.handleEmptyError())) }, RxErrorHandler.handleEmptyError()))
} }
context?.let { recyclerAdapter?.taskDisplayMode = configManager.taskDisplayMode(it) }
} }
private fun handleTaskResult(result: TaskScoringResult, value: Int) { private fun handleTaskResult(result: TaskScoringResult, value: Int) {
@ -359,6 +361,11 @@ open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayou
}.subscribe(Consumer { }, RxErrorHandler.handleEmptyError())) }.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
} }
override fun onResume() {
super.onResume()
context?.let { recyclerAdapter?.taskDisplayMode = configManager.taskDisplayMode(it) }
}
fun setActiveFilter(activeFilter: String) { fun setActiveFilter(activeFilter: String) {
taskFilterHelper.setActiveFilter(classType ?: "", activeFilter) taskFilterHelper.setActiveFilter(classType ?: "", activeFilter)
recyclerAdapter?.filter() recyclerAdapter?.filter()

View file

@ -5,5 +5,5 @@ import androidx.recyclerview.widget.RecyclerView
abstract class BindableViewHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) { abstract class BindableViewHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) {
abstract fun bind(data: T, position: Int) abstract fun bind(data: T, position: Int, displayMode: String)
} }

View file

@ -104,7 +104,7 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc:
} }
} }
override fun bind(data: Task, position: Int) { override fun bind(data: Task, position: Int, displayMode: String) {
task = data task = data
itemView.setBackgroundResource(R.color.white) itemView.setBackgroundResource(R.color.white)
@ -134,40 +134,53 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc:
titleTextView.setParsedMarkdown(parsedText) titleTextView.setParsedMarkdown(parsedText)
}, RxErrorHandler.handleEmptyError()) }, RxErrorHandler.handleEmptyError())
} }
if (data.parsedNotes != null) { if (displayMode != "minimal") {
notesTextView?.setParsedMarkdown(data.parsedText) if (data.parsedNotes != null) {
} else { notesTextView?.setParsedMarkdown(data.parsedText)
notesTextView?.text = data.notes } else {
notesTextView?.setSpannableFactory(NoCopySpannableFactory.getInstance()); notesTextView?.text = data.notes
data.notes?.let {notes -> notesTextView?.setSpannableFactory(NoCopySpannableFactory.getInstance());
if (notes.isEmpty()) { data.notes?.let {notes ->
return@let if (notes.isEmpty()) {
return@let
}
Single.just(notes)
.map { MarkdownParser.parseMarkdown(it) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer { parsedNotes ->
notesTextView?.text = parsedNotes
notesTextView?.setParsedMarkdown(parsedNotes)
}, RxErrorHandler.handleEmptyError())
}
} }
Single.just(notes) } else {
.map { MarkdownParser.parseMarkdown(it) } notesTextView?.visibility = View.GONE
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer { parsedNotes ->
notesTextView?.text = parsedNotes
notesTextView?.setParsedMarkdown(parsedNotes)
}, RxErrorHandler.handleEmptyError())
} }
} }
}
} else { } else {
titleTextView.text = data.text titleTextView.text = data.text
notesTextView?.text = data.notes if (displayMode != "minimal") {
notesTextView?.text = data.notes
} else {
notesTextView?.visibility = View.GONE
}
} }
rightBorderView?.setBackgroundResource(data.lightTaskColor) rightBorderView?.setBackgroundResource(data.lightTaskColor)
iconViewReminder?.visibility = if (data.reminders?.size ?: 0 > 0) View.VISIBLE else View.GONE if (displayMode == "standard") {
iconViewTag?.visibility = if (data.tags?.size ?: 0 > 0) View.VISIBLE else View.GONE iconViewReminder?.visibility = if (data.reminders?.size ?: 0 > 0) View.VISIBLE else View.GONE
iconViewTag?.visibility = if (data.tags?.size ?: 0 > 0) View.VISIBLE else View.GONE
iconViewChallenge?.visibility = if (task?.challengeID != null) View.VISIBLE else View.GONE iconViewChallenge?.visibility = if (task?.challengeID != null) View.VISIBLE else View.GONE
configureSpecialTaskTextView(data) configureSpecialTaskTextView(data)
taskIconWrapper?.visibility = if (taskIconWrapperIsVisible) View.VISIBLE else View.GONE
} else {
taskIconWrapper?.visibility = View.GONE
}
taskIconWrapper?.visibility = if (taskIconWrapperIsVisible) View.VISIBLE else View.GONE
if (data.isPendingApproval) { if (data.isPendingApproval) {
approvalRequiredTextView?.visibility = View.VISIBLE approvalRequiredTextView?.visibility = View.VISIBLE

View file

@ -42,7 +42,7 @@ abstract class ChecklistedViewHolder(itemView: View, scoreTaskFunc: ((Task, Task
expandCheckboxTouchArea(checkboxHolder, checkbox) expandCheckboxTouchArea(checkboxHolder, checkbox)
} }
override fun bind(newTask: Task, position: Int) { override fun bind(newTask: Task, position: Int, displayMode: String) {
var completed = newTask.completed var completed = newTask.completed
if (newTask.isPendingApproval) { if (newTask.isPendingApproval) {
completed = false completed = false
@ -66,7 +66,7 @@ abstract class ChecklistedViewHolder(itemView: View, scoreTaskFunc: ((Task, Task
} else { } else {
this.rightBorderView?.setBackgroundColor(this.taskGray) this.rightBorderView?.setBackgroundColor(this.taskGray)
} }
super.bind(newTask, position) super.bind(newTask, position, displayMode)
} }
abstract fun shouldDisplayAsActive(newTask: Task): Boolean abstract fun shouldDisplayAsActive(newTask: Task): Boolean

View file

@ -25,7 +25,7 @@ class DailyViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> U
return isVisible return isVisible
} }
override fun bind(newTask: Task, position: Int) { override fun bind(newTask: Task, position: Int, displayMode: String) {
this.task = newTask this.task = newTask
if (newTask.isChecklistDisplayActive) { if (newTask.isChecklistDisplayActive) {
this.checklistIndicatorWrapper.setBackgroundResource(newTask.lightTaskColor) this.checklistIndicatorWrapper.setBackgroundResource(newTask.lightTaskColor)
@ -55,7 +55,7 @@ class DailyViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> U
reminderTextView.text = reminderString reminderTextView.text = reminderString
} }
super.bind(newTask, position) super.bind(newTask, position, displayMode)
} }
override fun shouldDisplayAsActive(newTask: Task): Boolean { override fun shouldDisplayAsActive(newTask: Task): Boolean {

View file

@ -34,7 +34,7 @@ class HabitViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> U
btnMinus.setOnClickListener { onMinusButtonClicked() } btnMinus.setOnClickListener { onMinusButtonClicked() }
} }
override fun bind(data: Task, position: Int) { override fun bind(data: Task, position: Int, displayMode: String) {
this.task = data this.task = data
if (data.up == true) { if (data.up == true) {
this.btnPlusWrapper.setBackgroundResource(data.lightTaskColor) this.btnPlusWrapper.setBackgroundResource(data.lightTaskColor)
@ -82,7 +82,7 @@ class HabitViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> U
} else { } else {
streakTextView.visibility = View.GONE streakTextView.visibility = View.GONE
} }
super.bind(data, position) super.bind(data, position, displayMode)
} }
private fun onPlusButtonClicked() { private fun onPlusButtonClicked() {

View file

@ -63,9 +63,9 @@ class RewardViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) ->
this.buyButton.isEnabled = !taskActionsDisabled this.buyButton.isEnabled = !taskActionsDisabled
} }
fun bind(reward: Task, position: Int, canBuy: Boolean) { fun bind(reward: Task, position: Int, canBuy: Boolean, displayMode: String) {
this.task = reward this.task = reward
super.bind(reward, position) super.bind(reward, position, displayMode)
this.priceLabel.text = NumberAbbreviator.abbreviate(itemView.context, this.task?.value ?: 0.0) this.priceLabel.text = NumberAbbreviator.abbreviate(itemView.context, this.task?.value ?: 0.0)
if (canBuy) { if (canBuy) {

View file

@ -12,14 +12,14 @@ class TodoViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Un
private val dateFormatter: DateFormat = android.text.format.DateFormat.getDateFormat(context) private val dateFormatter: DateFormat = android.text.format.DateFormat.getDateFormat(context)
override fun bind(newTask: Task, position: Int) { override fun bind(newTask: Task, position: Int, displayMode: String) {
this.task = newTask this.task = newTask
if (newTask.completed) { if (newTask.completed) {
checklistIndicatorWrapper.setBackgroundColor(taskGray) checklistIndicatorWrapper.setBackgroundColor(taskGray)
} else { } else {
checklistIndicatorWrapper.setBackgroundColor(newTask.lightTaskColor) checklistIndicatorWrapper.setBackgroundColor(newTask.lightTaskColor)
} }
super.bind(newTask, position) super.bind(newTask, position, displayMode)
} }
override fun configureSpecialTaskTextView(task: Task) { override fun configureSpecialTaskTextView(task: Task) {

View file

@ -21,6 +21,11 @@ or alternatively using `brew cask install fastlane`
fastlane android test fastlane android test
``` ```
Runs all the tests Runs all the tests
### android staff
```
fastlane android staff
```
Submit a new Staff Build to Google Play
### android alpha ### android alpha
``` ```
fastlane android alpha fastlane android alpha