1
1
/*
2
- * Copyright (C) 2019 The Android Open Source Project
2
+ * Copyright (C) 2022 The Android Open Source Project
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -24,20 +24,18 @@ import android.view.MenuItem
24
24
import android.view.View
25
25
import android.view.ViewGroup
26
26
import androidx.appcompat.widget.PopupMenu
27
+ import androidx.compose.ui.platform.ComposeView
28
+ import androidx.compose.ui.platform.ViewCompositionStrategy
27
29
import androidx.fragment.app.Fragment
28
30
import androidx.fragment.app.viewModels
29
31
import androidx.navigation.fragment.findNavController
30
32
import androidx.navigation.fragment.navArgs
31
- import com.example.android.architecture.blueprints.todoapp.EventObserver
32
33
import com.example.android.architecture.blueprints.todoapp.R
33
34
import com.example.android.architecture.blueprints.todoapp.data.Task
34
- import com.example.android.architecture.blueprints.todoapp.databinding.TasksFragBinding
35
35
import com.example.android.architecture.blueprints.todoapp.util.getViewModelFactory
36
- import com.example.android.architecture.blueprints.todoapp.util.setupRefreshLayout
37
36
import com.example.android.architecture.blueprints.todoapp.util.setupSnackbar
38
- import com.google.android.material.floatingactionbutton.FloatingActionButton
37
+ import com.google.accompanist.appcompattheme.AppCompatTheme
39
38
import com.google.android.material.snackbar.Snackbar
40
- import timber.log.Timber
41
39
42
40
/* *
43
41
* Display a grid of [Task]s. User can choose to view all, active or completed tasks.
@@ -48,20 +46,31 @@ class TasksFragment : Fragment() {
48
46
49
47
private val args: TasksFragmentArgs by navArgs()
50
48
51
- private lateinit var viewDataBinding: TasksFragBinding
52
-
53
- private lateinit var listAdapter: TasksAdapter
54
-
55
49
override fun onCreateView (
56
50
inflater : LayoutInflater ,
57
51
container : ViewGroup ? ,
58
52
savedInstanceState : Bundle ?
59
53
): View {
60
- viewDataBinding = TasksFragBinding .inflate(inflater, container, false ).apply {
61
- viewmodel = viewModel
62
- }
63
54
setHasOptionsMenu(true )
64
- return viewDataBinding.root
55
+
56
+ return ComposeView (requireContext()).apply {
57
+ // Dispose of the Composition when the view's LifecycleOwner is destroyed
58
+ setViewCompositionStrategy(ViewCompositionStrategy .DisposeOnViewTreeLifecycleDestroyed )
59
+ setContent {
60
+ AppCompatTheme {
61
+ TasksScreen (
62
+ viewModel = viewModel,
63
+ onAddTask = { navigateToAddNewTask() },
64
+ onTaskClick = { openTaskDetails(it.id) }
65
+ )
66
+ }
67
+ }
68
+ }
69
+ }
70
+
71
+ override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
72
+ super .onViewCreated(view, savedInstanceState)
73
+ setupSnackbar()
65
74
}
66
75
67
76
override fun onOptionsItemSelected (item : MenuItem ) =
@@ -85,33 +94,6 @@ class TasksFragment : Fragment() {
85
94
inflater.inflate(R .menu.tasks_fragment_menu, menu)
86
95
}
87
96
88
- override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
89
- super .onViewCreated(view, savedInstanceState)
90
-
91
- // Set the lifecycle owner to the lifecycle of the view
92
- viewDataBinding.lifecycleOwner = this .viewLifecycleOwner
93
- setupSnackbar()
94
- setupListAdapter()
95
- setupRefreshLayout(viewDataBinding.refreshLayout, viewDataBinding.tasksList)
96
- setupNavigation()
97
- setupFab()
98
- }
99
-
100
- private fun setupNavigation () {
101
- viewModel.openTaskEvent.observe(
102
- viewLifecycleOwner,
103
- EventObserver {
104
- openTaskDetails(it)
105
- }
106
- )
107
- viewModel.newTaskEvent.observe(
108
- viewLifecycleOwner,
109
- EventObserver {
110
- navigateToAddNewTask()
111
- }
112
- )
113
- }
114
-
115
97
private fun setupSnackbar () {
116
98
view?.setupSnackbar(viewLifecycleOwner, viewModel.snackbarText, Snackbar .LENGTH_SHORT )
117
99
arguments?.let {
@@ -138,15 +120,6 @@ class TasksFragment : Fragment() {
138
120
}
139
121
}
140
122
141
- // TODO: Move this to databinding
142
- private fun setupFab () {
143
- requireView().findViewById<FloatingActionButton >(R .id.add_task_fab)?.let {
144
- it.setOnClickListener {
145
- navigateToAddNewTask()
146
- }
147
- }
148
- }
149
-
150
123
private fun navigateToAddNewTask () {
151
124
val action = TasksFragmentDirections
152
125
.actionTasksFragmentToAddEditTaskFragment(
@@ -160,14 +133,4 @@ class TasksFragment : Fragment() {
160
133
val action = TasksFragmentDirections .actionTasksFragmentToTaskDetailFragment(taskId)
161
134
findNavController().navigate(action)
162
135
}
163
-
164
- private fun setupListAdapter () {
165
- val viewModel = viewDataBinding.viewmodel
166
- if (viewModel != null ) {
167
- listAdapter = TasksAdapter (viewModel)
168
- viewDataBinding.tasksList.adapter = listAdapter
169
- } else {
170
- Timber .w(" ViewModel not initialized when attempting to set up adapter." )
171
- }
172
- }
173
136
}
0 commit comments