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

DROID-3219 Navigation | Enhancement | Updated app navigation controls (part 1) (#1989)

This commit is contained in:
Evgenii Kozlov 2025-01-13 21:03:59 +01:00 committed by GitHub
parent bb183df533
commit af3121087c
Signed by: github
GPG key ID: B5690EEEBB952194
36 changed files with 333 additions and 123 deletions

View file

@ -6,6 +6,7 @@ import androidx.navigation.navOptions
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Key
import com.anytypeio.anytype.core_models.primitives.SpaceId
import com.anytypeio.anytype.di.feature.discussions.DiscussionFragment
import com.anytypeio.anytype.presentation.navigation.AppNavigation
import com.anytypeio.anytype.presentation.widgets.collection.Subscription
@ -14,6 +15,7 @@ import com.anytypeio.anytype.ui.auth.account.DeletedAccountFragment
import com.anytypeio.anytype.ui.date.DateObjectFragment
import com.anytypeio.anytype.ui.editor.EditorFragment
import com.anytypeio.anytype.ui.editor.EditorModalFragment
import com.anytypeio.anytype.ui.multiplayer.ShareSpaceFragment
import com.anytypeio.anytype.ui.relations.RelationCreateFromScratchForObjectFragment
import com.anytypeio.anytype.ui.relations.RelationEditFragment
import com.anytypeio.anytype.ui.search.GlobalSearchFragment
@ -177,6 +179,13 @@ class Navigator : AppNavigation {
)
}
override fun openShareScreen(space: SpaceId) {
navController?.navigate(
R.id.shareSpaceScreen,
args = ShareSpaceFragment.args(space)
)
}
override fun openObjectSet(
target: Id,
space: Id,

View file

@ -35,6 +35,7 @@ import com.anytypeio.anytype.feature_allcontent.ui.AllContentWrapperScreen
import com.anytypeio.anytype.presentation.objects.ObjectIcon
import com.anytypeio.anytype.presentation.widgets.collection.Subscription
import com.anytypeio.anytype.ui.base.navigation
import com.anytypeio.anytype.ui.multiplayer.ShareSpaceFragment
import com.anytypeio.anytype.ui.objects.creation.ObjectTypeSelectionFragment
import com.anytypeio.anytype.ui.objects.types.pickers.ObjectTypeSelectionListener
import com.anytypeio.anytype.ui.relations.REQUEST_KEY_MODIFY_RELATION
@ -112,7 +113,6 @@ class AllContentFragment : BaseComposeFragment(), ObjectTypeSelectionListener {
Timber.e(e, "Error while exiting to vault from all content")
}
}
is AllContentViewModel.Command.Back -> {
runCatching {
findNavController().popBackStack()
@ -120,7 +120,6 @@ class AllContentFragment : BaseComposeFragment(), ObjectTypeSelectionListener {
Timber.e(e, "Error while exiting back from all content")
}
}
is AllContentViewModel.Command.OpenGlobalSearch -> {
runCatching {
findNavController().navigate(
@ -269,6 +268,16 @@ class AllContentFragment : BaseComposeFragment(), ObjectTypeSelectionListener {
Timber.e(e, "Error while opening date object from All Objects screen")
}
}
is AllContentViewModel.Command.OpenShareScreen -> {
runCatching {
findNavController().navigate(
R.id.shareSpaceScreen,
args = ShareSpaceFragment.args(command.space)
)
}.onFailure { e ->
Timber.e(e, "Error while opening date object from All Objects screen")
}
}
}
}
}
@ -314,7 +323,8 @@ class AllContentFragment : BaseComposeFragment(), ObjectTypeSelectionListener {
onRelationClicked = vm::onRelationClicked,
undoMoveToBin = vm::proceedWithUndoMoveToBin,
onDismissSnackbar = vm::proceedWithDismissSnackbar,
uiBottomMenu = vm.uiBottomMenu.collectAsStateWithLifecycle().value
uiBottomMenu = vm.uiBottomMenu.collectAsStateWithLifecycle().value,
onShareButtonClicked = vm::onMemberButtonClicked
)
}
}

View file

@ -47,6 +47,9 @@ class NavigationRouter(
is AppNavigation.Command.OpenGlobalSearch -> navigation.openGlobalSearch(
space = command.space
)
is AppNavigation.Command.OpenShareScreen -> navigation.openShareScreen(
space = command.space
)
is AppNavigation.Command.OpenUpdateAppScreen -> navigation.openUpdateAppScreen()
is AppNavigation.Command.DeletedAccountScreen -> navigation.deletedAccountScreen(
command.deadline

View file

@ -36,7 +36,6 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.core.animation.doOnEnd
import androidx.core.animation.doOnStart
import androidx.core.app.ActivityOptionsCompat
import androidx.core.os.bundleOf
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STOP
@ -161,6 +160,7 @@ import com.anytypeio.anytype.ui.linking.LinkToObjectOrWebPagesFragment
import com.anytypeio.anytype.ui.linking.OnLinkToAction
import com.anytypeio.anytype.ui.moving.MoveToFragment
import com.anytypeio.anytype.ui.moving.OnMoveToAction
import com.anytypeio.anytype.ui.multiplayer.ShareSpaceFragment
import com.anytypeio.anytype.ui.objects.appearance.ObjectAppearanceSettingFragment
import com.anytypeio.anytype.ui.objects.creation.ObjectTypeSelectionFragment
import com.anytypeio.anytype.ui.objects.creation.ObjectTypeUpdateFragment
@ -601,21 +601,8 @@ open class EditorFragment : NavigationFragment<FragmentEditorBinding>(R.layout.f
binding.bottomToolbar
.backClicks()
.onEach { vm.onBackButtonPressed() }
.launchIn(lifecycleScope)
binding.bottomToolbar
.binding
.btnBack
.longClicks(withHaptic = true)
.onEach {
runCatching {
findNavController().navigate(R.id.actionExitToSpaceWidgets)
}.onFailure {
Timber.e(it, "Error while opening space switcher from editor")
}
}
.shareClicks()
.onEach { vm.onShareButtonClicked() }
.launchIn(lifecycleScope)
binding.bottomToolbar
@ -645,6 +632,12 @@ open class EditorFragment : NavigationFragment<FragmentEditorBinding>(R.layout.f
.onEach { vm.onDocumentMenuClicked() }
.launchIn(lifecycleScope)
binding.topToolbar.back
.clicks()
.throttleFirst()
.onEach { vm.onBackButtonPressed() }
.launchIn(lifecycleScope)
binding.markupToolbar
.highlightClicks()
.onEach { vm.onMarkupHighlightToggleClicked() }
@ -1306,6 +1299,16 @@ open class EditorFragment : NavigationFragment<FragmentEditorBinding>(R.layout.f
)
)
}
is Command.OpenShareScreen -> {
runCatching {
findNavController().navigate(
R.id.shareSpaceScreen,
args = ShareSpaceFragment.args(command.space)
)
}.onFailure {
Timber.e(it, "Error while opening share screen")
}
}
}
}
}

View file

@ -89,6 +89,7 @@ fun HomeScreen(
onCreateNewObjectClicked: () -> Unit,
onCreateNewObjectLongClicked: () -> Unit,
onBackClicked: () -> Unit,
onShareButtonClicked: () -> Unit,
onObjectCheckboxClicked: (Id, Boolean) -> Unit,
onSpaceWidgetClicked: () -> Unit,
onMove: (List<WidgetView>, FromIndex, ToIndex) -> Unit,
@ -161,7 +162,8 @@ fun HomeScreen(
searchClick = onSearchClicked,
addDocClick = onCreateNewObjectClicked,
addDocLongClick = onCreateNewObjectLongClicked,
isOwnerOrEditor = mode !is InteractionMode.ReadOnly
isOwnerOrEditor = mode !is InteractionMode.ReadOnly,
onShareButtonClicked = onShareButtonClicked
)
}
}

View file

@ -166,7 +166,8 @@ class HomeScreenFragment : BaseComposeFragment(),
},
onSpaceIconClicked = vm::onSpaceSettingsClicked,
membersCount = view?.membersCount ?: 0,
name = view?.space?.name.orEmpty()
name = view?.space?.name.orEmpty(),
onBackButtonClicked = vm::onBackClicked
)
HorizontalPager(
modifier = Modifier
@ -347,7 +348,8 @@ class HomeScreenFragment : BaseComposeFragment(),
onSeeAllObjectsClicked = vm::onSeeAllObjectsClicked,
onCreateObjectInsideWidget = vm::onCreateObjectInsideWidget,
onCreateDataViewObject = vm::onCreateDataViewObject,
onBackLongClicked = vm::onBackLongClicked
onBackLongClicked = vm::onBackLongClicked,
onShareButtonClicked = vm::onSpaceShareIconClicked
)
}
@ -473,11 +475,15 @@ class HomeScreenFragment : BaseComposeFragment(),
)
}
is Command.Deeplink.MembershipScreen -> {
findNavController().navigate(
R.id.paymentsScreen,
MembershipFragment.args(command.tierId),
NavOptions.Builder().setLaunchSingleTop(true).build()
)
runCatching {
findNavController().navigate(
R.id.paymentsScreen,
MembershipFragment.args(command.tierId),
NavOptions.Builder().setLaunchSingleTop(true).build()
)
}.onFailure {
Timber.e(it, "Error while opening membership screen")
}
}
is Command.Deeplink.DeepLinkToObjectNotWorking -> {
toast(
@ -485,10 +491,14 @@ class HomeScreenFragment : BaseComposeFragment(),
)
}
is Command.ShareSpace -> {
findNavController().navigate(
R.id.shareSpaceScreen,
args = ShareSpaceFragment.args(command.space)
)
runCatching {
findNavController().navigate(
R.id.shareSpaceScreen,
args = ShareSpaceFragment.args(command.space)
)
}.onFailure {
Timber.e(it, "Error while opening share screen")
}
}
is Command.CreateSourceForNewWidget -> {
val dialog = WidgetSourceTypeFragment.new(

View file

@ -24,6 +24,7 @@ import com.anytypeio.anytype.core_ui.common.DefaultPreviews
import com.anytypeio.anytype.core_ui.features.SpaceIconView
import com.anytypeio.anytype.core_ui.foundation.noRippleClickable
import com.anytypeio.anytype.core_ui.views.PreviewTitle2Medium
import com.anytypeio.anytype.core_ui.views.Relations2
import com.anytypeio.anytype.core_ui.views.Relations3
import com.anytypeio.anytype.feature_discussions.R
import com.anytypeio.anytype.presentation.spaces.SpaceIconView
@ -35,6 +36,7 @@ fun HomeScreenToolbar(
onWidgetTabClicked: () -> Unit,
onChatTabClicked: () -> Unit,
onSpaceIconClicked: () -> Unit,
onBackButtonClicked: () -> Unit,
name: String,
membersCount: Int
) {
@ -42,19 +44,29 @@ fun HomeScreenToolbar(
modifier = Modifier
.systemBarsPadding()
.fillMaxWidth()
.height(64.dp)
.padding(horizontal = 20.dp)
.height(52.dp)
) {
Image(
painter = painterResource(R.drawable.ic_home_top_toolbar_back),
contentDescription = "Back button",
modifier = Modifier
.padding(start = 16.dp)
.align(Alignment.CenterStart)
.noRippleClickable {
onBackButtonClicked()
}
)
SpaceIconView(
modifier = Modifier
.padding(start = 60.dp)
.align(Alignment.CenterStart),
icon = spaceIconView,
onSpaceIconClick = {
onSpaceIconClicked()
},
mainSize = 40.dp
mainSize = 32.dp
)
Text(
@ -62,8 +74,8 @@ fun HomeScreenToolbar(
style = PreviewTitle2Medium,
color = colorResource(R.color.text_primary),
modifier = Modifier.padding(
start = 52.dp,
top = 13.dp
start = 104.dp,
top = 8.dp
)
)
@ -77,20 +89,20 @@ fun HomeScreenToolbar(
)
} else
stringResource(id = R.string.three_dots_text_placeholder),
style = Relations3,
style = Relations2,
color = colorResource(R.color.text_secondary),
modifier = Modifier
.align(Alignment.BottomStart)
.padding(
start = 52.dp,
bottom = 13.dp
start = 104.dp,
bottom = 8.dp
)
)
Image(
painter = painterResource(id = R.drawable.ic_home_toolbar_widgets),
modifier = Modifier
.padding(end = 48.dp)
.padding(end = 64.dp)
.size(32.dp)
.align(Alignment.CenterEnd)
.alpha(
@ -105,6 +117,7 @@ fun HomeScreenToolbar(
Image(
painter = painterResource(id = R.drawable.ic_home_toolbar_chat),
modifier = Modifier
.padding(end = 16.dp)
.size(32.dp)
.align(Alignment.CenterEnd)
.alpha(
@ -125,9 +138,10 @@ fun HomeScreenToolbarPreview() {
onWidgetTabClicked = {},
onChatTabClicked = {},
isChatActive = false,
spaceIconView = SpaceIconView.Loading,
spaceIconView = SpaceIconView.Placeholder(name = "A"),
onSpaceIconClicked = {},
membersCount = 74,
name = "Test space"
name = "Test space",
onBackButtonClicked = {}
)
}

View file

@ -23,7 +23,6 @@ import androidx.activity.addCallback
import androidx.appcompat.widget.AppCompatEditText
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.ime
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.windowInsetsPadding
@ -166,6 +165,9 @@ open class ObjectSetFragment :
private val header: LinearLayout
get() = binding.objectHeader.root
private val topBackButton: View
get() = binding.topToolbar.root.findViewById(R.id.topBackButton)
private val topToolbarTitle: TextView
get() = binding.topToolbar.root.findViewById(R.id.tvTopToolbarTitle)
@ -278,6 +280,7 @@ open class ObjectSetFragment :
vm.hideTitleToolbar()
}
}
subscribe(topBackButton.clicks().throttleFirst()) { vm.onBackButtonClicked() }
subscribe(menuButton.clicks().throttleFirst()) { vm.onMenuClicked() }
subscribe(customizeViewButton.clicks().throttleFirst()) { vm.onViewerCustomizeButtonClicked() }
subscribe(viewerTitle.clicks().throttleFirst()) { vm.onExpandViewerMenuClicked() }
@ -306,21 +309,8 @@ open class ObjectSetFragment :
subscribe(binding.bottomPanel.root.touches()) { swipeDetector.onTouchEvent(it) }
subscribe(
binding.bottomToolbar.backClicks().throttleFirst()
) { vm.onBackButtonClicked() }
binding.bottomToolbar
.binding
.btnBack
.longClicks(withHaptic = true)
.onEach {
runCatching {
findNavController().navigate(R.id.actionExitToSpaceWidgets)
}.onFailure {
Timber.e(it, "Error while opening space switcher from editor")
}
}
.launchIn(lifecycleScope)
binding.bottomToolbar.shareClicks().throttleFirst()
) { vm.onShareButtonClicked() }
subscribe(
binding.bottomToolbar.searchClicks().throttleFirst()

View file

@ -107,6 +107,9 @@ class RemoteFilesManageFragment : BaseBottomSheetComposeFragment() {
is CollectionViewModel.Command.OpenDateObject -> {
// Do nothing
}
is CollectionViewModel.Command.OpenShareScreen -> {
// Do nothing
}
}
}

View file

@ -28,6 +28,7 @@ import com.anytypeio.anytype.presentation.widgets.collection.Subscription
import com.anytypeio.anytype.presentation.widgets.collection.SubscriptionMapper
import com.anytypeio.anytype.ui.base.navigation
import com.anytypeio.anytype.ui.dashboard.DeleteAlertFragment
import com.anytypeio.anytype.ui.multiplayer.ShareSpaceFragment
import com.anytypeio.anytype.ui.objects.creation.ObjectTypeSelectionFragment
import com.anytypeio.anytype.ui.objects.types.pickers.ObjectTypeSelectionListener
import javax.inject.Inject
@ -131,6 +132,16 @@ class CollectionFragment : BaseComposeFragment(), ObjectTypeSelectionListener {
Timber.e(e, "Error while opening date object from Collection screen")
}
}
is Command.OpenShareScreen -> {
runCatching {
findNavController().navigate(
R.id.shareSpaceScreen,
args = ShareSpaceFragment.args(command.space)
)
}.onFailure {
Timber.e(it, "Error while opening share screen")
}
}
}
}

View file

@ -150,7 +150,8 @@ fun ScreenContent(
addDocClick = { vm.onAddClicked(null) },
addDocLongClick = onCreateObjectLongClicked,
backLongClick = vm::onBackLongClicked,
isOwnerOrEditor = uiState.isActionButtonVisible
isOwnerOrEditor = uiState.isActionButtonVisible,
onShareButtonClicked = vm::onShareButtonClicked
)
}
}
@ -175,6 +176,13 @@ fun TopBar(
.fillMaxWidth()
.height(48.dp)
) {
Image(
painter = painterResource(R.drawable.ic_default_top_back),
contentDescription = stringResource(R.string.content_desc_back_button),
modifier = Modifier
.align(Alignment.CenterStart)
.noRippleClickable { vm.onPrevClicked() }
)
Text(
modifier = Modifier.align(Alignment.Center),
text = uiState.collectionName,

View file

@ -113,16 +113,7 @@ fun SpaceIconView(
}
}
else -> {
Box(
modifier = modifier
.size(mainSize)
.background(
color = colorResource(id = R.color.palette_system_yellow),
shape = RoundedCornerShape(radius)
)
.clip(RoundedCornerShape(radius))
.noRippleClickable { onSpaceIconClick.invoke() }
)
// Draw nothing
}
}
}

View file

@ -65,6 +65,7 @@ fun BottomNavigationMenu(
modifier: Modifier = Modifier,
backClick: () -> Unit = {},
backLongClick: () -> Unit = {},
onShareButtonClicked: () -> Unit = {},
searchClick: () -> Unit = {},
addDocClick: () -> Unit = {},
addDocLongClick: () -> Unit = {},
@ -86,10 +87,15 @@ fun BottomNavigationMenu(
) {
MenuItem(
modifier = Modifier.width(72.dp).height(52.dp),
contentDescription = stringResource(id = R.string.main_navigation_content_desc_back_button),
res = BottomNavigationItem.BACK.res,
onClick = backClick,
onLongClick = backLongClick
contentDescription = stringResource(id = R.string.main_navigation_content_desc_members_button),
res = BottomNavigationItem.MEMBERS.res,
onClick = onShareButtonClicked
)
MenuItem(
modifier = Modifier.width(72.dp).height(52.dp),
contentDescription = stringResource(id = R.string.main_navigation_content_desc_search_button),
res = BottomNavigationItem.SEARCH.res,
onClick = searchClick
)
if (isOwnerOrEditor) {
MenuItem(
@ -100,12 +106,6 @@ fun BottomNavigationMenu(
onLongClick = addDocLongClick
)
}
MenuItem(
modifier = Modifier.width(72.dp).height(52.dp),
contentDescription = stringResource(id = R.string.main_navigation_content_desc_search_button),
res = BottomNavigationItem.SEARCH.res,
onClick = searchClick
)
}
}
@ -196,7 +196,7 @@ private fun ProfileMenuItem(
private enum class BottomNavigationItem(@DrawableRes val res: Int) {
BACK(R.drawable.ic_nav_panel_back),
HOME(R.drawable.ic_nav_panel_vault),
MEMBERS(R.drawable.ic_nav_panel_members),
SEARCH(R.drawable.ic_nav_panel_search),
ADD_DOC(R.drawable.ic_nav_panel_plus)
}

View file

@ -25,7 +25,7 @@ class MainBottomToolbar @JvmOverloads constructor(
fun searchClicks() = binding.btnSearch.clicks()
fun addDocClicks() = binding.btnAddDoc.clicks()
fun backClicks() = binding.btnBack.clicks()
fun shareClicks() = binding.btnShare.clicks()
fun setIsReadOnly(isReadOnly: Boolean) {

View file

@ -26,6 +26,7 @@ class ObjectTopToolbar @JvmOverloads constructor(
)
val status: StatusBadgeWidget get() = binding.statusBadge
val back: View get() = binding.ivTopBackButton
val menu: View get() = binding.threeDotsButton
val container: ViewGroup get() = binding.titleContainer
val title: TextView get() = binding.tvTopToolbarTitle

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M15,20L7,12L15,4"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/glyph_active"
android:strokeLineCap="round"/>
</vector>

View file

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M15,20L7,12L15,4"
android:strokeWidth="2"
android:strokeColor="@color/glyph_active"
android:strokeLineCap="round"/>
</vector>

View file

@ -6,7 +6,6 @@
<path
android:pathData="M20,25L11,16L20,7"
android:strokeWidth="1.5"
android:fillColor="@color/transparent_black"
android:strokeColor="@color/glyph_active"
android:strokeLineCap="round"/>
</vector>

View file

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<group>
<clip-path
android:pathData="M4,4h24v24h-24z"/>
<path
android:pathData="M7.75,12.75a3.25,3.75 0,1 0,6.5 0a3.25,3.75 0,1 0,-6.5 0z"
android:fillColor="@color/glyph_active" />
<path
android:pathData="M17.063,25C17.615,25 18.07,24.55 17.992,24.003C17.503,20.609 14.559,18 11,18C7.441,18 4.497,20.609 4.009,24.003C3.93,24.55 4.385,25 4.938,25H17.063Z"
android:fillColor="@color/glyph_active"
android:fillType="evenOdd"/>
<path
android:pathData="M17.75,9.75a3.25,3.75 0,1 0,6.5 0a3.25,3.75 0,1 0,-6.5 0z"
android:fillColor="@color/glyph_active"/>
<path
android:pathData="M27.99,21.003C28.069,21.55 27.614,22 27.061,22H19.015C18.331,20.2 17.05,18.693 15.414,17.715C16.706,16.063 18.727,15 20.999,15C24.558,15 27.502,17.609 27.99,21.003Z"
android:fillColor="@color/glyph_active"
android:fillType="evenOdd"/>
</group>
</vector>

View file

@ -4,7 +4,7 @@
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M15.25,25.25C15.25,25.664 15.586,26 16,26C16.414,26 16.75,25.664 16.75,25.25V16.75H25.25C25.664,16.75 26,16.414 26,16C26,15.586 25.664,15.25 25.25,15.25H16.75V6.75C16.75,6.336 16.414,6 16,6C15.586,6 15.25,6.336 15.25,6.75V15.25H6.75C6.336,15.25 6,15.586 6,16C6,16.414 6.336,16.75 6.75,16.75H15.25V25.25Z"
android:pathData="M16,5C9.925,5 5,9.925 5,16C5,22.075 9.925,27 16,27C22.075,27 27,22.075 27,16C27,9.925 22.075,5 16,5ZM16,22C15.586,22 15.25,21.664 15.25,21.25V16.75H10.75C10.336,16.75 10,16.414 10,16C10,15.586 10.336,15.25 10.75,15.25H15.25V10.75C15.25,10.336 15.586,10 16,10C16.414,10 16.75,10.336 16.75,10.75V15.25H21.25C21.664,15.25 22,15.586 22,16C22,16.414 21.664,16.75 21.25,16.75H16.75V21.25C16.75,21.664 16.414,22 16,22Z"
android:fillColor="@color/glyph_active"
android:fillType="evenOdd"/>
</vector>

View file

@ -6,12 +6,10 @@
<path
android:pathData="M15,13.998m-7.25,0a7.25,7.25 0,1 1,14.5 0a7.25,7.25 0,1 1,-14.5 0"
android:strokeWidth="1.5"
android:fillColor="@color/transparent_black"
android:strokeColor="@color/glyph_active"/>
<path
android:pathData="M26,24.998L20.5,19.5"
android:strokeWidth="1.5"
android:fillColor="@color/transparent_black"
android:strokeColor="@color/glyph_active"
android:strokeLineCap="round"/>
</vector>

View file

@ -6,12 +6,28 @@
android:layout_width="match_parent"
android:layout_height="48dp">
<FrameLayout
android:id="@+id/topBackButton"
android:layout_width="28dp"
android:layout_height="28dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp">
<ImageView
android:id="@+id/ivTopBackButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_default_top_back" />
</FrameLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/statusContainer"
android:layout_gravity="center_vertical"
android:layout_gravity="center_vertical|end"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="54dp"
android:layout_width="wrap_content"
android:layout_height="28dp">

View file

@ -5,38 +5,20 @@
tools:context="com.anytypeio.anytype.core_ui.widgets.toolbar.MainBottomToolbar">
<FrameLayout
android:id="@+id/btnBack"
android:id="@+id/btnShare"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/default_ripple">
<ImageView
android:id="@+id/icBack"
android:id="@+id/icShare"
android:layout_width="@dimen/main_bottom_toolbar_icon_width"
android:layout_height="@dimen/main_bottom_toolbar_icon_height"
android:layout_gravity="center"
android:scaleType="center"
android:contentDescription="@string/content_desc_back_button"
app:srcCompat="@drawable/ic_nav_panel_back" />
</FrameLayout>
<FrameLayout
android:id="@+id/btnAddDoc"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/default_ripple">
<ImageView
android:id="@+id/icAddDoc"
android:layout_width="@dimen/main_bottom_toolbar_icon_width"
android:layout_height="@dimen/main_bottom_toolbar_icon_height"
android:layout_gravity="center"
android:scaleType="center"
android:contentDescription="@string/content_desc_add_doc_button"
app:srcCompat="@drawable/ic_nav_panel_plus" />
app:srcCompat="@drawable/ic_nav_panel_members" />
</FrameLayout>
@ -59,4 +41,22 @@
</FrameLayout>
<FrameLayout
android:id="@+id/btnAddDoc"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/default_ripple">
<ImageView
android:id="@+id/icAddDoc"
android:layout_width="@dimen/main_bottom_toolbar_icon_width"
android:layout_height="@dimen/main_bottom_toolbar_icon_height"
android:layout_gravity="center"
android:scaleType="center"
android:contentDescription="@string/content_desc_add_doc_button"
app:srcCompat="@drawable/ic_nav_panel_plus" />
</FrameLayout>
</merge>

View file

@ -3,13 +3,29 @@
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<FrameLayout
android:id="@+id/topBackButton"
android:layout_width="28dp"
android:layout_height="28dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp">
<ImageView
android:id="@+id/ivTopBackButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_default_top_back" />
</FrameLayout>
<com.anytypeio.anytype.core_ui.widgets.StatusBadgeWidget
android:id="@+id/statusBadge"
android:layout_width="28dp"
android:layout_height="28dp"
android:layout_gravity="center_vertical"
android:layout_gravity="center_vertical|end"
android:scaleType="center"
android:layout_marginStart="12dp"
android:layout_marginEnd="54dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

View file

@ -763,6 +763,12 @@ class AllContentViewModel(
proceedWithCreateDoc(objType)
}
fun onMemberButtonClicked() {
viewModelScope.launch {
commands.emit(OpenShareScreen(vmParams.spaceId))
}
}
private fun proceedWithCreateDoc(
objType: ObjectWrapper.Type? = null
) {
@ -993,6 +999,7 @@ class AllContentViewModel(
)
}
}
//endregion
sealed class Command {
@ -1010,6 +1017,7 @@ class AllContentViewModel(
}
data class OpenTypeEditing(val item: UiContentItem.Type) : Command()
data object OpenTypeCreation: Command()
data class OpenShareScreen(val space: SpaceId): Command()
data class OpenRelationEditing(
val typeName: String,
val id: Id,

View file

@ -131,7 +131,8 @@ fun AllContentWrapperScreen(
onBackLongClicked: () -> Unit,
moveToBin: (UiContentItem.Item) -> Unit,
undoMoveToBin: (Id) -> Unit,
onDismissSnackbar: () -> Unit
onDismissSnackbar: () -> Unit,
onShareButtonClicked: () -> Unit
) {
AllContentMainScreen(
@ -159,7 +160,8 @@ fun AllContentWrapperScreen(
undoMoveToBin = undoMoveToBin,
onDismissSnackbar = onDismissSnackbar,
canPaginate = canPaginate,
onUpdateLimitSearch = onUpdateLimitSearch
onUpdateLimitSearch = onUpdateLimitSearch,
onShareButtonClicked = onShareButtonClicked
)
}
@ -191,6 +193,7 @@ fun AllContentMainScreen(
onDismissSnackbar: () -> Unit,
canPaginate: Boolean,
onUpdateLimitSearch: () -> Unit,
onShareButtonClicked: () -> Unit
) {
var isSearchEmpty by remember { mutableStateOf(true) }
val snackBarHostState = remember { SnackbarHostState() }
@ -235,7 +238,8 @@ fun AllContentMainScreen(
onCreateObjectLongClicked = onCreateObjectLongClicked,
onBackClicked = onBackClicked,
onBackLongClicked = onBackLongClicked,
uiBottomMenu = uiBottomMenu
uiBottomMenu = uiBottomMenu,
onShareButtonClicked = onShareButtonClicked
)
}
},
@ -253,7 +257,8 @@ fun AllContentMainScreen(
uiMenuState = uiMenuState,
onSortClick = onSortClick,
onModeClick = onModeClick,
onBinClick = onBinClick
onBinClick = onBinClick,
onBackClick = onBackClicked
)
AllContentTabs(tabsViewState = uiTabsState) { tab ->
onTabClick(tab)
@ -337,6 +342,7 @@ fun BottomMenu(
onCreateObjectLongClicked: () -> Unit,
onBackClicked: () -> Unit,
onBackLongClicked: () -> Unit,
onShareButtonClicked: () -> Unit
) {
val isImeVisible = WindowInsets.ime.getBottom(LocalDensity.current) > 0
if (isImeVisible) return
@ -347,7 +353,8 @@ fun BottomMenu(
searchClick = onGlobalSearchClicked,
addDocClick = onAddDocClicked,
addDocLongClick = onCreateObjectLongClicked,
isOwnerOrEditor = uiBottomMenu.isOwnerOrEditor
isOwnerOrEditor = uiBottomMenu.isOwnerOrEditor,
onShareButtonClicked = onShareButtonClicked
)
}
@ -617,7 +624,8 @@ fun PreviewMainScreen() {
undoMoveToBin = {},
onDismissSnackbar = {},
canPaginate = true,
onUpdateLimitSearch = {}
onUpdateLimitSearch = {},
onShareButtonClicked = {}
)
}

View file

@ -27,6 +27,7 @@ import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.selection.LocalTextSelectionColors
import androidx.compose.foundation.text.selection.TextSelectionColors
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.IconButton
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.DropdownMenu
@ -78,7 +79,8 @@ fun AllContentTopBarContainer(
uiMenuState: UiMenuState,
onModeClick: (AllContentMenuMode) -> Unit,
onSortClick: (AllContentSort) -> Unit,
onBinClick: () -> Unit
onBinClick: () -> Unit,
onBackClick: () -> Unit
) {
var isMenuExpanded by remember { mutableStateOf(false) }
@ -86,6 +88,18 @@ fun AllContentTopBarContainer(
modifier = Modifier.fillMaxWidth(),
expandedHeight = 48.dp,
title = { AllContentTitle(state = titleState) },
navigationIcon = {
Image(
modifier = Modifier
.padding(start = 16.dp)
.noRippleClickable {
onBackClick()
}
,
painter = painterResource(R.drawable.ic_default_top_back),
contentDescription = stringResource(R.string.content_desc_back_button)
)
},
actions = {
AllContentMenuButton(
onClick = { isMenuExpanded = true }
@ -147,7 +161,8 @@ private fun AllContentTopBarContainerPreview() {
),
onModeClick = {},
onSortClick = {},
onBinClick = {}
onBinClick = {},
onBackClick = {}
)
}
//endregion

View file

@ -763,7 +763,7 @@ private fun ChatBox(
}
) {
Image(
painter = painterResource(id = R.drawable.ic_nav_panel_plus),
painter = painterResource(id = R.drawable.ic_chat_box_add_attachment),
contentDescription = "Plus button",
modifier = Modifier
.align(Alignment.Center)

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M15.25,25.25C15.25,25.664 15.586,26 16,26C16.414,26 16.75,25.664 16.75,25.25V16.75H25.25C25.664,16.75 26,16.414 26,16C26,15.586 25.664,15.25 25.25,15.25H16.75V6.75C16.75,6.336 16.414,6 16,6C15.586,6 15.25,6.336 15.25,6.75V15.25H6.75C6.336,15.25 6,15.586 6,16C6,16.414 6.336,16.75 6.75,16.75H15.25V25.25Z"
android:fillColor="@color/glyph_active"
android:fillType="evenOdd"/>
</vector>

View file

@ -1820,6 +1820,7 @@ Please provide specific details of your needs here.</string>
<string name="all_content_snackbar_title">moved to bin</string>
<string name="main_navigation_content_desc_back_button">Back button</string>
<string name="main_navigation_content_desc_members_button">Share and members button</string>
<string name="main_navigation_content_desc_search_button">Search objects button</string>
<string name="main_navigation_content_desc_create_button">Create object button</string>

View file

@ -1197,6 +1197,12 @@ class EditorViewModel(
proceedWithExitingBack()
}
fun onShareButtonClicked() {
dispatch(
Command.OpenShareScreen(vmParams.space)
)
}
fun onHomeButtonClicked() {
Timber.d("onHomeButtonClicked, ")
if (stateData.value == ViewState.NotExist) {

View file

@ -3,6 +3,7 @@ package com.anytypeio.anytype.presentation.editor.editor
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Key
import com.anytypeio.anytype.core_models.Url
import com.anytypeio.anytype.core_models.primitives.SpaceId
import com.anytypeio.anytype.core_utils.ext.Mimetype
import com.anytypeio.anytype.presentation.objects.ObjectIcon
@ -21,6 +22,8 @@ sealed class Command {
data object OpenVideoPicker: Command()
data object OpenFilePicker: Command()
data class OpenShareScreen(val space: SpaceId) : Command()
data class OpenBookmarkSetter(
val target: String,
val context: String,

View file

@ -1750,6 +1750,14 @@ class HomeScreenViewModel(
}
}
fun onSpaceShareIconClicked() {
viewModelScope.launch {
commands.emit(
Command.ShareSpace(SpaceId(spaceManager.get()))
)
}
}
fun onSpaceSettingsClicked() {
viewModelScope.launch {
commands.emit(

View file

@ -2,6 +2,7 @@ package com.anytypeio.anytype.presentation.navigation
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.Key
import com.anytypeio.anytype.core_models.primitives.SpaceId
import com.anytypeio.anytype.presentation.widgets.collection.Subscription
interface AppNavigation {
@ -44,6 +45,7 @@ interface AppNavigation {
fun exitToDesktop()
fun exitToVault()
fun openGlobalSearch(space: Id)
fun openShareScreen(space: SpaceId)
fun openUpdateAppScreen()
fun openRemoteFilesManageScreen(subscription: Id, space: Id)
@ -82,6 +84,10 @@ interface AppNavigation {
object OpenSettings : Command()
object MigrationErrorScreen: Command()
data class OpenShareScreen(
val space: SpaceId
) : Command()
data class OpenGlobalSearch(
val space: Id
) : Command()

View file

@ -103,6 +103,7 @@ import com.anytypeio.anytype.presentation.templates.TemplateView
import com.anytypeio.anytype.presentation.util.Dispatcher
import com.anytypeio.anytype.presentation.widgets.TypeTemplatesWidgetUI
import com.anytypeio.anytype.presentation.widgets.TypeTemplatesWidgetUIAction
import com.anytypeio.anytype.presentation.widgets.collection.CollectionViewModel.Command.OpenShareScreen
import com.anytypeio.anytype.presentation.widgets.enterEditing
import com.anytypeio.anytype.presentation.widgets.exitEditing
import com.anytypeio.anytype.presentation.widgets.hideMoreMenu
@ -1609,6 +1610,16 @@ class ObjectSetViewModel(
}
}
fun onShareButtonClicked() {
viewModelScope.launch {
dispatch(
AppNavigation.Command.OpenShareScreen(
vmParams.space
)
)
}
}
fun onClickListener(clicked: ListenerType) {
Timber.d("onClickListener, clicked:[$clicked]")
when (clicked) {

View file

@ -847,14 +847,16 @@ class CollectionViewModel(
fun onPrevClicked() {
launch {
analytics.sendScreenHomeEvent()
commands.emit(Command.Exit)
commands.emit(Exit)
}
}
fun onShareButtonClicked() {
launch { commands.emit(OpenShareScreen(vmParams.spaceId)) }
}
fun onBackLongClicked() {
launch {
commands.emit(Command.ExitToSpaceWidgets)
}
launch { commands.emit(ExitToSpaceWidgets) }
}
fun onSearchClicked(space: Id) {
@ -1044,6 +1046,7 @@ class CollectionViewModel(
data class LaunchObjectSet(val target: Id, val space: Id) : Command()
data class OpenChat(val target: Id, val space: Id) : Command()
data class OpenDateObject(val target: Id, val space: Id) : Command()
data class OpenShareScreen(val space: SpaceId) : Command()
data object ToDesktop : Command()
data class ToSearch(val space: Id) : Command()