@ -19,7 +19,7 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.activity. OnBackPresse dCallback
import androidx.activity. ad dCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.StringRes
import androidx.appcompat.app.AppCompatActivity
@ -50,8 +50,8 @@ import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.bottomappbar.BottomAppBar
import com.google.android.material.composethemeadapter.MdcTheme
import com.google.android.material.snackbar.Snackbar
import com.todoroo.andlib .sql.Join
import com.todoroo.andlib .sql.QueryTemplate
import org.tasks.data .sql.Join
import org.tasks.data .sql.QueryTemplate
import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.adapter.TaskAdapter
import com.todoroo.astrid.adapter.TaskAdapterProvider
@ -65,9 +65,7 @@ import com.todoroo.astrid.api.FilterImpl
import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.core.BuiltInFilterExposer
import com.todoroo.astrid.dao.Database
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.repeats.RepeatTaskHelper
import com.todoroo.astrid.service.TaskCompleter
import com.todoroo.astrid.service.TaskCreator
@ -80,6 +78,7 @@ import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import org.tasks.LocalBroadcastManager
import org.tasks.R
@ -94,12 +93,15 @@ import org.tasks.billing.PurchaseActivity
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.compose.SubscriptionNagBanner
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.data.CaldavDao
import org.tasks.data.Tag
import org.tasks.data.TagDataDao
import org.tasks.data.dao.CaldavDao
import org.tasks.data.db.Database
import org.tasks.data.entity.Tag
import org.tasks.data.dao.TagDataDao
import org.tasks.data.entity.Task
import org.tasks.data.TaskContainer
import org.tasks.data.listSettingsClass
import org.tasks.databinding.FragmentTaskListBinding
import org.tasks.d b.SuspendDbUtils.chunkedMap
import org.tasks.d ata.d b.SuspendDbUtils.chunkedMap
import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker
import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
@ -118,10 +120,12 @@ import org.tasks.preferences.Preferences
import org.tasks.sync.SyncAdapters
import org.tasks.tags.TagPickerActivity
import org.tasks.tasklist.DragAndDropRecyclerAdapter
import org.tasks.tasklist.SectionedDataSource
import org.tasks.tasklist.TaskViewHolder
import org.tasks.tasklist.ViewHolderFactory
import org.tasks.themes.ColorProvider
import org.tasks.themes.ThemeColor
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.ui.TaskEditEvent
import org.tasks.ui.TaskEditEventBus
import org.tasks.ui.TaskListEvent
@ -174,11 +178,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
private var mode : ActionMode ? = null
lateinit var themeColor : ThemeColor
private lateinit var binding : FragmentTaskListBinding
private val onBackPressed = object : OnBackPressedCallback ( false ) {
override fun handleOnBackPressed ( ) {
search . collapseActionView ( )
}
}
private val sortRequest =
registerForActivityResult ( ActivityResultContracts . StartActivityForResult ( ) ) { result ->
@ -188,7 +187,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
activity ?. recreate ( )
}
if ( data . getBooleanExtra ( SortSettingsActivity . EXTRA _CHANGED _GROUP , false ) ) {
taskAdapter . clearCollapsed ( )
listViewModel . clearCollapsed ( )
}
listViewModel . invalidate ( )
}
@ -237,7 +236,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
super . onSaveInstanceState ( outState )
val selectedTaskIds : List < Long > = taskAdapter . getSelected ( )
outState . putLongArray ( EXTRA _SELECTED _TASK _IDS , selectedTaskIds . toLongArray ( ) )
outState . putLongArray ( EXTRA _COLLAPSED , taskAdapter . getCollapsed ( ) . toLongArray ( ) )
}
override fun onViewCreated ( view : View , savedInstanceState : Bundle ? ) {
@ -248,15 +246,21 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
. launchIn ( viewLifecycleOwner . lifecycleScope )
}
override fun onCreate ( savedInstanceState : Bundle ? ) {
super . onCreate ( savedInstanceState )
requireActivity ( ) . onBackPressedDispatcher . addCallback ( requireActivity ( ) , onBackPressed )
}
@OptIn ( ExperimentalAnimationApi :: class )
override fun onCreateView (
inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ) : View {
requireActivity ( ) . onBackPressedDispatcher . addCallback ( owner = viewLifecycleOwner ) {
if ( search . isActionViewExpanded ) {
search . collapseActionView ( )
} else {
requireActivity ( ) . finish ( )
if ( ! preferences . getBoolean ( R . string . p _open _last _viewed _list , true ) ) {
runBlocking {
mainViewModel . resetFilter ( )
}
}
}
}
binding = FragmentTaskListBinding . inflate ( inflater , container , false )
filter = getFilter ( )
val swipeRefreshLayout : SwipeRefreshLayout
@ -274,7 +278,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
// set up list adapters
taskAdapter = taskAdapterProvider . createTaskAdapter ( filter )
taskAdapter . setCollapsed ( savedInstanceState ?. getLongArray ( EXTRA _COLLAPSED ) )
listViewModel . setFilter ( filter )
( recyclerView . itemAnimator as DefaultItemAnimator ) . supportsChangeAnimations = false
recyclerView . layoutManager = LinearLayoutManager ( context )
@ -349,7 +352,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
if ( Tasks . IS _GOOGLE _PLAY ) {
context . startActivity ( Intent ( context , PurchaseActivity :: class . java ) )
} else {
preferences . lastSubscribeRequest = DateUtilities . now ( )
preferences . lastSubscribeRequest = currentTimeMillis ( )
context . openUri ( R . string . url _donate )
}
} ,
@ -362,11 +365,19 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
return binding . root
}
private fun submitList ( tasks : List< TaskContainer > ) {
private fun submitList ( tasks : SectionedDataSource ) {
if ( recyclerAdapter !is DragAndDropRecyclerAdapter ) {
setAdapter (
DragAndDropRecyclerAdapter (
taskAdapter , binding . bodyStandard . recyclerView , viewHolderFactory , this , tasks , preferences ) )
adapter = taskAdapter ,
recyclerView = binding . bodyStandard . recyclerView ,
viewHolderFactory = viewHolderFactory ,
taskList = this ,
tasks = tasks ,
preferences = preferences ,
toggleCollapsed = { listViewModel . toggleCollapsed ( it ) } ,
)
)
} else {
recyclerAdapter ?. submitList ( tasks )
}
@ -669,7 +680,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
}
override fun onMenuItemActionExpand ( item : MenuItem ) : Boolean {
onBackPressed . isEnabled = true
search . setOnQueryTextListener ( this )
listViewModel . setSearchQuery ( " " )
if ( preferences . isTopAppBar ) {
@ -679,7 +689,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
}
override fun onMenuItemActionCollapse ( item : MenuItem ) : Boolean {
onBackPressed . isEnabled = false
search . setOnQueryTextListener ( null )
listViewModel . setFilter ( filter )
listViewModel . setSearchQuery ( null )
@ -894,15 +903,13 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
makeSnackbar ( R . string . copy _multiple _tasks _confirmation , duplicates . size . toString ( ) ) ?. show ( )
}
fun clearCollapsed ( ) = taskAdapter . clearCollapsed ( )
override fun onCompletedTask ( task : TaskContainer , newState : Boolean ) {
if ( task . isReadOnly ) {
return
}
lifecycleScope . launch {
taskCompleter . setComplete ( task . task , newState )
taskAdapter . onCompletedTask ( task , newState )
taskAdapter . onCompletedTask ( task .uuid , newState )
loadTaskListContent ( )
}
}
@ -1010,7 +1017,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
const val ACTION _RELOAD = " action_reload "
const val ACTION _DELETED = " action_deleted "
private const val EXTRA _SELECTED _TASK _IDS = " extra_selected_task_ids "
private const val EXTRA _COLLAPSED = " extra_collapsed "
private const val VOICE _RECOGNITION _REQUEST _CODE = 1234
private const val EXTRA _FILTER = " extra_filter "
private const val FRAG _TAG _REMOTE _LIST _PICKER = " frag_tag_remote_list_picker "