|
|
|
@ -21,13 +21,14 @@ import androidx.compose.runtime.remember
|
|
|
|
|
import androidx.compose.runtime.rememberCoroutineScope
|
|
|
|
|
import androidx.compose.runtime.saveable.rememberSaveable
|
|
|
|
|
import androidx.compose.runtime.setValue
|
|
|
|
|
import androidx.core.content.IntentCompat.getParcelableExtra
|
|
|
|
|
import androidx.lifecycle.Lifecycle
|
|
|
|
|
import androidx.lifecycle.flowWithLifecycle
|
|
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
|
|
import androidx.lifecycle.repeatOnLifecycle
|
|
|
|
|
import com.google.android.material.composethemeadapter.MdcTheme
|
|
|
|
|
import com.todoroo.andlib.utility.AndroidUtilities
|
|
|
|
|
import com.todoroo.astrid.activity.TaskEditFragment.Companion.newTaskEditFragment
|
|
|
|
|
import com.todoroo.astrid.activity.TaskListFragment.TaskListFragmentCallbackHandler
|
|
|
|
|
import com.todoroo.astrid.adapter.SubheaderClickHandler
|
|
|
|
|
import com.todoroo.astrid.api.Filter
|
|
|
|
|
import com.todoroo.astrid.dao.TaskDao
|
|
|
|
@ -37,12 +38,13 @@ import dagger.hilt.android.AndroidEntryPoint
|
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
|
import kotlinx.coroutines.async
|
|
|
|
|
import kotlinx.coroutines.coroutineScope
|
|
|
|
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
|
|
|
|
import kotlinx.coroutines.flow.launchIn
|
|
|
|
|
import kotlinx.coroutines.flow.map
|
|
|
|
|
import kotlinx.coroutines.flow.onEach
|
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
import kotlinx.coroutines.withContext
|
|
|
|
|
import org.tasks.BuildConfig
|
|
|
|
|
import org.tasks.LocalBroadcastManager
|
|
|
|
|
import org.tasks.R
|
|
|
|
|
import org.tasks.Tasks.Companion.IS_GENERIC
|
|
|
|
|
import org.tasks.activities.NavigationDrawerCustomization
|
|
|
|
@ -68,15 +70,13 @@ import org.tasks.extensions.Context.openUri
|
|
|
|
|
import org.tasks.extensions.hideKeyboard
|
|
|
|
|
import org.tasks.filters.FilterProvider
|
|
|
|
|
import org.tasks.filters.PlaceFilter
|
|
|
|
|
import org.tasks.intents.TaskIntents.getTaskListIntent
|
|
|
|
|
import org.tasks.location.LocationPickerActivity
|
|
|
|
|
import org.tasks.location.LocationPickerActivity.Companion.EXTRA_PLACE
|
|
|
|
|
import org.tasks.preferences.DefaultFilterProvider
|
|
|
|
|
import org.tasks.preferences.HelpAndFeedback
|
|
|
|
|
import org.tasks.preferences.MainPreferences
|
|
|
|
|
import org.tasks.preferences.Preferences
|
|
|
|
|
import org.tasks.themes.ColorProvider
|
|
|
|
|
import org.tasks.themes.Theme
|
|
|
|
|
import org.tasks.themes.ThemeColor
|
|
|
|
|
import org.tasks.ui.EmptyTaskEditFragment.Companion.newEmptyTaskEditFragment
|
|
|
|
|
import org.tasks.ui.MainActivityEvent
|
|
|
|
|
import org.tasks.ui.MainActivityEventBus
|
|
|
|
@ -84,12 +84,11 @@ import timber.log.Timber
|
|
|
|
|
import javax.inject.Inject
|
|
|
|
|
|
|
|
|
|
@AndroidEntryPoint
|
|
|
|
|
class MainActivity : AppCompatActivity(), TaskListFragmentCallbackHandler {
|
|
|
|
|
class MainActivity : AppCompatActivity() {
|
|
|
|
|
@Inject lateinit var preferences: Preferences
|
|
|
|
|
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider
|
|
|
|
|
@Inject lateinit var theme: Theme
|
|
|
|
|
@Inject lateinit var taskDao: TaskDao
|
|
|
|
|
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
|
|
|
|
|
@Inject lateinit var taskCreator: TaskCreator
|
|
|
|
|
@Inject lateinit var inventory: Inventory
|
|
|
|
|
@Inject lateinit var colorProvider: ColorProvider
|
|
|
|
@ -105,9 +104,6 @@ class MainActivity : AppCompatActivity(), TaskListFragmentCallbackHandler {
|
|
|
|
|
private var actionMode: ActionMode? = null
|
|
|
|
|
private lateinit var binding: TaskListActivityBinding
|
|
|
|
|
|
|
|
|
|
private val filter: Filter?
|
|
|
|
|
get() = viewModel.state.value.filter
|
|
|
|
|
|
|
|
|
|
private val settingsRequest =
|
|
|
|
|
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
|
|
|
|
recreate()
|
|
|
|
@ -123,6 +119,7 @@ class MainActivity : AppCompatActivity(), TaskListFragmentCallbackHandler {
|
|
|
|
|
currentPro = inventory.hasPro
|
|
|
|
|
binding = TaskListActivityBinding.inflate(layoutInflater)
|
|
|
|
|
setContentView(binding.root)
|
|
|
|
|
logIntent("onCreate")
|
|
|
|
|
handleIntent()
|
|
|
|
|
|
|
|
|
|
binding.composeView.setContent {
|
|
|
|
@ -164,7 +161,7 @@ class MainActivity : AppCompatActivity(), TaskListFragmentCallbackHandler {
|
|
|
|
|
onClick = {
|
|
|
|
|
when (it) {
|
|
|
|
|
is DrawerItem.Filter -> {
|
|
|
|
|
openTaskListFragment(it.type())
|
|
|
|
|
viewModel.setFilter(it.type())
|
|
|
|
|
scope.launch(Dispatchers.Default) {
|
|
|
|
|
sheetState.hide()
|
|
|
|
|
viewModel.setDrawerOpen(false)
|
|
|
|
@ -246,32 +243,95 @@ class MainActivity : AppCompatActivity(), TaskListFragmentCallbackHandler {
|
|
|
|
|
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
|
|
|
|
applyTheme()
|
|
|
|
|
updateSystemBars(viewModel.state.value.filter)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
viewModel
|
|
|
|
|
.state
|
|
|
|
|
.flowWithLifecycle(lifecycle)
|
|
|
|
|
.map { it.filter to it.task }
|
|
|
|
|
.distinctUntilChanged()
|
|
|
|
|
.onEach { (newFilter, task) ->
|
|
|
|
|
Timber.d("filter: $newFilter task: $task")
|
|
|
|
|
val existingTlf =
|
|
|
|
|
supportFragmentManager.findFragmentByTag(FRAG_TAG_TASK_LIST) as TaskListFragment?
|
|
|
|
|
val existingFilter = existingTlf?.getFilter()
|
|
|
|
|
val tlf = if (
|
|
|
|
|
existingFilter != null
|
|
|
|
|
&& existingFilter.areItemsTheSame(newFilter)
|
|
|
|
|
&& existingFilter == newFilter
|
|
|
|
|
// && check if manual sort changed
|
|
|
|
|
) {
|
|
|
|
|
existingTlf
|
|
|
|
|
} else {
|
|
|
|
|
clearUi()
|
|
|
|
|
TaskListFragment.newTaskListFragment(newFilter)
|
|
|
|
|
}
|
|
|
|
|
val existingTef =
|
|
|
|
|
supportFragmentManager.findFragmentByTag(FRAG_TAG_TASK_EDIT) as TaskEditFragment?
|
|
|
|
|
val transaction = supportFragmentManager.beginTransaction()
|
|
|
|
|
if (task == null) {
|
|
|
|
|
if (intent.finishAffinity) {
|
|
|
|
|
finishAffinity()
|
|
|
|
|
} else if (existingTef != null) {
|
|
|
|
|
if (intent.removeTask && intent.broughtToFront) {
|
|
|
|
|
moveTaskToBack(true)
|
|
|
|
|
}
|
|
|
|
|
hideKeyboard()
|
|
|
|
|
transaction
|
|
|
|
|
.replace(R.id.detail, newEmptyTaskEditFragment())
|
|
|
|
|
.runOnCommit {
|
|
|
|
|
if (isSinglePaneLayout) {
|
|
|
|
|
binding.master.visibility = View.VISIBLE
|
|
|
|
|
binding.detail.visibility = View.GONE
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (task != existingTef?.task) {
|
|
|
|
|
existingTef?.save(remove = false)
|
|
|
|
|
transaction
|
|
|
|
|
.replace(R.id.detail, newTaskEditFragment(task), FRAG_TAG_TASK_EDIT)
|
|
|
|
|
.runOnCommit {
|
|
|
|
|
if (isSinglePaneLayout) {
|
|
|
|
|
binding.detail.visibility = View.VISIBLE
|
|
|
|
|
binding.master.visibility = View.GONE
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
defaultFilterProvider.setLastViewedFilter(newFilter)
|
|
|
|
|
theme
|
|
|
|
|
.withThemeColor(getFilterColor(newFilter))
|
|
|
|
|
.applyToContext(this) // must happen before committing fragment
|
|
|
|
|
transaction
|
|
|
|
|
.replace(R.id.master, tlf, FRAG_TAG_TASK_LIST)
|
|
|
|
|
.runOnCommit { updateSystemBars(newFilter) }
|
|
|
|
|
.commit()
|
|
|
|
|
}
|
|
|
|
|
.launchIn(lifecycleScope)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private suspend fun process(event: MainActivityEvent) = when (event) {
|
|
|
|
|
is MainActivityEvent.OpenTask ->
|
|
|
|
|
onTaskListItemClicked(event.task)
|
|
|
|
|
private fun process(event: MainActivityEvent) = when (event) {
|
|
|
|
|
is MainActivityEvent.ClearTaskEditFragment ->
|
|
|
|
|
removeTaskEditFragment()
|
|
|
|
|
viewModel.setTask(null)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Deprecated("Deprecated in Java")
|
|
|
|
|
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
|
|
|
|
when (requestCode) {
|
|
|
|
|
REQUEST_NEW_LIST ->
|
|
|
|
|
if (resultCode == RESULT_OK) {
|
|
|
|
|
data
|
|
|
|
|
?.getParcelableExtra<Filter>(OPEN_FILTER)
|
|
|
|
|
?.let { startActivity(getTaskListIntent(this, it)) }
|
|
|
|
|
if (resultCode == RESULT_OK && data != null) {
|
|
|
|
|
getParcelableExtra(data, OPEN_FILTER, Filter::class.java)?.let {
|
|
|
|
|
viewModel.setFilter(it)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
REQUEST_NEW_PLACE ->
|
|
|
|
|
if (resultCode == RESULT_OK) {
|
|
|
|
|
data
|
|
|
|
|
?.getParcelableExtra<Place>(LocationPickerActivity.EXTRA_PLACE)
|
|
|
|
|
?.let { startActivity(getTaskListIntent(this, PlaceFilter(it))) }
|
|
|
|
|
if (resultCode == RESULT_OK && data != null) {
|
|
|
|
|
getParcelableExtra(data, EXTRA_PLACE, Place::class.java)?.let {
|
|
|
|
|
viewModel.setFilter(PlaceFilter(it))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else ->
|
|
|
|
|
super.onActivityResult(requestCode, resultCode, data)
|
|
|
|
|
}
|
|
|
|
@ -280,185 +340,74 @@ class MainActivity : AppCompatActivity(), TaskListFragmentCallbackHandler {
|
|
|
|
|
override fun onNewIntent(intent: Intent) {
|
|
|
|
|
super.onNewIntent(intent)
|
|
|
|
|
setIntent(intent)
|
|
|
|
|
logIntent("onNewIntent")
|
|
|
|
|
handleIntent()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun clearUi() {
|
|
|
|
|
finishActionMode()
|
|
|
|
|
actionMode?.finish()
|
|
|
|
|
actionMode = null
|
|
|
|
|
viewModel.setDrawerOpen(false)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private suspend fun getTaskToLoad(filter: Filter?): Task? {
|
|
|
|
|
val intent = intent
|
|
|
|
|
if (intent.isFromHistory) {
|
|
|
|
|
return null
|
|
|
|
|
}
|
|
|
|
|
if (intent.hasExtra(CREATE_TASK)) {
|
|
|
|
|
private suspend fun getTaskToLoad(filter: Filter?): Task? = when {
|
|
|
|
|
intent.isFromHistory -> null
|
|
|
|
|
intent.hasExtra(CREATE_TASK) -> {
|
|
|
|
|
val source = intent.getStringExtra(CREATE_SOURCE)
|
|
|
|
|
firebase.addTask(source ?: "unknown")
|
|
|
|
|
intent.removeExtra(CREATE_TASK)
|
|
|
|
|
intent.removeExtra(CREATE_SOURCE)
|
|
|
|
|
return taskCreator.createWithValues(filter, "")
|
|
|
|
|
taskCreator.createWithValues(filter, "")
|
|
|
|
|
}
|
|
|
|
|
if (intent.hasExtra(OPEN_TASK)) {
|
|
|
|
|
val task: Task? = intent.getParcelableExtra(OPEN_TASK)
|
|
|
|
|
|
|
|
|
|
intent.hasExtra(OPEN_TASK) -> {
|
|
|
|
|
val task = getParcelableExtra(intent, OPEN_TASK, Task::class.java)
|
|
|
|
|
intent.removeExtra(OPEN_TASK)
|
|
|
|
|
return task
|
|
|
|
|
task
|
|
|
|
|
}
|
|
|
|
|
return null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun openTask(filter: Filter?) = lifecycleScope.launch {
|
|
|
|
|
val task = getTaskToLoad(filter)
|
|
|
|
|
when {
|
|
|
|
|
task != null -> onTaskListItemClicked(task)
|
|
|
|
|
taskEditFragment == null -> hideDetailFragment()
|
|
|
|
|
else -> showDetailFragment()
|
|
|
|
|
}
|
|
|
|
|
else -> null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun handleIntent() {
|
|
|
|
|
val intent = intent
|
|
|
|
|
val openFilter = intent.getFilter
|
|
|
|
|
val loadFilter = intent.getFilterString
|
|
|
|
|
val openTask = !intent.isFromHistory
|
|
|
|
|
&& (intent.hasExtra(OPEN_TASK) || intent.hasExtra(CREATE_TASK))
|
|
|
|
|
val tef = taskEditFragment
|
|
|
|
|
private fun logIntent(caller: String) {
|
|
|
|
|
if (BuildConfig.DEBUG) {
|
|
|
|
|
Timber.d(
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
**********
|
|
|
|
|
broughtToFront: ${intent.broughtToFront}
|
|
|
|
|
isFromHistory: ${intent.isFromHistory}
|
|
|
|
|
flags: ${intent.flagsToString}
|
|
|
|
|
OPEN_FILTER: ${openFilter?.let { "${it.title}: $it" }}
|
|
|
|
|
LOAD_FILTER: $loadFilter
|
|
|
|
|
OPEN_TASK: ${intent.getParcelableExtra<Task>(OPEN_TASK)}
|
|
|
|
|
CREATE_TASK: ${intent.hasExtra(CREATE_TASK)}
|
|
|
|
|
taskListFragment: ${taskListFragment?.getFilter()?.let { "${it.title}: $it" }}
|
|
|
|
|
taskEditFragment: ${taskEditFragment?.editViewModel?.task}
|
|
|
|
|
**********"""
|
|
|
|
|
Timber.d("""
|
|
|
|
|
$caller
|
|
|
|
|
**********
|
|
|
|
|
broughtToFront: ${intent.broughtToFront}
|
|
|
|
|
isFromHistory: ${intent.isFromHistory}
|
|
|
|
|
flags: ${intent.flagsToString}
|
|
|
|
|
OPEN_FILTER: ${getParcelableExtra(intent, OPEN_FILTER, Filter::class.java)?.let { "${it.title}: $it" }}
|
|
|
|
|
LOAD_FILTER: ${intent.getStringExtra(LOAD_FILTER)}
|
|
|
|
|
OPEN_TASK: ${getParcelableExtra(intent, OPEN_TASK, Task::class.java)}
|
|
|
|
|
CREATE_TASK: ${intent.hasExtra(CREATE_TASK)}
|
|
|
|
|
**********""".trimIndent()
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
if (!openTask && (openFilter != null || !loadFilter.isNullOrBlank())) {
|
|
|
|
|
tef?.let {
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
it.save()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!loadFilter.isNullOrBlank() || openFilter == null && filter == null) {
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
val filter = if (loadFilter.isNullOrBlank()) {
|
|
|
|
|
defaultFilterProvider.getStartupFilter()
|
|
|
|
|
} else {
|
|
|
|
|
defaultFilterProvider.getFilterFromPreference(loadFilter)
|
|
|
|
|
}
|
|
|
|
|
clearUi()
|
|
|
|
|
if (isSinglePaneLayout) {
|
|
|
|
|
if (openTask) {
|
|
|
|
|
setFilter(filter)
|
|
|
|
|
openTask(filter)
|
|
|
|
|
} else {
|
|
|
|
|
openTaskListFragment(filter, true)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
openTaskListFragment(filter, true)
|
|
|
|
|
openTask(filter)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (openFilter != null) {
|
|
|
|
|
clearUi()
|
|
|
|
|
if (isSinglePaneLayout) {
|
|
|
|
|
if (openTask) {
|
|
|
|
|
setFilter(openFilter)
|
|
|
|
|
openTask(openFilter)
|
|
|
|
|
} else {
|
|
|
|
|
openTaskListFragment(openFilter, true)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
openTaskListFragment(openFilter, true)
|
|
|
|
|
openTask(openFilter)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
val existing = taskListFragment
|
|
|
|
|
val target = if (existing == null || existing.getFilter() !== filter) {
|
|
|
|
|
TaskListFragment.newTaskListFragment(applicationContext, filter)
|
|
|
|
|
} else {
|
|
|
|
|
existing
|
|
|
|
|
}
|
|
|
|
|
if (isSinglePaneLayout) {
|
|
|
|
|
if (openTask || tef != null) {
|
|
|
|
|
openTask(filter)
|
|
|
|
|
} else {
|
|
|
|
|
openTaskListFragment(filter, false)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
openTaskListFragment(target, false)
|
|
|
|
|
openTask(filter)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun showDetailFragment() {
|
|
|
|
|
if (isSinglePaneLayout) {
|
|
|
|
|
binding.detail.visibility = View.VISIBLE
|
|
|
|
|
binding.master.visibility = View.GONE
|
|
|
|
|
private fun handleIntent() {
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
val filter = intent.getFilter
|
|
|
|
|
?: intent.getFilterString?.let { defaultFilterProvider.getFilterFromPreference(it) }
|
|
|
|
|
?: viewModel.state.value.filter
|
|
|
|
|
val task = getTaskToLoad(filter)
|
|
|
|
|
viewModel.setFilter(filter = filter, task = task)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun hideDetailFragment() {
|
|
|
|
|
supportFragmentManager
|
|
|
|
|
.beginTransaction()
|
|
|
|
|
.replace(R.id.detail, newEmptyTaskEditFragment())
|
|
|
|
|
.runOnCommit {
|
|
|
|
|
if (isSinglePaneLayout) {
|
|
|
|
|
binding.master.visibility = View.VISIBLE
|
|
|
|
|
binding.detail.visibility = View.GONE
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.commit()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun setFilter(newFilter: Filter?) {
|
|
|
|
|
newFilter?.let {
|
|
|
|
|
viewModel.setFilter(it)
|
|
|
|
|
applyTheme()
|
|
|
|
|
private fun updateSystemBars(filter: Filter) {
|
|
|
|
|
with (getFilterColor(filter)) {
|
|
|
|
|
applyToNavigationBar(this@MainActivity)
|
|
|
|
|
applyTaskDescription(this@MainActivity, filter.title ?: getString(R.string.app_name))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun openTaskListFragment(filter: Filter?, force: Boolean = false) {
|
|
|
|
|
openTaskListFragment(TaskListFragment.newTaskListFragment(applicationContext, filter), force)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun openTaskListFragment(taskListFragment: TaskListFragment, force: Boolean) {
|
|
|
|
|
AndroidUtilities.assertMainThread()
|
|
|
|
|
if (supportFragmentManager.isDestroyed) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
val newFilter = taskListFragment.getFilter()
|
|
|
|
|
if (!force && filter == newFilter) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
viewModel.setFilter(newFilter)
|
|
|
|
|
applyTheme()
|
|
|
|
|
supportFragmentManager
|
|
|
|
|
.beginTransaction()
|
|
|
|
|
.replace(R.id.master, taskListFragment, FRAG_TAG_TASK_LIST)
|
|
|
|
|
.commitNowAllowingStateLoss()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun applyTheme() {
|
|
|
|
|
val filterColor = filterColor
|
|
|
|
|
filterColor.applyToNavigationBar(this)
|
|
|
|
|
filterColor.applyTaskDescription(this, filter?.title ?: getString(R.string.app_name))
|
|
|
|
|
theme.withThemeColor(filterColor).applyToContext(this)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private val filterColor: ThemeColor
|
|
|
|
|
get() = filter?.tint?.takeIf { it != 0 }
|
|
|
|
|
?.let { colorProvider.getThemeColor(it, true) } ?: theme.themeColor
|
|
|
|
|
private fun getFilterColor(filter: Filter) =
|
|
|
|
|
if (filter.tint != 0)
|
|
|
|
|
colorProvider.getThemeColor(filter.tint, true)
|
|
|
|
|
else
|
|
|
|
|
theme.themeColor
|
|
|
|
|
|
|
|
|
|
override fun onResume() {
|
|
|
|
|
super.onResume()
|
|
|
|
@ -477,78 +426,35 @@ class MainActivity : AppCompatActivity(), TaskListFragmentCallbackHandler {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override suspend fun onTaskListItemClicked(task: Task?) {
|
|
|
|
|
private suspend fun newTaskEditFragment(task: Task): TaskEditFragment {
|
|
|
|
|
AndroidUtilities.assertMainThread()
|
|
|
|
|
if (task == null) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
taskEditFragment?.save(remove = false)
|
|
|
|
|
clearUi()
|
|
|
|
|
coroutineScope {
|
|
|
|
|
val freshTask = async { if (task.isNew) task else taskDao.fetch(task.id) ?: task }
|
|
|
|
|
val list = async { defaultFilterProvider.getList(task) }
|
|
|
|
|
val location = async { locationDao.getLocation(task, preferences) }
|
|
|
|
|
val tags = async { tagDataDao.getTags(task) }
|
|
|
|
|
val alarms = async { alarmDao.getAlarms(task) }
|
|
|
|
|
val fragment = withContext(Dispatchers.Default) {
|
|
|
|
|
return coroutineScope {
|
|
|
|
|
withContext(Dispatchers.Default) {
|
|
|
|
|
val freshTask = async { if (task.isNew) task else taskDao.fetch(task.id) ?: task }
|
|
|
|
|
val list = async { defaultFilterProvider.getList(task) }
|
|
|
|
|
val location = async { locationDao.getLocation(task, preferences) }
|
|
|
|
|
val tags = async { tagDataDao.getTags(task) }
|
|
|
|
|
val alarms = async { alarmDao.getAlarms(task) }
|
|
|
|
|
newTaskEditFragment(
|
|
|
|
|
freshTask.await(),
|
|
|
|
|
list.await(),
|
|
|
|
|
location.await(),
|
|
|
|
|
tags.await(),
|
|
|
|
|
alarms.await(),
|
|
|
|
|
freshTask.await(),
|
|
|
|
|
list.await(),
|
|
|
|
|
location.await(),
|
|
|
|
|
tags.await(),
|
|
|
|
|
alarms.await(),
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
supportFragmentManager.beginTransaction()
|
|
|
|
|
.replace(R.id.detail, fragment, TaskEditFragment.TAG_TASKEDIT_FRAGMENT)
|
|
|
|
|
.runOnCommit { showDetailFragment() }
|
|
|
|
|
.commitNowAllowingStateLoss()
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onNavigationIconClicked() {
|
|
|
|
|
hideKeyboard()
|
|
|
|
|
viewModel.setDrawerOpen(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private val taskListFragment: TaskListFragment?
|
|
|
|
|
get() = supportFragmentManager.findFragmentByTag(FRAG_TAG_TASK_LIST) as TaskListFragment?
|
|
|
|
|
|
|
|
|
|
private val taskEditFragment: TaskEditFragment?
|
|
|
|
|
get() = supportFragmentManager.findFragmentByTag(TaskEditFragment.TAG_TASKEDIT_FRAGMENT) as TaskEditFragment?
|
|
|
|
|
|
|
|
|
|
private val isSinglePaneLayout: Boolean
|
|
|
|
|
get() = !resources.getBoolean(R.bool.two_pane_layout)
|
|
|
|
|
|
|
|
|
|
private fun removeTaskEditFragment() {
|
|
|
|
|
val removeTask = intent.removeTask
|
|
|
|
|
val finishAffinity = intent.finishAffinity
|
|
|
|
|
if (finishAffinity || taskListFragment == null) {
|
|
|
|
|
finishAffinity()
|
|
|
|
|
} else {
|
|
|
|
|
if (removeTask && intent.broughtToFront) {
|
|
|
|
|
moveTaskToBack(true)
|
|
|
|
|
}
|
|
|
|
|
hideKeyboard()
|
|
|
|
|
hideDetailFragment()
|
|
|
|
|
taskListFragment?.let {
|
|
|
|
|
setFilter(it.getFilter())
|
|
|
|
|
it.loadTaskListContent()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onSupportActionModeStarted(mode: ActionMode) {
|
|
|
|
|
super.onSupportActionModeStarted(mode)
|
|
|
|
|
actionMode = mode
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun finishActionMode() {
|
|
|
|
|
actionMode?.finish()
|
|
|
|
|
actionMode = null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
/** For indicating the new list screen should be launched at fragment setup time */
|
|
|
|
|
const val OPEN_FILTER = "open_filter" // $NON-NLS-1$
|
|
|
|
@ -560,6 +466,7 @@ class MainActivity : AppCompatActivity(), TaskListFragmentCallbackHandler {
|
|
|
|
|
const val FINISH_AFFINITY = "finish_affinity"
|
|
|
|
|
private const val FRAG_TAG_TASK_LIST = "frag_tag_task_list"
|
|
|
|
|
private const val FRAG_TAG_WHATS_NEW = "frag_tag_whats_new"
|
|
|
|
|
private const val FRAG_TAG_TASK_EDIT = "frag_tag_task_edit"
|
|
|
|
|
private const val FLAG_FROM_HISTORY
|
|
|
|
|
= Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
|
|
|
|
|
const val REQUEST_NEW_LIST = 10100
|
|
|
|
@ -569,7 +476,7 @@ class MainActivity : AppCompatActivity(), TaskListFragmentCallbackHandler {
|
|
|
|
|
get() = if (isFromHistory) {
|
|
|
|
|
null
|
|
|
|
|
} else {
|
|
|
|
|
getParcelableExtra<Filter?>(OPEN_FILTER)?.let {
|
|
|
|
|
getParcelableExtra(this, OPEN_FILTER, Filter::class.java)?.let {
|
|
|
|
|
removeExtra(OPEN_FILTER)
|
|
|
|
|
it
|
|
|
|
|
}
|
|
|
|
|