override fun onCreateDialog()

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)
        }
    }