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

DROID-2686 App | Tech | Update Jetpack Compose (#1566)

This commit is contained in:
Evgenii Kozlov 2024-09-17 17:17:28 +02:00 committed by GitHub
parent 9b68f87a8f
commit e680126dd1
Signed by: github
GPG key ID: B5690EEEBB952194
20 changed files with 138 additions and 144 deletions

View file

@ -23,6 +23,7 @@ import androidx.compose.foundation.layout.ime
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Scaffold
import androidx.compose.runtime.Composable
@ -45,8 +46,6 @@ import com.anytypeio.anytype.presentation.library.LibraryEvent
import com.anytypeio.anytype.presentation.library.LibraryViewModel
import com.anytypeio.anytype.ui.library.views.LibraryTabs
import com.anytypeio.anytype.ui.library.views.LibraryTabsContent
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.rememberPagerState
import kotlinx.coroutines.FlowPreview
@ -54,7 +53,6 @@ import kotlinx.coroutines.FlowPreview
@ExperimentalComposeUiApi
@ExperimentalMaterialApi
@FlowPreview
@ExperimentalPagerApi
@Composable
fun LibraryScreen(
configuration: LibraryConfiguration,
@ -66,7 +64,10 @@ fun LibraryScreen(
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val effects by viewModel.effects.collectAsStateWithLifecycle()
val pagerState = rememberPagerState(INITIAL_TAB)
val pagerState = rememberPagerState(
initialPage = INITIAL_TAB,
pageCount = { 2 }
)
val modifier = Modifier
.background(color = colorResource(id = R.color.background_primary))

View file

@ -3,11 +3,15 @@ package com.anytypeio.anytype.ui.library.views
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.PagerState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.LocalRippleConfiguration
import androidx.compose.material.RippleConfiguration
import androidx.compose.material.Tab
import androidx.compose.material.TabRow
import androidx.compose.material.TabRowDefaults
import androidx.compose.material.Text
import androidx.compose.material.ripple.LocalRippleTheme
import androidx.compose.material.ripple.RippleAlpha
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.MutableState
@ -15,6 +19,7 @@ import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
@ -26,11 +31,9 @@ import com.anytypeio.anytype.ui.library.LibraryScreenConfig
import com.anytypeio.anytype.ui.library.ScreenState
import com.anytypeio.anytype.ui.library.WrapWithLibraryAnimation
import com.anytypeio.anytype.ui.library.styles.TabTitleStyle
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.PagerState
import kotlinx.coroutines.launch
@ExperimentalPagerApi
@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterialApi::class)
@Composable
fun LibraryTabs(
modifier: Modifier,
@ -62,7 +65,7 @@ fun LibraryTabs(
)
},
tabs = {
CompositionLocalProvider(LocalRippleTheme provides LibraryTabsTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides LibraryRippleTheme) {
LibraryTab(
modifier = modifier,
config = configuration.types,
@ -92,9 +95,11 @@ fun LibraryTabs(
}
}
)
}
@OptIn(ExperimentalMaterialApi::class)
private val LibraryRippleTheme = RippleConfiguration(color = Color.Unspecified, rippleAlpha = RippleAlpha(0f, 0f, 0f, 0f))
@Composable
fun LibraryTab(
modifier: Modifier,

View file

@ -8,6 +8,8 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.PagerState
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
@ -29,14 +31,10 @@ import com.anytypeio.anytype.ui.library.LibraryScreenConfig
import com.anytypeio.anytype.ui.library.ScreenState
import com.anytypeio.anytype.ui.library.WrapWithLibraryAnimation
import com.anytypeio.anytype.ui.library.views.list.LibraryListView
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.PagerState
import kotlinx.coroutines.FlowPreview
@ExperimentalAnimationApi
@FlowPreview
@ExperimentalPagerApi
@Composable
fun LibraryTabsContent(
modifier: Modifier,
@ -48,7 +46,10 @@ fun LibraryTabsContent(
screenState: MutableState<ScreenState>,
effects: LibraryViewModel.Effect,
) {
HorizontalPager(modifier = modifier, state = pagerState, count = 2) { page ->
HorizontalPager(
modifier = modifier,
state = pagerState
) { page ->
val dataTabs = when (configuration[page]) {
is LibraryScreenConfig.Types -> {
state.types
@ -71,7 +72,6 @@ fun LibraryTabsContent(
@ExperimentalAnimationApi
@FlowPreview
@ExperimentalPagerApi
@Composable
fun TabContentScreen(
modifier: Modifier,

View file

@ -1,14 +0,0 @@
package com.anytypeio.anytype.ui.library.views
import androidx.compose.material.ripple.RippleAlpha
import androidx.compose.material.ripple.RippleTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
object LibraryTabsTheme : RippleTheme {
@Composable
override fun defaultColor() = Color.Unspecified
@Composable
override fun rippleAlpha(): RippleAlpha = RippleAlpha(0.0f, 0.0f, 0.0f, 0.0f)
}

View file

@ -3,6 +3,7 @@ package com.anytypeio.anytype.ui.library.views.list
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.ui.Modifier
@ -14,11 +15,8 @@ import com.anytypeio.anytype.presentation.library.LibraryScreenState
import com.anytypeio.anytype.presentation.library.LibraryViewModel
import com.anytypeio.anytype.ui.library.LibraryListConfig
import com.anytypeio.anytype.ui.library.ScreenState
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.rememberPagerState
@ExperimentalAnimationApi
@ExperimentalPagerApi
@Composable
fun LibraryListView(
libraryListConfig: List<LibraryListConfig>,
@ -28,7 +26,10 @@ fun LibraryListView(
screenState: MutableState<ScreenState>,
effects: LibraryViewModel.Effect,
) {
val pagerState = rememberPagerState(INITIAL_TAB)
val pagerState = rememberPagerState(
initialPage = INITIAL_TAB,
pageCount = { 2 }
)
val modifier = Modifier.background(
color = colorResource(id = R.color.background_primary)
)

View file

@ -4,10 +4,12 @@ import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.pager.PagerState
import androidx.compose.material.ScrollableTabRow
import androidx.compose.material.Tab
import androidx.compose.material.Text
import androidx.compose.material.ripple.LocalRippleTheme
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LocalRippleConfiguration
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.rememberCoroutineScope
@ -18,13 +20,10 @@ import androidx.compose.ui.unit.dp
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_ui.views.HeadlineSubheading
import com.anytypeio.anytype.ui.library.LibraryListConfig
import com.anytypeio.anytype.ui.library.views.LibraryTabsTheme
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.PagerState
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@ExperimentalAnimationApi
@ExperimentalPagerApi
@Composable
fun LibraryListTabs(
pagerState: PagerState,
@ -40,7 +39,7 @@ fun LibraryListTabs(
edgePadding = 0.dp,
modifier = modifier.padding(start = 4.dp),
tabs = {
CompositionLocalProvider(LocalRippleTheme provides LibraryTabsTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
configuration.forEachIndexed { index, it ->
LibraryListTab(
config = it,

View file

@ -14,6 +14,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.PagerState
import androidx.compose.material.Divider
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
@ -24,7 +26,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
@ -53,13 +54,8 @@ import com.anytypeio.anytype.ui.library.views.list.items.LibTypeItem
import com.anytypeio.anytype.ui.library.views.list.items.LibraryObjectEmptyItem
import com.anytypeio.anytype.ui.library.views.list.items.MyRelationItem
import com.anytypeio.anytype.ui.library.views.list.items.MyTypeItem
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.PagerState
@OptIn(ExperimentalComposeUiApi::class)
@ExperimentalAnimationApi
@ExperimentalPagerApi
@Composable
fun LibraryListTabsContent(
modifier: Modifier,
@ -82,7 +78,6 @@ fun LibraryListTabsContent(
HorizontalPager(
modifier = modifier,
state = pagerState,
count = configuration.size,
userScrollEnabled = screenState.value == ScreenState.CONTENT
) { index ->
val data = when (configuration[index]) {
@ -145,7 +140,6 @@ fun LibraryListTabsContent(
attachAnalytics(pagerState, configuration, vmAnalyticsStream)
}
@OptIn(ExperimentalPagerApi::class)
@Composable
private fun attachAnalytics(
pagerState: PagerState,

View file

@ -26,6 +26,7 @@ import androidx.compose.ui.Alignment.Companion.CenterHorizontally
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.blur
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
@ -129,7 +130,10 @@ fun MnemonicPhraseScreen(
dragHandle = {
// Do nothing
},
sheetState = SheetState(skipPartiallyExpanded = true)
sheetState = SheetState(
skipPartiallyExpanded = true,
density = LocalDensity.current
)
)
}
}

View file

@ -77,7 +77,9 @@ fun VersionHistoryPreviewScreen(
modifier = Modifier.fillMaxSize(),
scrimColor = Color.Transparent,
containerColor = colorResource(id = R.color.background_primary),
windowInsets = WindowInsets(top = 60.dp),
contentWindowInsets = {
WindowInsets(top = 60.dp)
}
) {
Box(modifier = Modifier.fillMaxSize()) {
Column(

View file

@ -2,16 +2,12 @@ package com.anytypeio.anytype.core_ui.features.multiplayer
import android.content.res.Configuration
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.AnchoredDraggableState
import androidx.compose.foundation.gestures.DraggableAnchors
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.gestures.anchoredDraggable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@ -20,11 +16,9 @@ import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.rememberScrollState
@ -35,7 +29,6 @@ import androidx.compose.material.DropdownMenuItem
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@ -56,7 +49,6 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@ -272,20 +264,21 @@ fun ShareSpaceScreen(
DragValue.DRAGGED_DOWN at draggedDownAnchorTop
DragValue.DRAGGED_UP at 0f
}
val anchoredDraggableState = remember {
AnchoredDraggableState(
initialValue = DragValue.DRAGGED_UP,
anchors = anchors,
positionalThreshold = { distance: Float -> distance * 0.5f },
velocityThreshold = { with(density) { 100.dp.toPx() } },
animationSpec = tween()
)
}
val offset =
if (anchoredDraggableState.offset.isNaN()) 0 else anchoredDraggableState.offset.toInt()
SideEffect {
anchoredDraggableState.updateAnchors(anchors)
}
// TODO https://linear.app/anytype/issue/DROID-2833/fix-anchoreddraggablestate-in-sharespacescreenkt
// val anchoredDraggableState = remember {
// AnchoredDraggableState(
// initialValue = DragValue.DRAGGED_UP,
// anchors = anchors,
// positionalThreshold = { distance: Float -> distance * 0.5f },
// velocityThreshold = { with(density) { 100.dp.toPx() } },
// animationSpec = tween()
// )
// }
// val offset =
// if (anchoredDraggableState.offset.isNaN()) 0 else anchoredDraggableState.offset.toInt()
// SideEffect {
// anchoredDraggableState.updateAnchors(anchors)
// }
AnimatedVisibility(
visible = shareLinkViewState is ShareLinkViewState.Shared,
enter = slideInVertically { it },
@ -294,10 +287,10 @@ fun ShareSpaceScreen(
) {
Box(modifier = Modifier
.padding(16.dp)
.offset {
IntOffset(x = 0, y = offset)
}
.anchoredDraggable(anchoredDraggableState, Orientation.Vertical)
// .offset {
// IntOffset(x = 0, y = offset)
// }
// .anchoredDraggable(anchoredDraggableState, Orientation.Vertical)
) {
if (shareLinkViewState is ShareLinkViewState.Shared) {
ShareInviteLinkCard(

View file

@ -21,9 +21,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Text
import androidx.compose.material.ripple.LocalRippleTheme
import androidx.compose.material.ripple.RippleAlpha
import androidx.compose.material.ripple.RippleTheme
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LocalRippleConfiguration
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
@ -119,6 +118,7 @@ class ButtonWarningLarge @JvmOverloads constructor(
/**
* Composable Buttons
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ButtonPrimary(
text: String = "",
@ -133,7 +133,7 @@ fun ButtonPrimary(
if (isPressed.value) colorResource(id = R.color.glyph_button).copy(alpha = 0.15f)
else colorResource(id = R.color.glyph_button)
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Button(
onClick = onClick,
interactionSource = interactionSource,
@ -161,6 +161,7 @@ fun ButtonPrimary(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ButtonPrimaryDarkTheme(
text: String = "",
@ -172,7 +173,7 @@ fun ButtonPrimaryDarkTheme(
val interactionSource = remember { MutableInteractionSource() }
val backgroundColor = Color(0xFFF3F2EC)
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Button(
onClick = onClick,
interactionSource = interactionSource,
@ -200,6 +201,7 @@ fun ButtonPrimaryDarkTheme(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ButtonPrimaryLoading(
text: String = "",
@ -220,7 +222,7 @@ fun ButtonPrimaryLoading(
if (isPressed.value) colorResource(id = R.color.glyph_button).copy(alpha = 0.15f)
else colorResource(id = R.color.glyph_button)
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Box(modifier = modifierBox, contentAlignment = Alignment.Center) {
Button(
onClick = { if (!loading) onClick() },
@ -258,6 +260,7 @@ fun ButtonPrimaryLoading(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ButtonSecondary(
text: String = "",
@ -274,7 +277,7 @@ fun ButtonSecondary(
id = R.color.shape_secondary
)
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Button(
onClick = onClick,
interactionSource = interactionSource,
@ -303,6 +306,7 @@ fun ButtonSecondary(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ButtonSecondaryDarkTheme(
text: String = "",
@ -319,7 +323,7 @@ fun ButtonSecondaryDarkTheme(
id = R.color.shape_secondary
)
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Button(
onClick = onClick,
interactionSource = interactionSource,
@ -348,6 +352,7 @@ fun ButtonSecondaryDarkTheme(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ButtonSecondaryLoading(
text: String = "",
@ -371,7 +376,7 @@ fun ButtonSecondaryLoading(
id = R.color.shape_secondary
)
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Box(modifier = modifierBox, contentAlignment = Alignment.Center) {
Button(
onClick = {if (!loading) onClick()},
@ -410,6 +415,7 @@ fun ButtonSecondaryLoading(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ButtonWarning(
text: String = "",
@ -425,7 +431,7 @@ fun ButtonWarning(
)
val borderColor = colorResource(id = R.color.shape_primary)
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Button(
onClick = onClick,
interactionSource = interactionSource,
@ -452,6 +458,7 @@ fun ButtonWarning(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ButtonWarningLoading(
text: String = "",
@ -473,7 +480,7 @@ fun ButtonWarningLoading(
)
val borderColor = colorResource(id = R.color.shape_primary)
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Box(modifier = modifierBox, contentAlignment = Alignment.Center) {
Button(
onClick = { if (!loading) onClick() },
@ -558,14 +565,6 @@ enum class ButtonSize(
}
object NoRippleTheme : RippleTheme {
@Composable
override fun defaultColor() = Color.Unspecified
@Composable
override fun rippleAlpha(): RippleAlpha = RippleAlpha(0.0f, 0.0f, 0.0f, 0.0f)
}
@Composable
@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO, name = "Light Mode")
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES, name = "Dark Mode")

View file

@ -12,7 +12,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Text
import androidx.compose.material.ripple.LocalRippleTheme
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LocalRippleConfiguration
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember
@ -24,6 +25,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.anytypeio.anytype.core_ui.R
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ButtonUpgrade(
text: String = "",
@ -38,7 +40,7 @@ fun ButtonUpgrade(
id = R.color.glyph_selected
)
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Box(
modifier = modifier
.fillMaxWidth()

View file

@ -10,7 +10,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Text
import androidx.compose.material.ripple.LocalRippleTheme
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LocalRippleConfiguration
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
@ -34,6 +35,7 @@ import com.anytypeio.anytype.core_ui.ColorButtonSecondaryText
import com.anytypeio.anytype.core_ui.views.animations.DotsLoadingIndicator
import com.anytypeio.anytype.core_ui.views.animations.FadeAnimationSpecs
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun OnBoardingButtonPrimary(
text: String = "",
@ -51,7 +53,7 @@ fun OnBoardingButtonPrimary(
ColorButtonPrimaryActive
}
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Button(
onClick = onClick,
interactionSource = interactionSource,
@ -94,6 +96,7 @@ fun OnBoardingButtonPrimary(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun OnBoardingButtonSecondary(
text: String = "",
@ -117,7 +120,7 @@ fun OnBoardingButtonSecondary(
ColorButtonSecondaryBorder
}
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Button(
onClick = onClick,
interactionSource = interactionSource,

View file

@ -5,9 +5,9 @@ kspVersion = "2.0.0-1.0.22"
androidxCoreVersion = "1.13.1"
androidxComposeVersion = '1.6.8'
composeMaterial3Version = '1.2.1'
composeMaterialVersion = '1.6.8'
androidxComposeVersion = '1.7.1'
composeMaterial3Version = '1.3.0'
composeMaterialVersion = '1.7.1'
composeConstraintLayoutVersion = '1.0.1'
dokkaVersion = '1.9.20'
@ -41,8 +41,8 @@ emojiCompatVersion = '1.1.0'
viewPager2Version = '1.1.0'
lifecycleVersion = '2.8.5'
lifecycleRuntimeComposeVersion = '2.8.5'
navigationVersion = '2.7.7'
navigationComposeVersion = '2.7.7'
navigationVersion = '2.8.0'
navigationComposeVersion = '2.8.0'
shimmerLayoutVersion = '0.5.0'
photoViewVersion = '2.3.0'
daggerVersion = '2.51'

View file

@ -1,6 +1,5 @@
package com.anytypeio.anytype.payments.screens
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
@ -12,11 +11,10 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text2.BasicTextField2
import androidx.compose.foundation.text2.input.TextFieldLineLimits
import androidx.compose.foundation.text2.input.TextFieldState
import androidx.compose.foundation.text.input.TextFieldLineLimits
import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
@ -43,7 +41,6 @@ import com.anytypeio.anytype.core_ui.views.Relations2
import com.anytypeio.anytype.payments.R
import com.anytypeio.anytype.payments.models.TierAnyName
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun AnyNameView(
anyNameState: TierAnyName,
@ -111,7 +108,7 @@ fun AnyNameView(
color = colorResource(id = R.color.text_tertiary)
)
} else {
BasicTextField2(
BasicTextField(
modifier = Modifier
.weight(1f)
.wrapContentHeight()
@ -126,7 +123,7 @@ fun AnyNameView(
keyboardOptions = KeyboardOptions.Default.copy(
imeAction = ImeAction.Done,
),
keyboardActions = KeyboardActions {
onKeyboardAction = {
keyboardController?.hide()
focusManager.clearFocus()
},

View file

@ -11,11 +11,10 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text2.BasicTextField2
import androidx.compose.foundation.text2.input.TextFieldLineLimits
import androidx.compose.foundation.text2.input.TextFieldState
import androidx.compose.foundation.text.input.TextFieldLineLimits
import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
@ -91,7 +90,7 @@ fun MembershipEmailScreen(
)
Spacer(modifier = Modifier.height(26.dp))
Box(modifier = Modifier) {
BasicTextField2(
BasicTextField(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
@ -106,7 +105,7 @@ fun MembershipEmailScreen(
keyboardOptions = KeyboardOptions.Default.copy(
imeAction = ImeAction.Done,
),
keyboardActions = KeyboardActions {
onKeyboardAction = {
keyboardController?.hide()
focusManager.clearFocus()
},

View file

@ -15,7 +15,7 @@ import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.ClickableText
import androidx.compose.foundation.text2.input.TextFieldState
import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
@ -36,7 +36,11 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.PRIVACY_POLICY
import com.anytypeio.anytype.core_models.membership.MembershipConstants.TERMS_OF_SERVICE
import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod
import com.anytypeio.anytype.core_models.membership.TierId
import com.anytypeio.anytype.core_ui.views.BodyCallout
import com.anytypeio.anytype.core_ui.views.ButtonPrimary
import com.anytypeio.anytype.core_ui.views.ButtonSecondary
@ -44,18 +48,14 @@ import com.anytypeio.anytype.core_ui.views.ButtonSize
import com.anytypeio.anytype.core_ui.views.HeadlineTitle
import com.anytypeio.anytype.core_ui.views.Relations2
import com.anytypeio.anytype.payments.R
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.PRIVACY_POLICY
import com.anytypeio.anytype.core_models.membership.MembershipConstants.TERMS_OF_SERVICE
import com.anytypeio.anytype.payments.models.Tier
import com.anytypeio.anytype.payments.models.TierAnyName
import com.anytypeio.anytype.payments.models.TierButton
import com.anytypeio.anytype.payments.models.TierConditionInfo
import com.anytypeio.anytype.payments.models.TierEmail
import com.anytypeio.anytype.payments.models.TierPeriod
import com.anytypeio.anytype.payments.models.Tier
import com.anytypeio.anytype.payments.viewmodel.MembershipTierState
import com.anytypeio.anytype.payments.viewmodel.TierAction
import com.anytypeio.anytype.core_models.membership.TierId
import timber.log.Timber

View file

@ -30,19 +30,19 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod
import com.anytypeio.anytype.core_models.membership.TierId
import com.anytypeio.anytype.core_ui.views.BodyRegular
import com.anytypeio.anytype.core_ui.views.ButtonSecondary
import com.anytypeio.anytype.core_ui.views.ButtonSize
import com.anytypeio.anytype.core_ui.views.HeadlineHeading
import com.anytypeio.anytype.payments.R
import com.anytypeio.anytype.payments.models.Tier
import com.anytypeio.anytype.payments.models.TierAnyName
import com.anytypeio.anytype.payments.models.TierButton
import com.anytypeio.anytype.payments.models.TierConditionInfo
import com.anytypeio.anytype.payments.models.TierEmail
import com.anytypeio.anytype.payments.models.TierPeriod
import com.anytypeio.anytype.payments.models.Tier
import com.anytypeio.anytype.payments.viewmodel.WelcomeState
import com.anytypeio.anytype.core_models.membership.TierId
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@ -68,7 +68,9 @@ fun WelcomeScreen(state: WelcomeState, onDismiss: () -> Unit) {
},
shape = RoundedCornerShape(16.dp),
dragHandle = null,
windowInsets = WindowInsets(0, 0, 0, 0)
contentWindowInsets = {
WindowInsets(0, 0, 0, 0)
}
)
}
}

View file

@ -1,9 +1,9 @@
package com.anytypeio.anytype.payments.viewmodel
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.text2.input.TextFieldState
import androidx.compose.foundation.text2.input.clearText
import androidx.compose.foundation.text2.input.textAsFlow
import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.foundation.text.input.clearText
import androidx.compose.runtime.snapshotFlow
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.android.billingclient.api.BillingFlowParams
@ -11,8 +11,13 @@ import com.android.billingclient.api.ProductDetails
import com.anytypeio.anytype.analytics.base.Analytics
import com.anytypeio.anytype.analytics.base.EventsDictionary
import com.anytypeio.anytype.core_models.membership.EmailVerificationStatus
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.MEMBERSHIP_NAME_MIN_LENGTH
import com.anytypeio.anytype.core_models.membership.MembershipConstants.NONE_ID
import com.anytypeio.anytype.core_models.membership.MembershipErrors
import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod
import com.anytypeio.anytype.core_models.membership.MembershipStatus
import com.anytypeio.anytype.core_models.membership.TierId
import com.anytypeio.anytype.domain.auth.interactor.GetAccount
import com.anytypeio.anytype.domain.base.fold
import com.anytypeio.anytype.domain.payments.GetMembershipEmailStatus
@ -20,23 +25,18 @@ import com.anytypeio.anytype.domain.payments.GetMembershipPaymentUrl
import com.anytypeio.anytype.domain.payments.IsMembershipNameValid
import com.anytypeio.anytype.domain.payments.SetMembershipEmail
import com.anytypeio.anytype.domain.payments.VerifyMembershipEmailCode
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.MEMBERSHIP_NAME_MIN_LENGTH
import com.anytypeio.anytype.core_models.membership.MembershipConstants.NONE_ID
import com.anytypeio.anytype.payments.mapping.toMainView
import com.anytypeio.anytype.payments.models.MembershipPurchase
import com.anytypeio.anytype.payments.models.Tier
import com.anytypeio.anytype.payments.models.TierAnyName
import com.anytypeio.anytype.payments.models.TierButton
import com.anytypeio.anytype.payments.models.TierEmail
import com.anytypeio.anytype.payments.models.Tier
import com.anytypeio.anytype.payments.playbilling.BillingClientLifecycle
import com.anytypeio.anytype.payments.playbilling.BillingClientState
import com.anytypeio.anytype.payments.playbilling.BillingPurchaseState
import com.anytypeio.anytype.presentation.extension.sendAnalyticsMembershipClickEvent
import com.anytypeio.anytype.presentation.extension.sendAnalyticsMembershipPurchaseEvent
import com.anytypeio.anytype.presentation.extension.sendAnalyticsMembershipScreenEvent
import com.anytypeio.anytype.core_models.membership.MembershipStatus
import com.anytypeio.anytype.core_models.membership.TierId
import com.anytypeio.anytype.presentation.membership.provider.MembershipProvider
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.Job
@ -91,10 +91,8 @@ class MembershipViewModel(
val initBillingClient = MutableStateFlow(false)
@OptIn(ExperimentalFoundationApi::class)
val anyNameState = TextFieldState(initialText = "")
@OptIn(ExperimentalFoundationApi::class)
val anyEmailState = TextFieldState(initialText = "")
init {
@ -133,13 +131,15 @@ class MembershipViewModel(
viewState.value = newState
}
}
viewModelScope.launch {
anyNameState.textAsFlow()
snapshotFlow { anyNameState.text }
.debounce(NAME_VALIDATION_DELAY)
.collectLatest {
proceedWithValidatingName(it.toString())
}
}
viewModelScope.launch {
billingPurchases.collectLatest { billingPurchaseState ->
checkPurchaseStatus(billingPurchaseState)

View file

@ -1,10 +1,17 @@
package com.anytypeio.anytype.ui_settings.space
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.LocalRippleConfiguration
import androidx.compose.material.MaterialTheme
import androidx.compose.material.ripple.LocalRippleTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
@ -20,10 +27,10 @@ import androidx.compose.ui.res.colorResource
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.times
import com.anytypeio.anytype.core_ui.views.NoRippleTheme
import com.anytypeio.anytype.presentation.settings.SpacesStorageViewModel
import com.anytypeio.anytype.ui_settings.R
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun SegmentLine(items: List<SpacesStorageViewModel.SegmentLineItem>) {
var size by remember { mutableStateOf(IntSize.Zero) }
@ -33,7 +40,7 @@ fun SegmentLine(items: List<SpacesStorageViewModel.SegmentLineItem>) {
.fillMaxWidth()
.onSizeChanged { size = it }
) {
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
CompositionLocalProvider(LocalRippleConfiguration provides null) {
Row(
modifier = Modifier
.fillMaxWidth()