in app/src/main/java/com/example/android/trackr/ui/edit/TaskEditFragment.kt [65:177]
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val taskId = args.taskId
viewModel.taskId = taskId
val themedContext = ContextThemeWrapper(
requireContext(),
R.style.ThemeOverlay_Trackr_TaskEdit
)
val dialog = MaterialAlertDialogBuilder(themedContext)
.setCancelable(false)
.setOnKeyListener { _, keyCode, event ->
// This is the only way to intercept the back button press in DialogFragment.
if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) {
close()
true
} else false
}
.create()
val binding = TaskEditFragmentBinding.inflate(dialog.layoutInflater)
binding.viewModel = viewModel
binding.clock = clock
binding.lifecycleOwner = this
binding.toolbar.setTitle(if (taskId == 0L) R.string.new_task else R.string.edit_task)
binding.toolbar.setNavigationOnClickListener {
close()
}
binding.toolbar.setOnMenuItemClickListener { item ->
when (item.itemId) {
R.id.action_save -> {
if (binding.content.title.text.toString().isEmpty()) {
binding.content.title.error = resources.getString(R.string.missing_title_error)
} else {
viewModel.save { success ->
if (success) {
findNavController().popBackStack()
}
}
}
true
}
else -> false
}
}
val menuItemSave = binding.toolbar.menu.findItem(R.id.action_save)
binding.content.status.adapter = ArrayAdapter(
requireContext(),
R.layout.status_spinner_item,
R.id.status_text,
TaskStatus.values().map {
getString(it.stringResId)
}
)
binding.content.status.doOnItemSelected { position ->
viewModel.updateState(TaskStatus.values()[position])
}
binding.content.tagContainer.setOnClickListener {
findNavController().navigate(R.id.nav_tag_selection)
}
binding.content.owner.setOnClickListener {
findNavController().navigate(R.id.nav_user_selection)
}
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
viewModel.modified.collect { modified ->
menuItemSave.isVisible = modified
}
}
launch {
viewModel.status.collect { status ->
binding.content.status.setSelection(status.ordinal)
}
}
launch {
viewModel.owner.collect {
binding.content.owner.contentDescription =
resources.getString(R.string.owner_with_value, it.username)
}
}
launch {
viewModel.dueAt.collect {
binding.content.dueAt.contentDescription = resources.getString(
R.string.due_date_with_value,
DateTimeUtils.formattedDate(resources, it, clock)
)
binding.content.dueAt.setOnClickListener {
MaterialDatePicker.Builder.datePicker().build().apply {
addOnPositiveButtonClickListener { time ->
viewModel.updateDueAt(Instant.ofEpochMilli(time))
}
}.show(childFragmentManager, FRAGMENT_DATE_PICKER)
}
}
}
launch {
// TODO: Add a fragment test to verify changes result in navigation.
viewModel.discarded.collect {
findNavController().popBackStack(R.id.nav_task_edit_graph, true)
}
}
}
}
return dialog.apply {
setView(binding.root)
WindowCompat.setDecorFitsSystemWindows(requireNotNull(window), false)
}
}