🚀 Help screen UI improvement + New transition
* Improved UI * Removed help tip (How to find books) * Improved animations * Removed unused string resources * New transition Part of: #60
This commit is contained in:
parent
169b939523
commit
7c925427b5
14 changed files with 75 additions and 353 deletions
|
|
@ -1,16 +1,13 @@
|
|||
package ua.acclorite.book_story.domain.model
|
||||
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.foundation.layout.ColumnScope
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.Immutable
|
||||
import androidx.compose.ui.text.AnnotatedString
|
||||
import ua.acclorite.book_story.domain.util.OnNavigate
|
||||
import ua.acclorite.book_story.presentation.screens.help.data.HelpEvent
|
||||
|
||||
@Immutable
|
||||
data class HelpTip(
|
||||
@StringRes val title: Int,
|
||||
val description: @Composable AnnotatedString.Builder.(onNavigate: OnNavigate, fromStart: Boolean) -> Unit,
|
||||
val customContent: @Composable ColumnScope.(onHelpEvent: (HelpEvent) -> Unit) -> Unit = {},
|
||||
val description: @Composable AnnotatedString.Builder.(onNavigate: OnNavigate, fromStart: Boolean) -> Unit
|
||||
)
|
||||
|
|
@ -26,7 +26,6 @@ import ua.acclorite.book_story.domain.model.HelpTip
|
|||
import ua.acclorite.book_story.domain.model.NavigationItem
|
||||
import ua.acclorite.book_story.presentation.data.Screen
|
||||
import ua.acclorite.book_story.presentation.screens.help.components.HelpAnnotation
|
||||
import ua.acclorite.book_story.presentation.screens.help.components.content.HelpFindBooksContent
|
||||
import ua.acclorite.book_story.presentation.ui.Theme
|
||||
|
||||
object Constants {
|
||||
|
|
@ -167,16 +166,6 @@ private fun provideCredits() = listOf(
|
|||
)
|
||||
|
||||
private fun provideHelpTips() = listOf(
|
||||
HelpTip(
|
||||
title = R.string.help_title_how_to_find_books,
|
||||
description = { _, _ ->
|
||||
append(stringResource(id = R.string.help_desc_how_to_find_books))
|
||||
},
|
||||
customContent = { onHelpEvent ->
|
||||
HelpFindBooksContent(onEvent = onHelpEvent)
|
||||
}
|
||||
),
|
||||
|
||||
HelpTip(
|
||||
title = R.string.help_title_how_to_add_books,
|
||||
description = { onNavigate, fromStart ->
|
||||
|
|
|
|||
|
|
@ -1,13 +1,11 @@
|
|||
package ua.acclorite.book_story.presentation.screens.help
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.WindowInsets
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.imePadding
|
||||
import androidx.compose.foundation.layout.navigationBars
|
||||
import androidx.compose.foundation.layout.navigationBarsPadding
|
||||
import androidx.compose.foundation.layout.padding
|
||||
|
|
@ -47,7 +45,6 @@ import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent
|
|||
import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel
|
||||
import ua.acclorite.book_story.presentation.screens.help.components.HelpItem
|
||||
import ua.acclorite.book_story.presentation.screens.help.components.items.HelpClickMeNoteItem
|
||||
import ua.acclorite.book_story.presentation.screens.help.data.HelpEvent
|
||||
import ua.acclorite.book_story.presentation.screens.help.data.HelpState
|
||||
import ua.acclorite.book_story.presentation.screens.help.data.HelpViewModel
|
||||
import ua.acclorite.book_story.presentation.screens.start.data.StartEvent
|
||||
|
|
@ -70,7 +67,6 @@ fun HelpScreenRoot(screen: Screen.Help) {
|
|||
HelpScreen(
|
||||
state = state,
|
||||
onNavigate = { navigator.it() },
|
||||
onEvent = helpViewModel::onEvent,
|
||||
onMainEvent = mainViewModel::onEvent,
|
||||
onBrowseEvent = browseViewModel::onEvent,
|
||||
onStartEvent = startViewModel::onEvent
|
||||
|
|
@ -84,7 +80,6 @@ fun HelpScreenRoot(screen: Screen.Help) {
|
|||
private fun HelpScreen(
|
||||
state: State<HelpState>,
|
||||
onNavigate: OnNavigate,
|
||||
onEvent: (HelpEvent) -> Unit,
|
||||
onMainEvent: (MainEvent) -> Unit,
|
||||
onBrowseEvent: (BrowseEvent) -> Unit,
|
||||
onStartEvent: (StartEvent) -> Unit
|
||||
|
|
@ -158,17 +153,11 @@ private fun HelpScreen(
|
|||
CustomLazyColumn(
|
||||
Modifier
|
||||
.fillMaxSize()
|
||||
.padding(paddingValues)
|
||||
.imePadding(),
|
||||
state = scrollState.second,
|
||||
contentPadding = PaddingValues(horizontal = 18.dp)
|
||||
.padding(paddingValues),
|
||||
state = scrollState.second
|
||||
) {
|
||||
item {
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.animateItem()
|
||||
.height(16.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
}
|
||||
|
||||
item {
|
||||
|
|
@ -176,28 +165,19 @@ private fun HelpScreen(
|
|||
}
|
||||
|
||||
item {
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.animateItem()
|
||||
.height(16.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
}
|
||||
|
||||
customItems(Constants.HELP_TIPS, key = { it.title }) { helpTip ->
|
||||
HelpItem(
|
||||
helpTip = helpTip,
|
||||
onNavigate = onNavigate,
|
||||
fromStart = state.value.fromStart,
|
||||
onHelpEvent = onEvent
|
||||
fromStart = state.value.fromStart
|
||||
)
|
||||
}
|
||||
|
||||
item {
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.animateItem()
|
||||
.height(48.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.height(48.dp))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ import androidx.compose.foundation.clickable
|
|||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.lazy.LazyItemScope
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.outlined.Info
|
||||
import androidx.compose.material3.Icon
|
||||
|
|
@ -20,7 +20,7 @@ import androidx.compose.ui.text.AnnotatedString
|
|||
import androidx.compose.ui.unit.dp
|
||||
import ua.acclorite.book_story.R
|
||||
import ua.acclorite.book_story.presentation.components.CustomTooltip
|
||||
import ua.acclorite.book_story.presentation.ui.SlidingTransition
|
||||
import ua.acclorite.book_story.presentation.ui.ExpandingTransition
|
||||
|
||||
/**
|
||||
* Help Clickable Note.
|
||||
|
|
@ -29,10 +29,10 @@ import ua.acclorite.book_story.presentation.ui.SlidingTransition
|
|||
* @param text [AnnotatedString].
|
||||
*/
|
||||
@Composable
|
||||
fun LazyItemScope.HelpClickableNote(text: AnnotatedString) {
|
||||
fun HelpClickableNote(text: AnnotatedString) {
|
||||
val showNote = rememberSaveable { mutableStateOf(true) }
|
||||
|
||||
Column(Modifier.animateItem()) {
|
||||
Column(Modifier.padding(horizontal = 18.dp)) {
|
||||
CustomTooltip(text = stringResource(R.string.note_content_desc)) {
|
||||
Icon(
|
||||
imageVector = Icons.Outlined.Info,
|
||||
|
|
@ -46,7 +46,7 @@ fun LazyItemScope.HelpClickableNote(text: AnnotatedString) {
|
|||
)
|
||||
}
|
||||
|
||||
SlidingTransition(visible = showNote.value) {
|
||||
ExpandingTransition(visible = showNote.value) {
|
||||
Column {
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
Text(
|
||||
|
|
@ -59,9 +59,3 @@ fun LazyItemScope.HelpClickableNote(text: AnnotatedString) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
package ua.acclorite.book_story.presentation.screens.help.components
|
||||
|
||||
import androidx.compose.animation.animateColorAsState
|
||||
import androidx.compose.animation.core.animateFloatAsState
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
|
|
@ -11,18 +13,18 @@ import androidx.compose.foundation.layout.height
|
|||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.lazy.LazyItemScope
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.outlined.ArrowDropUp
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.draw.rotate
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.buildAnnotatedString
|
||||
|
|
@ -30,8 +32,7 @@ import androidx.compose.ui.unit.dp
|
|||
import ua.acclorite.book_story.R
|
||||
import ua.acclorite.book_story.domain.model.HelpTip
|
||||
import ua.acclorite.book_story.domain.util.OnNavigate
|
||||
import ua.acclorite.book_story.presentation.screens.help.data.HelpEvent
|
||||
import ua.acclorite.book_story.presentation.ui.SlidingTransition
|
||||
import ua.acclorite.book_story.presentation.ui.ExpandingTransition
|
||||
|
||||
/**
|
||||
* Help Item.
|
||||
|
|
@ -40,29 +41,44 @@ import ua.acclorite.book_story.presentation.ui.SlidingTransition
|
|||
* @param helpTip [HelpTip] to be shown.
|
||||
* @param onNavigate Navigator callback.
|
||||
* @param fromStart Whether user came from Start screen.
|
||||
* @param onHelpEvent [HelpEvent] callback.
|
||||
*/
|
||||
@Composable
|
||||
fun LazyItemScope.HelpItem(
|
||||
fun HelpItem(
|
||||
helpTip: HelpTip,
|
||||
onNavigate: OnNavigate,
|
||||
fromStart: Boolean,
|
||||
onHelpEvent: (HelpEvent) -> Unit
|
||||
fromStart: Boolean
|
||||
) {
|
||||
val showDescription = rememberSaveable {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
val animatedArrowRotation by animateFloatAsState(
|
||||
|
||||
val animatedArrowRotation = animateFloatAsState(
|
||||
targetValue = if (showDescription.value) 0f else -180f,
|
||||
animationSpec = tween(300),
|
||||
label = stringResource(id = R.string.arrow_anim_content_desc)
|
||||
animationSpec = tween(400)
|
||||
)
|
||||
val animatedBackgroundColor = animateColorAsState(
|
||||
targetValue = if (showDescription.value) {
|
||||
MaterialTheme.colorScheme.surfaceContainer
|
||||
} else MaterialTheme.colorScheme.surfaceContainerLow,
|
||||
animationSpec = tween(400)
|
||||
)
|
||||
val animatedArrowContainerColor = animateColorAsState(
|
||||
targetValue = if (showDescription.value) {
|
||||
MaterialTheme.colorScheme.surfaceContainerHigh
|
||||
} else MaterialTheme.colorScheme.surfaceContainer,
|
||||
animationSpec = tween(400)
|
||||
)
|
||||
|
||||
Column(
|
||||
Modifier
|
||||
.animateItem()
|
||||
.fillMaxWidth()
|
||||
.padding(vertical = 8.dp)
|
||||
.clip(MaterialTheme.shapes.large)
|
||||
.padding(horizontal = 8.dp, vertical = 4.dp)
|
||||
.background(
|
||||
animatedBackgroundColor.value,
|
||||
MaterialTheme.shapes.large
|
||||
)
|
||||
.padding(vertical = 16.dp, horizontal = 18.dp)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
|
|
@ -83,17 +99,25 @@ fun LazyItemScope.HelpItem(
|
|||
imageVector = Icons.Outlined.ArrowDropUp,
|
||||
tint = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
modifier = Modifier
|
||||
.clip(MaterialTheme.shapes.medium)
|
||||
.background(
|
||||
animatedArrowContainerColor.value,
|
||||
MaterialTheme.shapes.medium
|
||||
)
|
||||
.padding(8.dp)
|
||||
.size(24.dp)
|
||||
.rotate(animatedArrowRotation),
|
||||
.rotate(animatedArrowRotation.value),
|
||||
contentDescription = stringResource(id = R.string.arrow_content_desc)
|
||||
)
|
||||
}
|
||||
|
||||
SlidingTransition(
|
||||
ExpandingTransition(
|
||||
visible = showDescription.value
|
||||
) {
|
||||
Column(Modifier.fillMaxWidth()) {
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
HorizontalDivider()
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
Text(
|
||||
text = buildAnnotatedString {
|
||||
helpTip.description.invoke(
|
||||
|
|
@ -106,10 +130,6 @@ fun LazyItemScope.HelpItem(
|
|||
color = MaterialTheme.colorScheme.onSurfaceVariant
|
||||
)
|
||||
)
|
||||
helpTip.customContent.invoke(
|
||||
this,
|
||||
onHelpEvent
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,153 +0,0 @@
|
|||
package ua.acclorite.book_story.presentation.screens.help.components.content
|
||||
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.text.KeyboardActions
|
||||
import androidx.compose.foundation.text.KeyboardOptions
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Search
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.OutlinedTextField
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringArrayResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.buildAnnotatedString
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.compose.ui.text.input.KeyboardCapitalization
|
||||
import androidx.compose.ui.unit.dp
|
||||
import ua.acclorite.book_story.R
|
||||
import ua.acclorite.book_story.presentation.components.CustomIconButton
|
||||
import ua.acclorite.book_story.presentation.data.showToast
|
||||
import ua.acclorite.book_story.presentation.screens.help.components.HelpAnnotation
|
||||
import ua.acclorite.book_story.presentation.screens.help.data.HelpEvent
|
||||
import ua.acclorite.book_story.presentation.ui.SlidingTransition
|
||||
|
||||
/**
|
||||
* Help Find Books Content.
|
||||
* [ua.acclorite.book_story.domain.model.HelpTip]'s custom content.
|
||||
*/
|
||||
@Composable
|
||||
fun HelpFindBooksContent(onEvent: (HelpEvent) -> Unit) {
|
||||
val context = LocalContext.current
|
||||
val text = remember { mutableStateOf("") }
|
||||
val showError = remember { mutableStateOf(false) }
|
||||
|
||||
val sites = stringArrayResource(id = R.array.book_sites)
|
||||
val supportingText = buildAnnotatedString {
|
||||
append(stringResource(id = R.string.help_field_support) + " ")
|
||||
|
||||
sites.forEachIndexed { index, string ->
|
||||
HelpAnnotation(
|
||||
onClick = {
|
||||
onEvent(
|
||||
HelpEvent.OnNavigateToBrowserPage(
|
||||
page = string.substringAfterLast("|"),
|
||||
context = context,
|
||||
noAppsFound = {
|
||||
context.getString(R.string.error_no_browser)
|
||||
.showToast(context = context, longToast = false)
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
) {
|
||||
append(string.substringBeforeLast("|"))
|
||||
}
|
||||
|
||||
if (index < sites.lastIndex) {
|
||||
append(", ")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(4.dp))
|
||||
OutlinedTextField(
|
||||
value = text.value,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
onValueChange = { value ->
|
||||
text.value = value
|
||||
showError.value = false
|
||||
},
|
||||
label = {
|
||||
Text(text = stringResource(id = R.string.help_field_placeholder))
|
||||
},
|
||||
keyboardActions = KeyboardActions(
|
||||
onSearch = {
|
||||
onEvent(
|
||||
HelpEvent.OnSearchInWeb(
|
||||
page = text.value,
|
||||
context = context,
|
||||
error = {
|
||||
showError.value = true
|
||||
},
|
||||
noAppsFound = {
|
||||
context.getString(R.string.error_no_browser)
|
||||
.showToast(context = context, longToast = false)
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(
|
||||
KeyboardCapitalization.Words,
|
||||
imeAction = ImeAction.Search
|
||||
),
|
||||
trailingIcon = {
|
||||
CustomIconButton(
|
||||
icon = Icons.Default.Search,
|
||||
contentDescription = R.string.search_content_desc,
|
||||
disableOnClick = false,
|
||||
enabled = !showError.value,
|
||||
color = when (showError.value) {
|
||||
true -> MaterialTheme.colorScheme.outline
|
||||
false -> MaterialTheme.colorScheme.primary
|
||||
},
|
||||
onClick = {
|
||||
onEvent(
|
||||
HelpEvent.OnSearchInWeb(
|
||||
page = text.value,
|
||||
context = context,
|
||||
error = { showError.value = true },
|
||||
noAppsFound = {
|
||||
context.getString(R.string.error_no_browser)
|
||||
.showToast(context = context, longToast = false)
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
)
|
||||
},
|
||||
supportingText = {
|
||||
Column {
|
||||
Spacer(modifier = Modifier.height(2.dp))
|
||||
Box {
|
||||
SlidingTransition(visible = showError.value) {
|
||||
Text(
|
||||
text = stringResource(id = R.string.help_field_error),
|
||||
color = MaterialTheme.colorScheme.error,
|
||||
style = MaterialTheme.typography.bodySmall
|
||||
)
|
||||
}
|
||||
SlidingTransition(visible = !showError.value) {
|
||||
Text(
|
||||
text = supportingText,
|
||||
style = MaterialTheme.typography.bodySmall.copy(
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
singleLine = true
|
||||
)
|
||||
}
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
package ua.acclorite.book_story.presentation.screens.help.data
|
||||
|
||||
import android.content.Context
|
||||
import androidx.compose.runtime.Immutable
|
||||
|
||||
@Immutable
|
||||
sealed class HelpEvent {
|
||||
data class OnSearchInWeb(
|
||||
val page: String,
|
||||
val context: Context,
|
||||
val error: () -> Unit,
|
||||
val noAppsFound: () -> Unit
|
||||
) : HelpEvent()
|
||||
|
||||
data class OnNavigateToBrowserPage(
|
||||
val page: String,
|
||||
val context: Context,
|
||||
val noAppsFound: () -> Unit
|
||||
) : HelpEvent()
|
||||
}
|
||||
|
|
@ -1,9 +1,5 @@
|
|||
package ua.acclorite.book_story.presentation.screens.help.data
|
||||
|
||||
import android.app.SearchManager
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
|
|
@ -12,7 +8,6 @@ import kotlinx.coroutines.flow.asStateFlow
|
|||
import kotlinx.coroutines.flow.update
|
||||
import kotlinx.coroutines.launch
|
||||
import ua.acclorite.book_story.presentation.data.Screen
|
||||
import ua.acclorite.book_story.presentation.data.launchActivity
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
|
|
@ -23,44 +18,6 @@ class HelpViewModel @Inject constructor(
|
|||
private val _state = MutableStateFlow(HelpState())
|
||||
val state = _state.asStateFlow()
|
||||
|
||||
fun onEvent(event: HelpEvent) {
|
||||
when (event) {
|
||||
is HelpEvent.OnNavigateToBrowserPage -> {
|
||||
viewModelScope.launch {
|
||||
val intent = Intent(
|
||||
Intent.ACTION_VIEW,
|
||||
Uri.parse(event.page)
|
||||
)
|
||||
|
||||
intent.launchActivity(event.context as ComponentActivity) {
|
||||
event.noAppsFound()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
is HelpEvent.OnSearchInWeb -> {
|
||||
viewModelScope.launch {
|
||||
if (event.page.isBlank()) {
|
||||
event.error()
|
||||
return@launch
|
||||
}
|
||||
|
||||
val intent = Intent()
|
||||
|
||||
intent.action = Intent.ACTION_WEB_SEARCH
|
||||
intent.putExtra(
|
||||
SearchManager.QUERY,
|
||||
"${event.page.trim()} filetype:txt OR filetype:pdf"
|
||||
)
|
||||
|
||||
intent.launchActivity(event.context as ComponentActivity) {
|
||||
event.noAppsFound()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun init(screen: Screen.Help) {
|
||||
viewModelScope.launch {
|
||||
_state.update {
|
||||
|
|
@ -71,11 +28,3 @@ class HelpViewModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,9 +4,11 @@ import androidx.compose.animation.core.AnimationSpec
|
|||
import androidx.compose.animation.core.EaseInOut
|
||||
import androidx.compose.animation.core.animateFloatAsState
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.animation.expandVertically
|
||||
import androidx.compose.animation.fadeIn
|
||||
import androidx.compose.animation.fadeOut
|
||||
import androidx.compose.animation.scaleIn
|
||||
import androidx.compose.animation.shrinkVertically
|
||||
import androidx.compose.animation.slideInHorizontally
|
||||
import androidx.compose.animation.slideInVertically
|
||||
import androidx.compose.animation.slideOutHorizontally
|
||||
|
|
@ -78,6 +80,23 @@ fun SlidingTransition(
|
|||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ExpandingTransition(
|
||||
visible: Boolean,
|
||||
modifier: Modifier = Modifier,
|
||||
content: @Composable () -> Unit
|
||||
) {
|
||||
CustomAnimatedVisibility(
|
||||
visible = visible,
|
||||
modifier = modifier,
|
||||
enter = expandVertically(tween(400)) +
|
||||
fadeIn(tween(400)),
|
||||
exit = shrinkVertically(tween(350)) +
|
||||
fadeOut(tween(200)),
|
||||
content = content
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun FadeTransitionPreservingSpace(
|
||||
visible: Boolean,
|
||||
|
|
|
|||
|
|
@ -138,11 +138,6 @@
|
|||
<string name="report_bug_option">Fehler melden</string>
|
||||
<string name="help_clickable_note_3">kann angeklickt werden. Du kannst diese Notiz auch ausblenden, indem du auf das Symbol klickst, probier es aus!</string>
|
||||
<string name="help_clickable_note_action">Ich bin anklickbar!</string>
|
||||
<string name="help_title_how_to_find_books">Wie finde und lade ich Bücher herunter?</string>
|
||||
<string name="help_desc_how_to_find_books">Sie können versuchen, die gewünschten Bücher über die bereitgestellten Websites zu finden, oder Sie können das Textfeld verwenden, um online nach Büchern zu suchen.</string>
|
||||
<string name="help_field_placeholder">Name des Buches</string>
|
||||
<string name="help_field_support">Nützliche Websites mit Büchern:</string>
|
||||
<string name="help_field_error">Der Name des Buches darf nicht leer sein</string>
|
||||
<string name="help_title_how_to_add_books">Wie füge ich Bücher zur Bibliothek hinzu?</string>
|
||||
<string name="help_desc_how_to_add_books_1">Gehen Sie zum</string>
|
||||
<string name="help_desc_how_to_add_books_2">Durchsuchen</string>
|
||||
|
|
@ -284,7 +279,6 @@
|
|||
<string name="history_content_desc">Leseverlauf</string>
|
||||
<string name="browse_content_desc">Bücher hinzufügen</string>
|
||||
<string name="arrow_content_desc">Pfeil</string>
|
||||
<string name="arrow_anim_content_desc">Pfeilanimation</string>
|
||||
<string name="required_content_desc">Vorausgesetzt</string>
|
||||
<string name="reset_start_content_desc">Startanleitung zurücksetzen</string>
|
||||
<string name="exit_editing_content_desc">Bearbeitungsmodus beenden</string>
|
||||
|
|
|
|||
|
|
@ -188,10 +188,6 @@
|
|||
<string name="slava_ukraini">¡Gloria a Ucrania!</string>
|
||||
<string name="credits_design">Diseño</string>
|
||||
<string name="help_clickable_note_action">¡Puedo hacer clic!</string>
|
||||
<string name="help_title_how_to_find_books">¿Cómo encuentro y descargo libros?</string>
|
||||
<string name="help_field_placeholder">Nombre del libro</string>
|
||||
<string name="help_field_support">Páginas útiles con libros:</string>
|
||||
<string name="help_field_error">El nombre del libro no debe estar vacío</string>
|
||||
<string name="help_desc_how_to_add_books_1">Ir a la</string>
|
||||
<string name="help_desc_how_to_add_books_4">Biblioteca</string>
|
||||
<string name="help_title_how_to_customize_app">¿Cómo personalizo la aplicación?</string>
|
||||
|
|
@ -221,7 +217,6 @@
|
|||
<string name="credits_updates">Gestión de nuevas actualizaciones</string>
|
||||
<string name="help_clickable_note_3">se puede hacer clic. También puedes ocultar esta nota haciendo clic en el icono, ¡pruébalo!</string>
|
||||
<string name="help_clickable_note_2">en este texto resaltado</string>
|
||||
<string name="help_desc_how_to_find_books">Puedes intentar encontrar los libros que desees utilizando las páginas de la nota proporcionada o puedes utilizar el campo de texto para buscar los libros en Internet.</string>
|
||||
<string name="help_title_how_to_add_books">¿Cómo añado libros a la biblioteca?</string>
|
||||
<string name="help_desc_how_to_add_books_3">Si no ves los libros descargados intenta actualizar la lista tirando de ella hacia abajo. Asegúrate de que tus libros tienen un formato de archivo compatible. A continuación, haz clic en el libro para seleccionarlo o manténlo presionado para ver su ubicación. Cuando hayas seleccionado todos los libros que quieres, haz clic en el icono de la marca de verificación en la esquina superior derecha, espera a que se carguen todos los libros y haz clic en \"Añadir\". Ahora deberías ver todos los libros que ha añadido en la sección</string>
|
||||
<string name="help_title_how_to_edit_book">¿Cómo se edita un libro?</string>
|
||||
|
|
@ -274,7 +269,6 @@
|
|||
<string name="delete_history_element_content_desc">Eliminar elemento del historial</string>
|
||||
<string name="library_content_desc">Tu biblioteca</string>
|
||||
<string name="arrow_content_desc">Flecha</string>
|
||||
<string name="arrow_anim_content_desc">Animación de flecha</string>
|
||||
<string name="required_content_desc">Necesario</string>
|
||||
<string name="exit_editing_content_desc">Salir del modo edición</string>
|
||||
<string name="open_in_web_content_desc">Abrir en la web</string>
|
||||
|
|
|
|||
|
|
@ -303,14 +303,6 @@
|
|||
Ayrıca ikona tıklayarak bu notu gizleyebilirsiniz, deneyin!
|
||||
</string>
|
||||
<string name="help_clickable_note_action">Ben tıklanabiliyorum!</string>
|
||||
<string name="help_title_how_to_find_books">Kitapları nasıl bulup indirebilirim?</string>
|
||||
<string name="help_desc_how_to_find_books">
|
||||
İstediğiniz kitapları verilen nottaki sitelerden bulmayı deneyebilir
|
||||
veya kitapları çevrimiçi aramak için metin alanını kullanabilirsiniz.
|
||||
</string>
|
||||
<string name="help_field_placeholder">Kitabın adı</string>
|
||||
<string name="help_field_support">Kitap içeren faydalı siteler:</string>
|
||||
<string name="help_field_error">Kitap adı boş olmamalı</string>
|
||||
<string name="help_title_how_to_add_books">Kitapları Kütüphane\'ye nasıl eklerim?</string>
|
||||
<string name="help_desc_how_to_add_books_1">Şuraya gidin:</string>
|
||||
<string name="help_desc_how_to_add_books_2">Göz At</string>
|
||||
|
|
@ -490,7 +482,6 @@
|
|||
<string name="history_content_desc">Okuma geçmişi</string>
|
||||
<string name="browse_content_desc">Kitap ekle</string>
|
||||
<string name="arrow_content_desc">Ok</string>
|
||||
<string name="arrow_anim_content_desc">Ok animasyonu</string>
|
||||
<string name="required_content_desc">Gerekli</string>
|
||||
<string name="reset_start_content_desc">Başlangıç kılavuzunu sıfırla</string>
|
||||
<string name="exit_editing_content_desc">Düzenleme modundan çık</string>
|
||||
|
|
|
|||
|
|
@ -1,9 +1,4 @@
|
|||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Book sources -->
|
||||
<string-array name="book_sites" tools:ignore="InconsistentArrays">
|
||||
<item>Архів Анни|https://uk.annas-archive.org</item>
|
||||
<item>Укрліб|https://www.ukrlib.com.ua</item>
|
||||
</string-array>
|
||||
<resources>
|
||||
|
||||
<!-- Notifications -->
|
||||
<string name="updates_notification_channel">Нові оновлення</string>
|
||||
|
|
@ -383,15 +378,6 @@
|
|||
</string>
|
||||
<string name="help_clickable_note_action">На мене можна натиснути!</string>
|
||||
|
||||
<string name="help_title_how_to_find_books">Як мені знайти та завантажити книги?</string>
|
||||
<string name="help_desc_how_to_find_books">
|
||||
Ви можете спробувати знайти бажані книги використовуючи сайти з наведеної примітки
|
||||
або ви можете використати текстове поле, щоб шукати книги в інтернеті.
|
||||
</string>
|
||||
<string name="help_field_placeholder">Назва книги</string>
|
||||
<string name="help_field_support">Корисні сайти з книгами:</string>
|
||||
<string name="help_field_error">Назва книги не має бути порожньою</string>
|
||||
|
||||
<string name="help_title_how_to_add_books">Як мені додати книги в Бібліотеку?</string>
|
||||
<string name="help_desc_how_to_add_books_1">Перейдіть в</string>
|
||||
<string name="help_desc_how_to_add_books_2">Огляд</string>
|
||||
|
|
@ -594,7 +580,6 @@
|
|||
<string name="history_content_desc">Історія читання</string>
|
||||
<string name="browse_content_desc">Додавайте книги</string>
|
||||
<string name="arrow_content_desc">Стрілка</string>
|
||||
<string name="arrow_anim_content_desc">Анімація стрілки</string>
|
||||
<string name="required_content_desc">Необхідно</string>
|
||||
<string name="reset_start_content_desc">Скинути початковий посібник</string>
|
||||
<string name="exit_editing_content_desc">Вийти з режиму редагування</string>
|
||||
|
|
|
|||
|
|
@ -1,15 +1,8 @@
|
|||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="InconsistentArrays">
|
||||
<resources>
|
||||
<!-- Basic Strings -->
|
||||
<string name="app_version" translatable="false">1.2.0</string>
|
||||
<string name="app_name" translatable="false">Book\'s Story</string>
|
||||
|
||||
<!-- Book sources -->
|
||||
<string-array name="book_sites">
|
||||
<item>Anna\'s Archive|https://www.annas-archive.org</item>
|
||||
<item>Project Gutenberg|https://www.gutenberg.org</item>
|
||||
<item>Standard Ebooks|https://www.standardebooks.org</item>
|
||||
</string-array>
|
||||
|
||||
<!-- About sites -->
|
||||
<string name="download_latest_release_page" translatable="false">
|
||||
https://www.github.com/Acclorite/book-story/releases/latest/download/book-story.apk
|
||||
|
|
@ -402,15 +395,6 @@
|
|||
</string>
|
||||
<string name="help_clickable_note_action">I\'m clickable!</string>
|
||||
|
||||
<string name="help_title_how_to_find_books">How do I find and download books?</string>
|
||||
<string name="help_desc_how_to_find_books">
|
||||
You can try to find desired books using sites from provided note
|
||||
or you can use text field to search for books online.
|
||||
</string>
|
||||
<string name="help_field_placeholder">Book\'s name</string>
|
||||
<string name="help_field_support">Useful sites with books:</string>
|
||||
<string name="help_field_error">Book\'s name should not be empty</string>
|
||||
|
||||
<string name="help_title_how_to_add_books">How do I add books to the Library?</string>
|
||||
<string name="help_desc_how_to_add_books_1">Go to the</string>
|
||||
<string name="help_desc_how_to_add_books_2">Browse</string>
|
||||
|
|
@ -612,7 +596,6 @@
|
|||
<string name="history_content_desc">Reading history</string>
|
||||
<string name="browse_content_desc">Add books</string>
|
||||
<string name="arrow_content_desc">Arrow</string>
|
||||
<string name="arrow_anim_content_desc">Arrow animation</string>
|
||||
<string name="required_content_desc">Required</string>
|
||||
<string name="reset_start_content_desc">Reset start guide</string>
|
||||
<string name="exit_editing_content_desc">Exit editing mode</string>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue