1
+ package io.github.mrtry.todolist.app.todo.ui
2
+
3
+ import android.os.Bundle
4
+ import android.view.KeyEvent
5
+ import android.view.LayoutInflater
6
+ import android.view.View
7
+ import android.view.ViewGroup
8
+ import androidx.activity.addCallback
9
+ import androidx.fragment.app.DialogFragment
10
+ import io.github.mrtry.todolist.R
11
+ import io.github.mrtry.todolist.app.todo.ui.navigator.EditTaskNavigator
12
+ import io.github.mrtry.todolist.databinding.FragmentEditTaskBinding
13
+ import io.github.mrtry.todolist.di.Injectable
14
+ import io.github.mrtry.todolist.di.component.EditTaskComponent
15
+ import io.github.mrtry.todolist.di.component.ToDoComponent
16
+ import io.github.mrtry.todolist.di.module.FragmentModule
17
+ import io.github.mrtry.todolist.di.utils.ComponentUtils
18
+ import io.github.mrtry.todolist.misc.ui.binding.Bindable
19
+ import io.github.mrtry.todolist.task.entity.Task
20
+ import kotlinx.coroutines.CoroutineScope
21
+ import kotlinx.coroutines.cancelChildren
22
+ import timber.log.Timber
23
+ import javax.inject.Inject
24
+
25
+
26
+ private const val KEY_TASK = " KEY_TASK"
27
+
28
+ class EditTaskDialogFragment : DialogFragment (), Injectable<EditTaskComponent>, Bindable<FragmentEditTaskBinding> {
29
+ companion object {
30
+ val TAG : String = EditTaskDialogFragment ::class .java.simpleName
31
+
32
+ fun newInstance (task : Task ): EditTaskDialogFragment {
33
+ val fragment = EditTaskDialogFragment ()
34
+ val args = Bundle ()
35
+ args.putParcelable(KEY_TASK , task)
36
+ fragment.arguments = args
37
+ return fragment
38
+ }
39
+ }
40
+
41
+ override val viewBinding: FragmentEditTaskBinding by lazy {
42
+ FragmentEditTaskBinding .inflate(layoutInflater)
43
+ }
44
+
45
+ override lateinit var component: EditTaskComponent
46
+
47
+ @Inject
48
+ lateinit var navigator: EditTaskNavigator
49
+
50
+ @Inject
51
+ lateinit var coroutineScope: CoroutineScope
52
+
53
+ override fun onCreate (savedInstanceState : Bundle ? ) {
54
+ super .onCreate(savedInstanceState)
55
+ setStyle(STYLE_NORMAL , R .style.Widget_FullScreenDialog )
56
+ }
57
+
58
+ override fun onCreateView (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ): View {
59
+ super .onCreateView(inflater, container, savedInstanceState)
60
+ return viewBinding.root
61
+ }
62
+
63
+ override fun onActivityCreated (savedInstanceState : Bundle ? ) {
64
+ super .onActivityCreated(savedInstanceState)
65
+ component = ComponentUtils .getComponent<ToDoComponent >(requireActivity())
66
+ .plusEditTaskComponent(FragmentModule (this ))
67
+ component.inject(this )
68
+
69
+ requireActivity().onBackPressedDispatcher.addCallback(this ) {
70
+ Timber .d(" on back pressed" )
71
+ }
72
+
73
+ // DialogFragmentのcancel()を無効にして、back pressをハンドリングする
74
+ // see: https://stackoverflow.com/a/7622065
75
+ isCancelable = false
76
+ dialog?.setOnKeyListener { _, keyCode, event ->
77
+ if (keyCode == KeyEvent .KEYCODE_BACK && event.action == = KeyEvent .ACTION_UP ) {
78
+ navigator.onBackPressed()
79
+ true
80
+ } else false
81
+ }
82
+ }
83
+
84
+ override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
85
+ super .onViewCreated(view, savedInstanceState)
86
+ with (viewBinding.toolbar) {
87
+ setNavigationOnClickListener { navigator.onBackPressed() }
88
+ inflateMenu(R .menu.menu_fragment_edit_task)
89
+ setOnMenuItemClickListener {
90
+ navigator.onBackPressed()
91
+ true
92
+ }
93
+ }
94
+ }
95
+
96
+ override fun onStart () {
97
+ super .onStart()
98
+ dialog?.window?.setLayout(
99
+ ViewGroup .LayoutParams .MATCH_PARENT ,
100
+ ViewGroup .LayoutParams .MATCH_PARENT
101
+ )
102
+ }
103
+
104
+ override fun onStop () {
105
+ super .onStop()
106
+ coroutineScope.coroutineContext.cancelChildren()
107
+ }
108
+ }
0 commit comments