From 05389f8b8333bbb18797704b1746974fd9f8f59a Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 12 Feb 2025 09:45:17 -0600 Subject: [PATCH] Fix navigation issues --- .../todoroo/astrid/activity/MainActivity.kt | 49 ++++++------------- .../astrid/activity/TaskEditFragment.kt | 9 +++- .../tasks/injection/ActivityRetainedModule.kt | 5 -- .../java/org/tasks/ui/MainActivityEvent.kt | 10 ---- .../java/org/tasks/ui/TaskEditViewModel.kt | 18 +++---- 5 files changed, 30 insertions(+), 61 deletions(-) delete mode 100644 app/src/main/java/org/tasks/ui/MainActivityEvent.kt diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt index 6aa248c04..8e7058cd3 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt @@ -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( 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( 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 diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt index 90fa63371..1a9a6dc24 100755 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt @@ -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?) { diff --git a/app/src/main/java/org/tasks/injection/ActivityRetainedModule.kt b/app/src/main/java/org/tasks/injection/ActivityRetainedModule.kt index c9850d3f0..96f6109e3 100644 --- a/app/src/main/java/org/tasks/injection/ActivityRetainedModule.kt +++ b/app/src/main/java/org/tasks/injection/ActivityRetainedModule.kt @@ -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() diff --git a/app/src/main/java/org/tasks/ui/MainActivityEvent.kt b/app/src/main/java/org/tasks/ui/MainActivityEvent.kt deleted file mode 100644 index 0a74e2711..000000000 --- a/app/src/main/java/org/tasks/ui/MainActivityEvent.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.tasks.ui - -import kotlinx.coroutines.flow.MutableSharedFlow - -typealias MainActivityEventBus = MutableSharedFlow - -sealed interface MainActivityEvent { - data object ClearTaskEditFragment : MainActivityEvent -} - diff --git a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt index 6ea4f78b4..fd5143d1a 100644 --- a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt @@ -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() } } }