Fix navigation issues

pull/3336/head
Alex Baker 10 months ago
parent c9c984142e
commit 05389f8b83

@ -17,7 +17,6 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode
import androidx.compose.animation.ExperimentalSharedTransitionApi
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.WindowInsets
@ -63,8 +62,6 @@ import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.service.TaskCreator
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.tasks.BuildConfig
@ -108,12 +105,10 @@ import org.tasks.preferences.Preferences
import org.tasks.themes.ColorProvider
import org.tasks.themes.TasksTheme
import org.tasks.themes.Theme
import org.tasks.ui.MainActivityEvent
import org.tasks.ui.MainActivityEventBus
import timber.log.Timber
import javax.inject.Inject
@OptIn(ExperimentalMaterial3AdaptiveApi::class, ExperimentalSharedTransitionApi::class)
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var preferences: Preferences
@ -126,7 +121,6 @@ class MainActivity : AppCompatActivity() {
@Inject lateinit var locationDao: LocationDao
@Inject lateinit var tagDataDao: TagDataDao
@Inject lateinit var alarmDao: AlarmDao
@Inject lateinit var eventBus: MainActivityEventBus
@Inject lateinit var firebase: Firebase
@Inject lateinit var caldavDao: CaldavDao
@ -171,6 +165,8 @@ class MainActivity : AppCompatActivity() {
)
val state = viewModel.state.collectAsStateWithLifecycle().value
val isListVisible =
navigator.scaffoldValue[ListDetailPaneScaffoldRole.List] == PaneAdaptedValue.Expanded
val isDetailVisible =
navigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail] == PaneAdaptedValue.Expanded
val scope = rememberCoroutineScope()
@ -191,10 +187,10 @@ class MainActivity : AppCompatActivity() {
}
}
BackHandler(enabled = navigator.canNavigateBack() && state.task == null) {
BackHandler(enabled = state.task == null) {
if (intent.finishAffinity) {
finishAffinity()
} else if (isDetailVisible) {
} else if (isDetailVisible && navigator.canNavigateBack()) {
scope.launch {
navigator.navigateBack()
}
@ -207,19 +203,18 @@ class MainActivity : AppCompatActivity() {
}
}
}
val taskListState = key (state.filter) {
rememberFragmentState()
}
val taskEditState = key (state.task) {
rememberFragmentState()
}
LaunchedEffect(state.filter, state.task) {
clearUi()
actionMode?.finish()
actionMode = null
viewModel.closeDrawer()
}
ListDetailPaneScaffold(
directive = navigator.scaffoldDirective,
value = navigator.scaffoldValue,
listPane = {
val taskListState = key (state.filter) {
rememberFragmentState()
}
AndroidFragment<TaskListFragment>(
fragmentState = taskListState,
arguments = remember (state.filter) {
@ -231,7 +226,7 @@ class MainActivity : AppCompatActivity() {
},
detailPane = {
if (state.task == null) {
if (isDetailVisible) {
if (isListVisible && isDetailVisible) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
@ -245,6 +240,9 @@ class MainActivity : AppCompatActivity() {
}
}
} else {
val taskEditState = key (state.task) {
rememberFragmentState()
}
AndroidFragment<TaskEditFragment>(
fragmentState = taskEditState,
arguments = remember(state.task) {
@ -416,10 +414,6 @@ class MainActivity : AppCompatActivity() {
logIntent("onCreate")
handleIntent()
eventBus
.onEach(this::process)
.launchIn(lifecycleScope)
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
updateSystemBars(viewModel.state.value.filter)
@ -427,11 +421,6 @@ class MainActivity : AppCompatActivity() {
}
}
private fun process(event: MainActivityEvent) = when (event) {
is MainActivityEvent.ClearTaskEditFragment ->
viewModel.setTask(null)
}
@Deprecated("Deprecated in Java")
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
@ -460,12 +449,6 @@ class MainActivity : AppCompatActivity() {
handleIntent()
}
private fun clearUi() {
actionMode?.finish()
actionMode = null
viewModel.closeDrawer()
}
private suspend fun getTaskToLoad(filter: Filter?): Task? = when {
intent.isFromHistory -> null
intent.hasExtra(CREATE_TASK) -> {
@ -555,9 +538,7 @@ class MainActivity : AppCompatActivity() {
const val OPEN_TASK = "open_new_task" // $NON-NLS-1$
const val REMOVE_TASK = "remove_task"
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

@ -15,6 +15,7 @@ import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
import androidx.core.os.BundleCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.fragment.compose.AndroidFragment
import androidx.fragment.compose.content
@ -90,6 +91,7 @@ class TaskEditFragment : Fragment() {
@Inject lateinit var theme: Theme
private val editViewModel: TaskEditViewModel by viewModels()
private val mainViewModel: MainActivityViewModel by activityViewModels()
private val beastMode =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
activity?.recreate()
@ -229,7 +231,10 @@ class TaskEditFragment : Fragment() {
}
suspend fun save(remove: Boolean = true) {
editViewModel.save(remove)
editViewModel.save()
if (remove) {
mainViewModel.setTask(null)
}
activity?.let { playServices.requestReview(it) }
}
@ -257,10 +262,12 @@ class TaskEditFragment : Fragment() {
private fun discard() = lifecycleScope.launch {
editViewModel.discard()
mainViewModel.setTask(null)
}
private fun delete() = lifecycleScope.launch {
editViewModel.delete()
mainViewModel.setTask(null)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

@ -7,7 +7,6 @@ import dagger.hilt.android.components.ActivityRetainedComponent
import dagger.hilt.android.scopes.ActivityRetainedScoped
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import org.tasks.ui.MainActivityEventBus
import org.tasks.ui.TaskEditEventBus
import org.tasks.ui.TaskListEventBus
@ -18,10 +17,6 @@ class ActivityRetainedModule {
@ActivityRetainedScoped
fun getTaskListBus(): TaskListEventBus = makeFlow()
@Provides
@ActivityRetainedScoped
fun getMainActivityBus(): MainActivityEventBus = makeFlow()
@Provides
@ActivityRetainedScoped
fun getTaskEditBus(): TaskEditEventBus = makeFlow()

@ -1,10 +0,0 @@
package org.tasks.ui
import kotlinx.coroutines.flow.MutableSharedFlow
typealias MainActivityEventBus = MutableSharedFlow<MainActivityEvent>
sealed interface MainActivityEvent {
data object ClearTaskEditFragment : MainActivityEvent
}

@ -106,7 +106,6 @@ class TaskEditViewModel @Inject constructor(
private val taskCompleter: TaskCompleter,
private val alarmService: AlarmService,
private val taskListEvents: TaskListEventBus,
private val mainActivityEvents: MainActivityEventBus,
private val firebase: Firebase? = null,
private val userActivityDao: UserActivityDao,
private val alarmDao: AlarmDao,
@ -290,15 +289,15 @@ class TaskEditViewModel @Inject constructor(
}
@MainThread
suspend fun save(remove: Boolean = true): Boolean = withContext(NonCancellable) {
suspend fun save(): Boolean = withContext(NonCancellable) {
if (cleared) {
return@withContext false
}
if (!hasChanges() || viewState.value.isReadOnly) {
discard(remove)
discard()
return@withContext false
}
clear(remove)
clear()
val viewState = _viewState.value
val isNew = viewState.isNew
task.title = if (viewState.task.title.isNullOrBlank()) resources.getString(R.string.no_title) else viewState.task.title
@ -483,31 +482,28 @@ class TaskEditViewModel @Inject constructor(
discard()
}
suspend fun discard(remove: Boolean = true) {
suspend fun discard() {
if (_viewState.value.isNew) {
timerPlugin.stopTimer(task)
(originalState.value.attachments + _viewState.value.attachments)
.onEach { attachment -> FileHelper.delete(context, attachment.uri.toUri()) }
.let { taskAttachmentDao.delete(it.toList()) }
}
clear(remove)
clear()
}
@MainThread
suspend fun clear(remove: Boolean = true) {
fun clear() {
if (cleared) {
return
}
cleared = true
if (remove) {
mainActivityEvents.emit(MainActivityEvent.ClearTaskEditFragment)
}
}
override fun onCleared() {
if (!cleared) {
runBlocking {
save(remove = false)
save()
}
}
}

Loading…
Cancel
Save