|
|
@ -2,14 +2,21 @@ package org.tasks.ui
|
|
|
|
|
|
|
|
|
|
|
|
import android.app.Activity
|
|
|
|
import android.app.Activity
|
|
|
|
import android.content.Intent
|
|
|
|
import android.content.Intent
|
|
|
|
import android.os.Bundle
|
|
|
|
import androidx.compose.foundation.layout.padding
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import androidx.compose.material.ContentAlpha
|
|
|
|
import android.widget.TextView
|
|
|
|
import androidx.compose.material.MaterialTheme
|
|
|
|
|
|
|
|
import androidx.compose.material.Text
|
|
|
|
|
|
|
|
import androidx.compose.runtime.Composable
|
|
|
|
|
|
|
|
import androidx.compose.ui.Modifier
|
|
|
|
|
|
|
|
import androidx.compose.ui.platform.LocalContext
|
|
|
|
|
|
|
|
import androidx.compose.ui.res.colorResource
|
|
|
|
|
|
|
|
import androidx.compose.ui.res.stringResource
|
|
|
|
|
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
import com.todoroo.andlib.utility.DateUtilities
|
|
|
|
import com.todoroo.andlib.utility.DateUtilities
|
|
|
|
import com.todoroo.astrid.data.Task.Companion.hasDueTime
|
|
|
|
import com.todoroo.astrid.data.Task.Companion.hasDueTime
|
|
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
|
|
import org.tasks.R
|
|
|
|
import org.tasks.R
|
|
|
|
import org.tasks.databinding.ControlSetDeadlineBinding
|
|
|
|
import org.tasks.compose.collectAsStateLifecycleAware
|
|
|
|
import org.tasks.date.DateTimeUtils
|
|
|
|
import org.tasks.date.DateTimeUtils
|
|
|
|
import org.tasks.dialogs.DateTimePicker
|
|
|
|
import org.tasks.dialogs.DateTimePicker
|
|
|
|
import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker
|
|
|
|
import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker
|
|
|
@ -19,17 +26,11 @@ import java.util.*
|
|
|
|
import javax.inject.Inject
|
|
|
|
import javax.inject.Inject
|
|
|
|
|
|
|
|
|
|
|
|
@AndroidEntryPoint
|
|
|
|
@AndroidEntryPoint
|
|
|
|
class DeadlineControlSet : TaskEditControlFragment() {
|
|
|
|
class DeadlineControlSet : TaskEditControlComposeFragment() {
|
|
|
|
@Inject lateinit var activity: Activity
|
|
|
|
@Inject lateinit var activity: Activity
|
|
|
|
@Inject lateinit var locale: Locale
|
|
|
|
@Inject lateinit var locale: Locale
|
|
|
|
@Inject lateinit var preferences: Preferences
|
|
|
|
@Inject lateinit var preferences: Preferences
|
|
|
|
|
|
|
|
|
|
|
|
private lateinit var dueDate: TextView
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun createView(savedInstanceState: Bundle?) {
|
|
|
|
|
|
|
|
refreshDisplayView()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onRowClick() {
|
|
|
|
override fun onRowClick() {
|
|
|
|
val fragmentManager = parentFragmentManager
|
|
|
|
val fragmentManager = parentFragmentManager
|
|
|
|
if (fragmentManager.findFragmentByTag(FRAG_TAG_DATE_PICKER) == null) {
|
|
|
|
if (fragmentManager.findFragmentByTag(FRAG_TAG_DATE_PICKER) == null) {
|
|
|
@ -44,11 +45,33 @@ class DeadlineControlSet : TaskEditControlFragment() {
|
|
|
|
|
|
|
|
|
|
|
|
override val isClickable = true
|
|
|
|
override val isClickable = true
|
|
|
|
|
|
|
|
|
|
|
|
override fun bind(parent: ViewGroup?) =
|
|
|
|
@Composable
|
|
|
|
ControlSetDeadlineBinding.inflate(layoutInflater, parent, true).let {
|
|
|
|
override fun Body() {
|
|
|
|
dueDate = it.dueDate
|
|
|
|
val context = LocalContext.current
|
|
|
|
it.root
|
|
|
|
val dueDate = viewModel.dueDate.collectAsStateLifecycleAware().value
|
|
|
|
|
|
|
|
val text = if (dueDate == 0L) {
|
|
|
|
|
|
|
|
stringResource(id = R.string.no_due_date)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
DateUtilities.getRelativeDateTime(
|
|
|
|
|
|
|
|
context,
|
|
|
|
|
|
|
|
dueDate,
|
|
|
|
|
|
|
|
locale,
|
|
|
|
|
|
|
|
FormatStyle.FULL,
|
|
|
|
|
|
|
|
preferences.alwaysDisplayFullDate,
|
|
|
|
|
|
|
|
false
|
|
|
|
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
val color = when {
|
|
|
|
|
|
|
|
dueDate == 0L -> MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled)
|
|
|
|
|
|
|
|
dueDate.isOverdue -> colorResource(id = R.color.overdue)
|
|
|
|
|
|
|
|
else -> MaterialTheme.colors.onSurface
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Text(
|
|
|
|
|
|
|
|
text = text,
|
|
|
|
|
|
|
|
color = color,
|
|
|
|
|
|
|
|
modifier = Modifier.padding(vertical = 20.dp)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override val icon = R.drawable.ic_outline_schedule_24px
|
|
|
|
override val icon = R.drawable.ic_outline_schedule_24px
|
|
|
|
|
|
|
|
|
|
|
@ -59,42 +82,21 @@ class DeadlineControlSet : TaskEditControlFragment() {
|
|
|
|
if (resultCode == Activity.RESULT_OK) {
|
|
|
|
if (resultCode == Activity.RESULT_OK) {
|
|
|
|
viewModel.setDueDate(data!!.getLongExtra(DateTimePicker.EXTRA_TIMESTAMP, 0L))
|
|
|
|
viewModel.setDueDate(data!!.getLongExtra(DateTimePicker.EXTRA_TIMESTAMP, 0L))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
refreshDisplayView()
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
super.onActivityResult(requestCode, resultCode, data)
|
|
|
|
super.onActivityResult(requestCode, resultCode, data)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun refreshDisplayView() {
|
|
|
|
|
|
|
|
val date = viewModel.dueDate.value
|
|
|
|
|
|
|
|
if (date == 0L) {
|
|
|
|
|
|
|
|
dueDate.text = ""
|
|
|
|
|
|
|
|
setTextColor(false)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
dueDate.text = DateUtilities.getRelativeDateTime(
|
|
|
|
|
|
|
|
activity,
|
|
|
|
|
|
|
|
date,
|
|
|
|
|
|
|
|
locale,
|
|
|
|
|
|
|
|
FormatStyle.FULL,
|
|
|
|
|
|
|
|
preferences.alwaysDisplayFullDate,
|
|
|
|
|
|
|
|
false
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
setTextColor(if (hasDueTime(date)) {
|
|
|
|
|
|
|
|
DateTimeUtils.newDateTime(date).isBeforeNow
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
DateTimeUtils.newDateTime(date).endOfDay().isBeforeNow
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun setTextColor(overdue: Boolean) {
|
|
|
|
|
|
|
|
dueDate.setTextColor(
|
|
|
|
|
|
|
|
activity.getColor(if (overdue) R.color.overdue else R.color.text_primary))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
companion object {
|
|
|
|
const val TAG = R.string.TEA_ctrl_when_pref
|
|
|
|
const val TAG = R.string.TEA_ctrl_when_pref
|
|
|
|
private const val REQUEST_DATE = 504
|
|
|
|
private const val REQUEST_DATE = 504
|
|
|
|
private const val FRAG_TAG_DATE_PICKER = "frag_tag_date_picker"
|
|
|
|
private const val FRAG_TAG_DATE_PICKER = "frag_tag_date_picker"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private val Long.isOverdue: Boolean
|
|
|
|
|
|
|
|
get() = if (hasDueTime(this)) {
|
|
|
|
|
|
|
|
DateTimeUtils.newDateTime(this).isBeforeNow
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
DateTimeUtils.newDateTime(this).endOfDay().isBeforeNow
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|