1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 05:47:05 +09:00

DROID-3589 Type screen | Fix | Back navigation (#2336)

This commit is contained in:
Konstantin Ivanov 2025-04-17 16:04:30 +02:00 committed by Evgenii Kozlov
parent 526284ef95
commit 5581e08abf
10 changed files with 68 additions and 45 deletions

View file

@ -42,7 +42,6 @@ import com.anytypeio.anytype.ui.templates.EditorTemplateFragment.Companion.TYPE_
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
import com.google.accompanist.navigation.material.rememberBottomSheetNavigator
import javax.inject.Inject
import kotlin.getValue
import timber.log.Timber
class ObjectTypeFragment : BaseComposeFragment() {
@ -93,10 +92,6 @@ class ObjectTypeFragment : BaseComposeFragment() {
)
}
ObjectTypeCommand.OpenTypePropertiesListScreen -> {
navComposeController.navigate(OBJ_TYPE_PROPERTIES)
}
is ObjectTypeCommand.OpenAddNewPropertyScreen -> {
runCatching {
findNavController().navigate(
@ -110,10 +105,6 @@ class ObjectTypeFragment : BaseComposeFragment() {
Timber.e(it, "Error while opening edit object type properties screen")
}
}
ObjectTypeCommand.CloseFieldsScreen -> {
navComposeController.popBackStack()
}
}
}
vm.sendAnalyticsScreenObjectType()
@ -139,6 +130,7 @@ class ObjectTypeFragment : BaseComposeFragment() {
startDestination = OBJ_TYPE_MAIN
) {
composable(route = OBJ_TYPE_MAIN) {
val showPropertiesScreen = vm.showPropertiesScreen.collectAsStateWithLifecycle().value
WithSetScreen(
uiEditButtonState = vm.uiEditButtonState.collectAsStateWithLifecycle().value,
uiSyncStatusBadgeState = vm.uiSyncStatusBadgeState.collectAsStateWithLifecycle().value,
@ -153,16 +145,16 @@ class ObjectTypeFragment : BaseComposeFragment() {
space = space,
onTypeEvent = vm::onTypeEvent
)
}
composable(route = OBJ_TYPE_PROPERTIES) {
FieldsMainScreen(
uiFieldsListState = vm.uiTypePropertiesListState.collectAsStateWithLifecycle().value,
uiTitleState = vm.uiTitleState.collectAsStateWithLifecycle().value,
uiIconState = vm.uiIconState.collectAsStateWithLifecycle().value,
uiEditPropertyState = vm.uiEditPropertyScreen.collectAsStateWithLifecycle().value,
uiFieldLocalInfoState = vm.uiFieldLocalInfoState.collectAsStateWithLifecycle().value,
fieldEvent = vm::onFieldEvent
)
if (showPropertiesScreen) {
FieldsMainScreen(
uiFieldsListState = vm.uiTypePropertiesListState.collectAsStateWithLifecycle().value,
uiTitleState = vm.uiTitleState.collectAsStateWithLifecycle().value,
uiIconState = vm.uiIconState.collectAsStateWithLifecycle().value,
uiEditPropertyState = vm.uiEditPropertyScreen.collectAsStateWithLifecycle().value,
uiFieldLocalInfoState = vm.uiFieldLocalInfoState.collectAsStateWithLifecycle().value,
fieldEvent = vm::onFieldEvent
)
}
}
}
}
@ -246,7 +238,6 @@ class ObjectTypeFragment : BaseComposeFragment() {
companion object {
private const val OBJ_TYPE_MAIN = "obj_type_main"
private const val OBJ_TYPE_PROPERTIES = "obj_properties"
const val ARG_SPACE = "arg.object.type.space"
const val ARG_OBJECT_ID = "arg.object.type.object_id"

View file

@ -18,6 +18,9 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.colorResource
@ -32,12 +35,9 @@ import com.anytypeio.anytype.feature_object_type.ui.TypeEvent
import com.anytypeio.anytype.feature_object_type.ui.UiDeleteAlertState
import com.anytypeio.anytype.feature_object_type.ui.UiEditButton
import com.anytypeio.anytype.feature_object_type.ui.UiHorizontalButtonsState
import com.anytypeio.anytype.feature_object_type.ui.UiPropertiesButtonState
import com.anytypeio.anytype.feature_object_type.ui.UiIconState
import com.anytypeio.anytype.feature_object_type.ui.UiLayoutButtonState
import com.anytypeio.anytype.feature_object_type.ui.UiLayoutTypeState
import com.anytypeio.anytype.feature_object_type.ui.UiSyncStatusBadgeState
import com.anytypeio.anytype.feature_object_type.ui.UiTemplatesButtonState
import com.anytypeio.anytype.feature_object_type.ui.UiTemplatesModalListState
import com.anytypeio.anytype.feature_object_type.ui.UiTitleState
import com.anytypeio.anytype.feature_object_type.ui.alerts.DeleteAlertScreen
@ -73,6 +73,7 @@ fun WithSetScreen(
val topAppBarScrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(
state = rememberTopAppBarState()
)
val objectSetFragment: MutableState<ObjectSetFragment?> = remember { mutableStateOf(null) }
Scaffold(
modifier = Modifier
@ -86,7 +87,12 @@ fun WithSetScreen(
uiEditButtonState = uiEditButtonState,
uiTitleState = uiTitleState,
topBarScrollBehavior = topAppBarScrollBehavior,
onTypeEvent = onTypeEvent
onTypeEvent = { typeEvent ->
if (typeEvent is TypeEvent.OnBackClick) {
objectSetFragment.value?.onCloseCurrentObject()
}
onTypeEvent(typeEvent)
}
)
},
content = { paddingValues ->
@ -97,7 +103,8 @@ fun WithSetScreen(
uiHorizontalButtonsState = uiHorizontalButtonsState,
objectId = objectId,
space = space,
onTypeEvent = onTypeEvent
onTypeEvent = onTypeEvent,
objectSetFragment = objectSetFragment
)
}
)
@ -139,7 +146,8 @@ private fun MainContentSet(
uiHorizontalButtonsState: UiHorizontalButtonsState,
objectId: String,
space: String,
onTypeEvent: (TypeEvent) -> Unit
onTypeEvent: (TypeEvent) -> Unit,
objectSetFragment: MutableState<ObjectSetFragment?>
) {
val contentModifier = if (Build.VERSION.SDK_INT >= EDGE_TO_EDGE_MIN_SDK) {
Modifier
@ -185,6 +193,7 @@ private fun MainContentSet(
space = space
)
) { fragment ->
objectSetFragment.value = fragment
fragment.view?.findViewById<View>(R.id.topToolbar)?.gone()
fragment.view?.findViewById<View>(R.id.objectHeader)?.visibility =
View.GONE

View file

@ -1569,6 +1569,9 @@ open class ObjectSetFragment :
componentManager().objectSetComponent.release(ctx)
}
fun onCloseCurrentObject() {
vm.onCloseObject()
}
companion object {
const val CONTEXT_ID_KEY = "arg.object_set.context"

View file

@ -4,9 +4,9 @@ import com.anytypeio.anytype.core_models.Id
sealed class FieldEvent {
data object OnEditPropertyScreenDismiss : FieldEvent()
data object OnDismissScreen : FieldEvent()
data object OnBackClick : FieldEvent()
data object OnEditPropertyScreenDismiss : FieldEvent()
data class OnFieldItemClick(val item: UiFieldsListItem) : FieldEvent()

View file

@ -1,6 +1,7 @@
package com.anytypeio.anytype.feature_object_type.fields.ui
import android.os.Build
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
@ -86,6 +87,7 @@ import kotlinx.coroutines.delay
import sh.calvin.reorderable.ReorderableItem
import sh.calvin.reorderable.ReorderableLazyListState
import sh.calvin.reorderable.rememberReorderableLazyListState
import timber.log.Timber
@OptIn(ExperimentalFoundationApi::class)
@Composable
@ -121,6 +123,11 @@ fun FieldsMainScreen(
}
}
BackHandler(enabled = true) {
Timber.d("Back pressed on Properties Screen")
fieldEvent.invoke(FieldEvent.OnDismissScreen)
}
Scaffold(
modifier = Modifier
.nestedScroll(rememberNestedScrollInteropConnection())
@ -136,7 +143,7 @@ fun FieldsMainScreen(
uiTitleState = uiTitleState,
uiIconState = uiIconState,
onBackClick = {
fieldEvent(OnBackClick)
fieldEvent(FieldEvent.OnDismissScreen)
}
)
},

View file

@ -2,7 +2,6 @@ package com.anytypeio.anytype.feature_object_type.ui
import com.anytypeio.anytype.core_models.ObjectType.Layout
import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncAndP2PStatusState
import com.anytypeio.anytype.presentation.objects.ObjectIcon
import com.anytypeio.anytype.presentation.objects.custom_icon.CustomIconColor
import com.anytypeio.anytype.presentation.templates.TemplateView
@ -43,7 +42,7 @@ sealed class TypeEvent {
//endregion
data object OnLayoutButtonClick : TypeEvent()
data object OnFieldsButtonClick : TypeEvent()
data object OnPropertiesButtonClick : TypeEvent()
data object OnTemplatesButtonClick : TypeEvent()
//region Icon picker

View file

@ -29,10 +29,6 @@ sealed class ObjectTypeCommand {
val spaceId: Id
) : ObjectTypeCommand()
data object OpenTypePropertiesListScreen : ObjectTypeCommand()
data object CloseFieldsScreen : ObjectTypeCommand()
data class OpenAddNewPropertyScreen(val typeId: Id, val space: Id) : ObjectTypeCommand()
}

View file

@ -56,7 +56,7 @@ fun HorizontalButtons(
if (uiPropertiesButtonState is UiPropertiesButtonState.Visible) {
Row(
modifier = modifierButton.noRippleThrottledClickable {
onTypeEvent(TypeEvent.OnFieldsButtonClick)
onTypeEvent(TypeEvent.OnPropertiesButtonClick)
},
verticalAlignment = Alignment.CenterVertically
) {

View file

@ -175,6 +175,8 @@ class ObjectTypeViewModel(
private val _objectTypeConflictingFieldIds = MutableStateFlow<List<Id>>(emptyList())
//endregion
val showPropertiesScreen = MutableStateFlow<Boolean>(false)
val commands = MutableSharedFlow<ObjectTypeCommand>()
//region INIT AND LIFE CYCLE
@ -473,10 +475,8 @@ class ObjectTypeViewModel(
fun onTypeEvent(event: TypeEvent) {
Timber.d("onTypeEvent: $event")
when (event) {
TypeEvent.OnFieldsButtonClick -> {
viewModelScope.launch {
commands.emit(ObjectTypeCommand.OpenTypePropertiesListScreen)
}
TypeEvent.OnPropertiesButtonClick -> {
showPropertiesScreen.value = true
viewModelScope.launch {
sendAnalyticsShowObjectTypeScreen(
analytics = analytics,
@ -551,7 +551,7 @@ class ObjectTypeViewModel(
TypeEvent.OnBackClick -> {
viewModelScope.launch {
commands.emit(ObjectTypeCommand.Back)
commands.emit(Back)
}
}
@ -817,10 +817,9 @@ class ObjectTypeViewModel(
}
is FieldEvent.EditProperty -> proceedWithEditPropertyEvent(event)
FieldEvent.OnBackClick -> {
viewModelScope.launch {
commands.emit(ObjectTypeCommand.CloseFieldsScreen)
}
FieldEvent.OnDismissScreen -> {
showPropertiesScreen.value = false
}
}
}

View file

@ -886,6 +886,25 @@ class ObjectSetViewModel(
jobs.cancel()
}
fun onCloseObject() {
Timber.d("onCloseObject, id:[${vmParams.ctx}]")
viewModelScope.launch {
closeBlock.async(
CloseBlock.Params(
target = vmParams.ctx,
space = vmParams.space
)
).fold(
onSuccess = {
Timber.d("Object [${vmParams.ctx}] closed successfully")
},
onFailure = {
Timber.w(it, "Error while closing object set: ${vmParams.ctx}")
}
)
}
}
fun onSystemBackPressed() {
Timber.d("onSystemBackPressed, ")
proceedWithClosingAndExit()