🛠️ Refactor code
* Inspected and refactored code in various places
This commit is contained in:
parent
78e7d710ea
commit
8981c92df3
66 changed files with 100 additions and 168 deletions
2
app/proguard-rules.pro
vendored
2
app/proguard-rules.pro
vendored
|
|
@ -44,5 +44,5 @@
|
||||||
-keepnames class **
|
-keepnames class **
|
||||||
-keepnames class org.xmlpull.** { *; }
|
-keepnames class org.xmlpull.** { *; }
|
||||||
-keepclassmembernames class org.xmlpull.** { *; }
|
-keepclassmembernames class org.xmlpull.** { *; }
|
||||||
-keepnames class kotlin.reflect.jvm.internal.impl.builtins.PrimitiveType { values(); }
|
#-keepnames class kotlin.reflect.jvm.internal.impl.builtins.PrimitiveType { values(); }
|
||||||
-keepnames class * implements android.os.Parcelable { ** CREATOR; }
|
-keepnames class * implements android.os.Parcelable { ** CREATOR; }
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.data.mapper.book
|
package ua.acclorite.book_story.data.mapper.book
|
||||||
|
|
||||||
import android.net.Uri
|
import androidx.core.net.toUri
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.data.local.dto.BookEntity
|
import ua.acclorite.book_story.data.local.dto.BookEntity
|
||||||
import ua.acclorite.book_story.domain.library.book.Book
|
import ua.acclorite.book_story.domain.library.book.Book
|
||||||
|
|
@ -43,7 +43,7 @@ class BookMapperImpl @Inject constructor() : BookMapper {
|
||||||
filePath = bookEntity.filePath,
|
filePath = bookEntity.filePath,
|
||||||
lastOpened = null,
|
lastOpened = null,
|
||||||
category = bookEntity.category,
|
category = bookEntity.category,
|
||||||
coverImage = if (bookEntity.image != null) Uri.parse(bookEntity.image) else null
|
coverImage = if (bookEntity.image != null) bookEntity.image.toUri() else null
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -42,7 +42,7 @@ class DocumentParser @Inject constructor(
|
||||||
var chapterAdded = false
|
var chapterAdded = false
|
||||||
|
|
||||||
document.selectFirst("body")
|
document.selectFirst("body")
|
||||||
.run { if (this == null) document.body() else this }
|
.run { this ?: document.body() }
|
||||||
.apply {
|
.apply {
|
||||||
// Remove manual line breaks from all <p>, <a>
|
// Remove manual line breaks from all <p>, <a>
|
||||||
select("p").forEach { element ->
|
select("p").forEach { element ->
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.data.parser.epub
|
package ua.acclorite.book_story.data.parser.epub
|
||||||
|
|
||||||
import android.net.Uri
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import androidx.core.net.toUri
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
import kotlinx.coroutines.async
|
import kotlinx.coroutines.async
|
||||||
|
|
@ -21,7 +21,6 @@ import ua.acclorite.book_story.data.parser.DocumentParser
|
||||||
import ua.acclorite.book_story.data.parser.TextParser
|
import ua.acclorite.book_story.data.parser.TextParser
|
||||||
import ua.acclorite.book_story.domain.file.CachedFile
|
import ua.acclorite.book_story.domain.file.CachedFile
|
||||||
import ua.acclorite.book_story.domain.reader.ReaderText
|
import ua.acclorite.book_story.domain.reader.ReaderText
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideImageExtensions
|
import ua.acclorite.book_story.presentation.core.constants.provideImageExtensions
|
||||||
import ua.acclorite.book_story.presentation.core.util.addAll
|
import ua.acclorite.book_story.presentation.core.util.addAll
|
||||||
import ua.acclorite.book_story.presentation.core.util.containsVisibleText
|
import ua.acclorite.book_story.presentation.core.util.containsVisibleText
|
||||||
|
|
@ -62,7 +61,7 @@ class EpubTextParser @Inject constructor(
|
||||||
|
|
||||||
val chapterEntries = zip.getChapterEntries(opfEntry)
|
val chapterEntries = zip.getChapterEntries(opfEntry)
|
||||||
val imageEntries = zip.entries().toList().filter {
|
val imageEntries = zip.entries().toList().filter {
|
||||||
Constants.provideImageExtensions().any { format ->
|
provideImageExtensions().any { format ->
|
||||||
it.name.endsWith(format, ignoreCase = true)
|
it.name.endsWith(format, ignoreCase = true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -108,7 +107,6 @@ class EpubTextParser @Inject constructor(
|
||||||
*
|
*
|
||||||
* @return Null if could not parse.
|
* @return Null if could not parse.
|
||||||
*/
|
*/
|
||||||
@OptIn(ExperimentalCoroutinesApi::class)
|
|
||||||
private suspend fun ZipFile.parseEpub(
|
private suspend fun ZipFile.parseEpub(
|
||||||
chapterEntries: List<ZipEntry>,
|
chapterEntries: List<ZipEntry>,
|
||||||
imageEntries: List<ZipEntry>,
|
imageEntries: List<ZipEntry>,
|
||||||
|
|
@ -166,7 +164,9 @@ class EpubTextParser @Inject constructor(
|
||||||
chapterTitleMap: Map<Source, ReaderText.Chapter>?
|
chapterTitleMap: Map<Source, ReaderText.Chapter>?
|
||||||
) {
|
) {
|
||||||
// Getting all text
|
// Getting all text
|
||||||
val content = zip.getInputStream(entry).bufferedReader().use { it.readText() }
|
val content = withContext(Dispatchers.IO) {
|
||||||
|
zip.getInputStream(entry)
|
||||||
|
}.bufferedReader().use { it.readText() }
|
||||||
var readerText = documentParser.parseDocument(
|
var readerText = documentParser.parseDocument(
|
||||||
document = Jsoup.parse(content),
|
document = Jsoup.parse(content),
|
||||||
zipFile = zip,
|
zipFile = zip,
|
||||||
|
|
@ -227,7 +227,7 @@ class EpubTextParser @Inject constructor(
|
||||||
val tocDocument = tocContent?.let { Jsoup.parse(it) }
|
val tocDocument = tocContent?.let { Jsoup.parse(it) }
|
||||||
|
|
||||||
if (tocDocument == null) return null
|
if (tocDocument == null) return null
|
||||||
var titleMap = mutableMapOf<Source, ReaderText.Chapter>()
|
val titleMap = mutableMapOf<Source, ReaderText.Chapter>()
|
||||||
|
|
||||||
tocDocument.select("navPoint").forEach { navPoint ->
|
tocDocument.select("navPoint").forEach { navPoint ->
|
||||||
val title = navPoint.selectFirst("navLabel > text")?.text()
|
val title = navPoint.selectFirst("navLabel > text")?.text()
|
||||||
|
|
@ -239,7 +239,7 @@ class EpubTextParser @Inject constructor(
|
||||||
val source = navPoint.selectFirst("content")?.attr("src")?.trim()
|
val source = navPoint.selectFirst("content")?.attr("src")?.trim()
|
||||||
.let { source ->
|
.let { source ->
|
||||||
if (source.isNullOrBlank()) return@forEach
|
if (source.isNullOrBlank()) return@forEach
|
||||||
Uri.parse(source).path ?: source
|
source.toUri().path ?: source
|
||||||
}.substringAfterLast(File.separator)
|
}.substringAfterLast(File.separator)
|
||||||
|
|
||||||
val parent = navPoint.parent()
|
val parent = navPoint.parent()
|
||||||
|
|
@ -250,7 +250,7 @@ class EpubTextParser @Inject constructor(
|
||||||
val parentSource = parent.selectFirst("content")?.attr("src")?.trim()
|
val parentSource = parent.selectFirst("content")?.attr("src")?.trim()
|
||||||
.let { parentSource ->
|
.let { parentSource ->
|
||||||
if (parentSource.isNullOrBlank()) return@forEach
|
if (parentSource.isNullOrBlank()) return@forEach
|
||||||
Uri.parse(parentSource).path ?: parentSource
|
parentSource.toUri().path ?: parentSource
|
||||||
}.substringAfterLast(File.separator)
|
}.substringAfterLast(File.separator)
|
||||||
if (parentSource == source) return@let null
|
if (parentSource == source) return@let null
|
||||||
return@let parentSource
|
return@let parentSource
|
||||||
|
|
@ -294,11 +294,7 @@ class EpubTextParser @Inject constructor(
|
||||||
* @return List of chapter entries in correct order (do not reorder).
|
* @return List of chapter entries in correct order (do not reorder).
|
||||||
*/
|
*/
|
||||||
private fun ZipFile.getChapterEntries(opfEntry: ZipEntry?): List<ZipEntry> {
|
private fun ZipFile.getChapterEntries(opfEntry: ZipEntry?): List<ZipEntry> {
|
||||||
opfEntry.let { opfEntry ->
|
opfEntry?.let {
|
||||||
if (opfEntry == null) {
|
|
||||||
return@let
|
|
||||||
}
|
|
||||||
|
|
||||||
val opfContent = getInputStream(opfEntry).bufferedReader().use {
|
val opfContent = getInputStream(opfEntry).bufferedReader().use {
|
||||||
it.readText()
|
it.readText()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import android.graphics.BitmapFactory
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.provider.MediaStore
|
import android.provider.MediaStore
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import androidx.core.net.toUri
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import ua.acclorite.book_story.data.local.room.BookDao
|
import ua.acclorite.book_story.data.local.room.BookDao
|
||||||
|
|
@ -191,7 +192,7 @@ class BookRepositoryImpl @Inject constructor(
|
||||||
listOf(
|
listOf(
|
||||||
bookMapper.toBookEntity(
|
bookMapper.toBookEntity(
|
||||||
book.copy(
|
book.copy(
|
||||||
coverImage = if (entity.image != null) Uri.parse(entity.image) else null
|
coverImage = if (entity.image != null) entity.image.toUri() else null
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -357,7 +358,7 @@ class BookRepositoryImpl @Inject constructor(
|
||||||
val currentCover = try {
|
val currentCover = try {
|
||||||
MediaStore.Images.Media.getBitmap(
|
MediaStore.Images.Media.getBitmap(
|
||||||
application.contentResolver,
|
application.contentResolver,
|
||||||
Uri.parse(book.image)
|
book.image.toUri()
|
||||||
)
|
)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.i(CAN_RESET_COVER, "Can reset cover image. (could not get current)")
|
Log.i(CAN_RESET_COVER, "Can reset cover image. (could not get current)")
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ import ua.acclorite.book_story.domain.library.book.NullableBook.NotNull
|
||||||
import ua.acclorite.book_story.domain.library.book.NullableBook.Null
|
import ua.acclorite.book_story.domain.library.book.NullableBook.Null
|
||||||
import ua.acclorite.book_story.domain.repository.FileSystemRepository
|
import ua.acclorite.book_story.domain.repository.FileSystemRepository
|
||||||
import ua.acclorite.book_story.domain.ui.UIText
|
import ua.acclorite.book_story.domain.ui.UIText
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideExtensions
|
import ua.acclorite.book_story.presentation.core.constants.provideExtensions
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
@ -49,7 +48,7 @@ class FileSystemRepositoryImpl @Inject constructor(
|
||||||
val existingPaths = database
|
val existingPaths = database
|
||||||
.searchBooks("")
|
.searchBooks("")
|
||||||
.map { it.filePath }
|
.map { it.filePath }
|
||||||
val supportedExtensions = Constants.provideExtensions()
|
val supportedExtensions = provideExtensions()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify that [CachedFile] is valid and can be shown correctly.
|
* Verify that [CachedFile] is valid and can be shown correctly.
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ import java.util.UUID
|
||||||
* Faster than [androidx.documentfile.provider.DocumentFile].
|
* Faster than [androidx.documentfile.provider.DocumentFile].
|
||||||
* Saves all it's variables after initialized.
|
* Saves all it's variables after initialized.
|
||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused", "MemberVisibilityCanBePrivate")
|
||||||
@Immutable
|
@Immutable
|
||||||
class CachedFile(
|
class CachedFile(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ object CachedFileCompat {
|
||||||
): CachedFile? {
|
): CachedFile? {
|
||||||
val uri = try {
|
val uri = try {
|
||||||
val fullPathUri = DocumentFileCompat.fromFullPath(context, path)?.uri
|
val fullPathUri = DocumentFileCompat.fromFullPath(context, path)?.uri
|
||||||
if (fullPathUri == null) throw NullPointerException("Could not get URI from full path.")
|
?: throw NullPointerException("Could not get URI from full path.")
|
||||||
|
|
||||||
fullPathUri
|
fullPathUri
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
|
@ -49,7 +49,7 @@ object CachedFileCompat {
|
||||||
context = context,
|
context = context,
|
||||||
fullPath = path
|
fullPath = path
|
||||||
)?.uri
|
)?.uri
|
||||||
if (parentUri == null) throw NullPointerException("Could not get parent URI.")
|
?: throw NullPointerException("Could not get parent URI.")
|
||||||
|
|
||||||
val storageId = DocumentFileCompat.getStorageId(context, path)
|
val storageId = DocumentFileCompat.getStorageId(context, path)
|
||||||
if (storageId.isBlank()) throw NullPointerException("Could not get storageId.")
|
if (storageId.isBlank()) throw NullPointerException("Could not get storageId.")
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ class Navigator @AssistedInject constructor(
|
||||||
@Assisted private val initialScreen: Screen
|
@Assisted private val initialScreen: Screen
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
val items = savedStateHandle.getStateFlow("items", mutableListOf<Screen>(initialScreen))
|
val items = savedStateHandle.getStateFlow("items", mutableListOf(initialScreen))
|
||||||
private fun StateFlow<MutableList<Screen>>.removeLast() {
|
private fun StateFlow<MutableList<Screen>>.removeLast() {
|
||||||
savedStateHandle["items"] = value.dropLast(1)
|
savedStateHandle["items"] = value.dropLast(1)
|
||||||
}
|
}
|
||||||
|
|
@ -42,7 +42,7 @@ class Navigator @AssistedInject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
val lastEvent = savedStateHandle.getStateFlow("stack_event", StackEvent.Default)
|
val lastEvent = savedStateHandle.getStateFlow("stack_event", StackEvent.Default)
|
||||||
private fun StateFlow<StackEvent>.change(stackEvent: StackEvent) {
|
private fun changeStackEvent(stackEvent: StackEvent) {
|
||||||
savedStateHandle["stack_event"] = stackEvent
|
savedStateHandle["stack_event"] = stackEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -55,7 +55,7 @@ class Navigator @AssistedInject constructor(
|
||||||
if (lastItem.value::class == targetScreen::class) return
|
if (lastItem.value::class == targetScreen::class) return
|
||||||
if (!saveInBackStack) items.removeLast()
|
if (!saveInBackStack) items.removeLast()
|
||||||
|
|
||||||
lastEvent.change(
|
changeStackEvent(
|
||||||
if (popping) StackEvent.Pop
|
if (popping) StackEvent.Pop
|
||||||
else StackEvent.Default
|
else StackEvent.Default
|
||||||
)
|
)
|
||||||
|
|
@ -66,7 +66,7 @@ class Navigator @AssistedInject constructor(
|
||||||
|
|
||||||
fun pop(popping: Boolean = true) {
|
fun pop(popping: Boolean = true) {
|
||||||
if (items.value.count() > 1) {
|
if (items.value.count() > 1) {
|
||||||
lastEvent.change(
|
changeStackEvent(
|
||||||
if (popping) StackEvent.Pop
|
if (popping) StackEvent.Pop
|
||||||
else StackEvent.Default
|
else StackEvent.Default
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideAboutBadges
|
import ua.acclorite.book_story.presentation.core.constants.provideAboutBadges
|
||||||
import ua.acclorite.book_story.presentation.core.util.showToast
|
import ua.acclorite.book_story.presentation.core.util.showToast
|
||||||
import ua.acclorite.book_story.ui.about.AboutEvent
|
import ua.acclorite.book_story.ui.about.AboutEvent
|
||||||
|
|
@ -39,7 +38,7 @@ fun AboutBadges(
|
||||||
horizontalArrangement = Arrangement.spacedBy(13.dp)
|
horizontalArrangement = Arrangement.spacedBy(13.dp)
|
||||||
) {
|
) {
|
||||||
items(
|
items(
|
||||||
Constants.provideAboutBadges(),
|
provideAboutBadges(),
|
||||||
key = { it.id }
|
key = { it.id }
|
||||||
) { badge ->
|
) { badge ->
|
||||||
AboutBadgeItem(badge = badge) {
|
AboutBadgeItem(badge = badge) {
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@ import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
||||||
import androidx.compose.material3.HorizontalDivider
|
import androidx.compose.material3.HorizontalDivider
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
|
@ -28,7 +27,6 @@ import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideContributorsPage
|
import ua.acclorite.book_story.presentation.core.constants.provideContributorsPage
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideIssuesPage
|
import ua.acclorite.book_story.presentation.core.constants.provideIssuesPage
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideReleasesPage
|
import ua.acclorite.book_story.presentation.core.constants.provideReleasesPage
|
||||||
|
|
@ -36,7 +34,6 @@ import ua.acclorite.book_story.presentation.core.constants.provideSupportPage
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideTranslationPage
|
import ua.acclorite.book_story.presentation.core.constants.provideTranslationPage
|
||||||
import ua.acclorite.book_story.ui.about.AboutEvent
|
import ua.acclorite.book_story.ui.about.AboutEvent
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AboutLayout(
|
fun AboutLayout(
|
||||||
paddingValues: PaddingValues,
|
paddingValues: PaddingValues,
|
||||||
|
|
@ -88,7 +85,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = Constants.provideReleasesPage(),
|
page = provideReleasesPage(),
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -102,7 +99,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = Constants.provideIssuesPage(),
|
page = provideIssuesPage(),
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -117,7 +114,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = Constants.provideContributorsPage(),
|
page = provideContributorsPage(),
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -149,7 +146,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = Constants.provideTranslationPage(),
|
page = provideTranslationPage(),
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -163,7 +160,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = Constants.provideSupportPage(),
|
page = provideSupportPage(),
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -7,14 +7,12 @@
|
||||||
package ua.acclorite.book_story.presentation.book_info
|
package ua.acclorite.book_story.presentation.book_info
|
||||||
|
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import androidx.compose.material.ExperimentalMaterialApi
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import ua.acclorite.book_story.domain.library.book.Book
|
import ua.acclorite.book_story.domain.library.book.Book
|
||||||
import ua.acclorite.book_story.domain.util.BottomSheet
|
import ua.acclorite.book_story.domain.util.BottomSheet
|
||||||
import ua.acclorite.book_story.domain.util.Dialog
|
import ua.acclorite.book_story.domain.util.Dialog
|
||||||
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterialApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookInfoContent(
|
fun BookInfoContent(
|
||||||
book: Book,
|
book: Book,
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import ua.acclorite.book_story.domain.file.CachedFileCompat
|
||||||
import ua.acclorite.book_story.domain.library.book.Book
|
import ua.acclorite.book_story.domain.library.book.Book
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.components.modal_bottom_sheet.ModalBottomSheet
|
import ua.acclorite.book_story.presentation.core.components.modal_bottom_sheet.ModalBottomSheet
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideExtensions
|
import ua.acclorite.book_story.presentation.core.constants.provideExtensions
|
||||||
import ua.acclorite.book_story.presentation.settings.components.SettingsSubcategoryTitle
|
import ua.acclorite.book_story.presentation.settings.components.SettingsSubcategoryTitle
|
||||||
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
||||||
|
|
@ -61,7 +60,7 @@ fun BookInfoDetailsBottomSheet(
|
||||||
|
|
||||||
val fileExists = remember(cachedFile) {
|
val fileExists = remember(cachedFile) {
|
||||||
cachedFile.let {
|
cachedFile.let {
|
||||||
it != null && it.canAccess() && !it.isDirectory && Constants.provideExtensions()
|
it != null && it.canAccess() && !it.isDirectory && provideExtensions()
|
||||||
.any { ext ->
|
.any { ext ->
|
||||||
it.name.endsWith(ext, ignoreCase = true)
|
it.name.endsWith(ext, ignoreCase = true)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.domain.library.book.Book
|
import ua.acclorite.book_story.domain.library.book.Book
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
||||||
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
||||||
|
|
||||||
|
|
@ -39,7 +38,7 @@ fun BookInfoLayout(
|
||||||
LazyColumnWithScrollbar(
|
LazyColumnWithScrollbar(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
state = listState,
|
state = listState,
|
||||||
scrollbarSettings = Constants.providePrimaryScrollbar(false),
|
scrollbarSettings = providePrimaryScrollbar(false),
|
||||||
contentPadding = PaddingValues(bottom = 18.dp)
|
contentPadding = PaddingValues(bottom = 18.dp)
|
||||||
) {
|
) {
|
||||||
item {
|
item {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
|
@ -19,7 +18,6 @@ import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.domain.library.book.Book
|
import ua.acclorite.book_story.domain.library.book.Book
|
||||||
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookInfoLayoutInfo(
|
fun BookInfoLayoutInfo(
|
||||||
book: Book,
|
book: Book,
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.imePadding
|
||||||
import androidx.compose.foundation.layout.navigationBars
|
import androidx.compose.foundation.layout.navigationBars
|
||||||
import androidx.compose.foundation.layout.windowInsetsPadding
|
import androidx.compose.foundation.layout.windowInsetsPadding
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import androidx.compose.material.ExperimentalMaterialApi
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
|
@ -20,7 +19,6 @@ import androidx.compose.ui.Modifier
|
||||||
import ua.acclorite.book_story.domain.library.book.Book
|
import ua.acclorite.book_story.domain.library.book.Book
|
||||||
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
import ua.acclorite.book_story.ui.book_info.BookInfoEvent
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterialApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookInfoScaffold(
|
fun BookInfoScaffold(
|
||||||
book: Book,
|
book: Book,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.presentation.browse
|
package ua.acclorite.book_story.presentation.browse
|
||||||
|
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.combinedClickable
|
import androidx.compose.foundation.combinedClickable
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
|
|
@ -21,7 +20,6 @@ import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.domain.browse.file.SelectableFile
|
import ua.acclorite.book_story.domain.browse.file.SelectableFile
|
||||||
|
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BrowseGridItem(
|
fun BrowseGridItem(
|
||||||
modifier: Modifier,
|
modifier: Modifier,
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ import ua.acclorite.book_story.domain.browse.file.GroupedFiles
|
||||||
import ua.acclorite.book_story.domain.browse.file.SelectableFile
|
import ua.acclorite.book_story.domain.browse.file.SelectableFile
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyVerticalGridWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyVerticalGridWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.header
|
import ua.acclorite.book_story.presentation.core.components.common.header
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -39,7 +38,7 @@ fun BrowseGridLayout(
|
||||||
state = gridState,
|
state = gridState,
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
contentPadding = PaddingValues(horizontal = 8.dp),
|
contentPadding = PaddingValues(horizontal = 8.dp),
|
||||||
scrollbarSettings = Constants.providePrimaryScrollbar(false)
|
scrollbarSettings = providePrimaryScrollbar(false)
|
||||||
) {
|
) {
|
||||||
groupedFiles.forEach { group ->
|
groupedFiles.forEach { group ->
|
||||||
stickyHeader {
|
stickyHeader {
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.presentation.browse
|
package ua.acclorite.book_story.presentation.browse
|
||||||
|
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.combinedClickable
|
import androidx.compose.foundation.combinedClickable
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
|
|
@ -26,7 +25,6 @@ import ua.acclorite.book_story.domain.browse.file.SelectableFile
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.CircularCheckbox
|
import ua.acclorite.book_story.presentation.core.components.common.CircularCheckbox
|
||||||
import ua.acclorite.book_story.ui.theme.FadeTransitionPreservingSpace
|
import ua.acclorite.book_story.ui.theme.FadeTransitionPreservingSpace
|
||||||
|
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BrowseListItem(
|
fun BrowseListItem(
|
||||||
modifier: Modifier,
|
modifier: Modifier,
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.domain.browse.file.GroupedFiles
|
import ua.acclorite.book_story.domain.browse.file.GroupedFiles
|
||||||
import ua.acclorite.book_story.domain.browse.file.SelectableFile
|
import ua.acclorite.book_story.domain.browse.file.SelectableFile
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -33,7 +32,7 @@ fun BrowseListLayout(
|
||||||
state = listState,
|
state = listState,
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
contentPadding = PaddingValues(horizontal = 8.dp),
|
contentPadding = PaddingValues(horizontal = 8.dp),
|
||||||
scrollbarSettings = Constants.providePrimaryScrollbar(false)
|
scrollbarSettings = providePrimaryScrollbar(false)
|
||||||
) {
|
) {
|
||||||
groupedFiles.forEach { group ->
|
groupedFiles.forEach { group ->
|
||||||
stickyHeader {
|
stickyHeader {
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import my.nanihadesuka.compose.InternalLazyColumnScrollbar
|
import my.nanihadesuka.compose.InternalLazyColumnScrollbar
|
||||||
import my.nanihadesuka.compose.ScrollbarSettings
|
import my.nanihadesuka.compose.ScrollbarSettings
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideSecondaryScrollbar
|
import ua.acclorite.book_story.presentation.core.constants.provideSecondaryScrollbar
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -28,7 +27,7 @@ fun LazyColumnWithScrollbar(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
parentModifier: Modifier = Modifier,
|
parentModifier: Modifier = Modifier,
|
||||||
state: LazyListState = rememberLazyListState(),
|
state: LazyListState = rememberLazyListState(),
|
||||||
scrollbarSettings: ScrollbarSettings = Constants.provideSecondaryScrollbar(),
|
scrollbarSettings: ScrollbarSettings = provideSecondaryScrollbar(),
|
||||||
enableScrollbar: Boolean = true,
|
enableScrollbar: Boolean = true,
|
||||||
contentPadding: PaddingValues = PaddingValues(0.dp),
|
contentPadding: PaddingValues = PaddingValues(0.dp),
|
||||||
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import my.nanihadesuka.compose.InternalLazyVerticalGridScrollbar
|
import my.nanihadesuka.compose.InternalLazyVerticalGridScrollbar
|
||||||
import my.nanihadesuka.compose.ScrollbarSettings
|
import my.nanihadesuka.compose.ScrollbarSettings
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideSecondaryScrollbar
|
import ua.acclorite.book_story.presentation.core.constants.provideSecondaryScrollbar
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -29,7 +28,7 @@ fun LazyVerticalGridWithScrollbar(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
columns: GridCells,
|
columns: GridCells,
|
||||||
state: LazyGridState = rememberLazyGridState(),
|
state: LazyGridState = rememberLazyGridState(),
|
||||||
scrollbarSettings: ScrollbarSettings = Constants.provideSecondaryScrollbar(),
|
scrollbarSettings: ScrollbarSettings = provideSecondaryScrollbar(),
|
||||||
enableScrollbar: Boolean = true,
|
enableScrollbar: Boolean = true,
|
||||||
contentPadding: PaddingValues = PaddingValues(0.dp),
|
contentPadding: PaddingValues = PaddingValues(0.dp),
|
||||||
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,6 @@ import androidx.compose.ui.unit.LayoutDirection
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility
|
import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.util.noRippleClickable
|
import ua.acclorite.book_story.presentation.core.util.noRippleClickable
|
||||||
|
|
||||||
|
|
@ -146,7 +145,7 @@ fun ModalDrawer(
|
||||||
LazyColumnWithScrollbar(
|
LazyColumnWithScrollbar(
|
||||||
state = rememberLazyListState(startIndex),
|
state = rememberLazyListState(startIndex),
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
scrollbarSettings = Constants.providePrimaryScrollbar(),
|
scrollbarSettings = providePrimaryScrollbar(),
|
||||||
contentPadding = PaddingValues(vertical = 9.dp)
|
contentPadding = PaddingValues(vertical = 9.dp)
|
||||||
) {
|
) {
|
||||||
content()
|
content()
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ package ua.acclorite.book_story.presentation.core.components.settings
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
|
||||||
import androidx.compose.foundation.layout.FlowRow
|
import androidx.compose.foundation.layout.FlowRow
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
|
@ -26,7 +25,6 @@ import ua.acclorite.book_story.presentation.settings.components.SettingsSubcateg
|
||||||
/**
|
/**
|
||||||
* Chips with title. Use list of [ButtonItem]s to display chips.
|
* Chips with title. Use list of [ButtonItem]s to display chips.
|
||||||
*/
|
*/
|
||||||
@OptIn(ExperimentalLayoutApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ChipsWithTitle(
|
fun ChipsWithTitle(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ package ua.acclorite.book_story.presentation.core.constants
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.about.Badge
|
import ua.acclorite.book_story.domain.about.Badge
|
||||||
|
|
||||||
fun Constants.provideAboutBadges() = listOf(
|
fun provideAboutBadges() = listOf(
|
||||||
Badge(
|
Badge(
|
||||||
id = "github",
|
id = "github",
|
||||||
drawable = R.drawable.github,
|
drawable = R.drawable.github,
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,10 @@ import ua.acclorite.book_story.domain.reader.ColorPreset
|
||||||
import ua.acclorite.book_story.domain.ui.UIText
|
import ua.acclorite.book_story.domain.ui.UIText
|
||||||
|
|
||||||
// Main State
|
// Main State
|
||||||
fun Constants.provideMainState() = "main_state"
|
fun provideMainState() = "main_state"
|
||||||
|
|
||||||
// Empty Book
|
// Empty Book
|
||||||
fun Constants.provideEmptyBook() = Book(
|
fun provideEmptyBook() = Book(
|
||||||
id = -1,
|
id = -1,
|
||||||
title = "",
|
title = "",
|
||||||
author = UIText.StringValue(""),
|
author = UIText.StringValue(""),
|
||||||
|
|
@ -33,7 +33,7 @@ fun Constants.provideEmptyBook() = Book(
|
||||||
)
|
)
|
||||||
|
|
||||||
// Default Color Preset
|
// Default Color Preset
|
||||||
fun Constants.provideDefaultColorPreset() = ColorPreset(
|
fun provideDefaultColorPreset() = ColorPreset(
|
||||||
id = -1,
|
id = -1,
|
||||||
name = null,
|
name = null,
|
||||||
backgroundColor = Color(0xFFFAF8FF), // Blue Light Surface (hardcoded)
|
backgroundColor = Color(0xFFFAF8FF), // Blue Light Surface (hardcoded)
|
||||||
|
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
/*
|
|
||||||
* Book's Story — free and open-source Material You eBook reader.
|
|
||||||
* Copyright (C) 2024-2025 Acclorite
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
package ua.acclorite.book_story.presentation.core.constants
|
|
||||||
|
|
||||||
object Constants
|
|
||||||
|
|
@ -10,7 +10,7 @@ import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.about.Credit
|
import ua.acclorite.book_story.domain.about.Credit
|
||||||
import ua.acclorite.book_story.domain.ui.UIText
|
import ua.acclorite.book_story.domain.ui.UIText
|
||||||
|
|
||||||
fun Constants.provideCredits() = listOf(
|
fun provideCredits() = listOf(
|
||||||
Credit(
|
Credit(
|
||||||
name = "Tachiyomi (Mihon)",
|
name = "Tachiyomi (Mihon)",
|
||||||
source = "GitHub",
|
source = "GitHub",
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,7 @@ import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.reader.FontWithName
|
import ua.acclorite.book_story.domain.reader.FontWithName
|
||||||
import ua.acclorite.book_story.domain.ui.UIText
|
import ua.acclorite.book_story.domain.ui.UIText
|
||||||
|
|
||||||
@OptIn(ExperimentalTextApi::class)
|
fun provideFonts(): List<FontWithName> {
|
||||||
fun Constants.provideFonts(): List<FontWithName> {
|
|
||||||
return mutableListOf(
|
return mutableListOf(
|
||||||
FontWithName(
|
FontWithName(
|
||||||
"default",
|
"default",
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.help.HelpTip
|
import ua.acclorite.book_story.domain.help.HelpTip
|
||||||
import ua.acclorite.book_story.presentation.help.HelpAnnotation
|
import ua.acclorite.book_story.presentation.help.HelpAnnotation
|
||||||
|
|
||||||
fun Constants.provideHelpTips() = listOf(
|
fun provideHelpTips() = listOf(
|
||||||
HelpTip(
|
HelpTip(
|
||||||
title = R.string.help_title_how_to_add_books,
|
title = R.string.help_title_how_to_add_books,
|
||||||
description = {
|
description = {
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.presentation.core.constants
|
package ua.acclorite.book_story.presentation.core.constants
|
||||||
|
|
||||||
fun Constants.provideLanguages() = listOf(
|
fun provideLanguages() = listOf(
|
||||||
Pair("en", "English"),
|
Pair("en", "English"),
|
||||||
Pair("uk", "Українська"),
|
Pair("uk", "Українська"),
|
||||||
Pair("de", "Deutsch"),
|
Pair("de", "Deutsch"),
|
||||||
|
|
|
||||||
|
|
@ -8,17 +8,17 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.presentation.core.constants
|
package ua.acclorite.book_story.presentation.core.constants
|
||||||
|
|
||||||
fun Constants.provideReleasesPage() =
|
fun provideReleasesPage() =
|
||||||
"https://www.github.com/Acclorite/book-story/releases/latest"
|
"https://www.github.com/Acclorite/book-story/releases/latest"
|
||||||
|
|
||||||
fun Constants.provideIssuesPage() =
|
fun provideIssuesPage() =
|
||||||
"https://www.github.com/Acclorite/book-story/issues"
|
"https://www.github.com/Acclorite/book-story/issues"
|
||||||
|
|
||||||
fun Constants.provideContributorsPage() =
|
fun provideContributorsPage() =
|
||||||
"https://github.com/Acclorite/book-story/graphs/contributors"
|
"https://github.com/Acclorite/book-story/graphs/contributors"
|
||||||
|
|
||||||
fun Constants.provideTranslationPage() =
|
fun provideTranslationPage() =
|
||||||
"https://hosted.weblate.org/projects/book-story"
|
"https://hosted.weblate.org/projects/book-story"
|
||||||
|
|
||||||
fun Constants.provideSupportPage() =
|
fun provideSupportPage() =
|
||||||
"https://patreon.com/Acclorite"
|
"https://patreon.com/Acclorite"
|
||||||
|
|
@ -14,7 +14,7 @@ import my.nanihadesuka.compose.ScrollbarSelectionMode
|
||||||
import my.nanihadesuka.compose.ScrollbarSettings
|
import my.nanihadesuka.compose.ScrollbarSettings
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun Constants.providePrimaryScrollbar(canSelect: Boolean = true) = ScrollbarSettings(
|
fun providePrimaryScrollbar(canSelect: Boolean = true) = ScrollbarSettings(
|
||||||
thumbUnselectedColor = MaterialTheme.colorScheme.secondary,
|
thumbUnselectedColor = MaterialTheme.colorScheme.secondary,
|
||||||
thumbSelectedColor = MaterialTheme.colorScheme.secondary.copy(0.8f),
|
thumbSelectedColor = MaterialTheme.colorScheme.secondary.copy(0.8f),
|
||||||
hideDelayMillis = 2000,
|
hideDelayMillis = 2000,
|
||||||
|
|
@ -25,7 +25,7 @@ fun Constants.providePrimaryScrollbar(canSelect: Boolean = true) = ScrollbarSett
|
||||||
)
|
)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun Constants.provideSecondaryScrollbar() = ScrollbarSettings(
|
fun provideSecondaryScrollbar() = ScrollbarSettings(
|
||||||
thumbUnselectedColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(0.5f),
|
thumbUnselectedColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(0.5f),
|
||||||
hideDelayMillis = 500,
|
hideDelayMillis = 500,
|
||||||
durationAnimationMillis = 200,
|
durationAnimationMillis = 200,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.presentation.core.constants
|
package ua.acclorite.book_story.presentation.core.constants
|
||||||
|
|
||||||
fun Constants.provideExtensions() = listOf(
|
fun provideExtensions() = listOf(
|
||||||
".epub",
|
".epub",
|
||||||
".pdf",
|
".pdf",
|
||||||
".fb2",
|
".fb2",
|
||||||
|
|
@ -16,7 +16,7 @@ fun Constants.provideExtensions() = listOf(
|
||||||
".md"
|
".md"
|
||||||
)
|
)
|
||||||
|
|
||||||
fun Constants.provideImageExtensions() = listOf(
|
fun provideImageExtensions() = listOf(
|
||||||
".png",
|
".png",
|
||||||
".jpg",
|
".jpg",
|
||||||
".jpeg",
|
".jpeg",
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,9 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.presentation.core.util
|
package ua.acclorite.book_story.presentation.core.util
|
||||||
|
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
|
||||||
import androidx.compose.foundation.combinedClickable
|
import androidx.compose.foundation.combinedClickable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
|
||||||
fun Modifier.noRippleClickable(
|
fun Modifier.noRippleClickable(
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
onLongClick: (() -> Unit)? = null,
|
onLongClick: (() -> Unit)? = null,
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
|
||||||
import androidx.compose.foundation.layout.FlowRow
|
import androidx.compose.foundation.layout.FlowRow
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
|
@ -26,7 +25,6 @@ import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.domain.about.Credit
|
import ua.acclorite.book_story.domain.about.Credit
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.StyledText
|
import ua.acclorite.book_story.presentation.core.components.common.StyledText
|
||||||
|
|
||||||
@OptIn(ExperimentalLayoutApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun CreditItem(
|
fun CreditItem(
|
||||||
credit: Credit,
|
credit: Credit,
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideCredits
|
import ua.acclorite.book_story.presentation.core.constants.provideCredits
|
||||||
import ua.acclorite.book_story.ui.about.AboutEvent
|
import ua.acclorite.book_story.ui.about.AboutEvent
|
||||||
|
|
||||||
|
|
@ -33,7 +32,7 @@ fun CreditsLayout(
|
||||||
state = listState
|
state = listState
|
||||||
) {
|
) {
|
||||||
items(
|
items(
|
||||||
Constants.provideCredits(),
|
provideCredits(),
|
||||||
key = { it.name }
|
key = { it.name }
|
||||||
) { credit ->
|
) { credit ->
|
||||||
CreditItem(credit = credit) {
|
CreditItem(credit = credit) {
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.domain.util.Position
|
import ua.acclorite.book_story.domain.util.Position
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideHelpTips
|
import ua.acclorite.book_story.presentation.core.constants.provideHelpTips
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -32,14 +31,14 @@ fun HelpLayout(
|
||||||
contentPadding = PaddingValues(vertical = 16.dp)
|
contentPadding = PaddingValues(vertical = 16.dp)
|
||||||
) {
|
) {
|
||||||
itemsIndexed(
|
itemsIndexed(
|
||||||
Constants.provideHelpTips(),
|
provideHelpTips(),
|
||||||
key = { _, helpTip -> helpTip.title }
|
key = { _, helpTip -> helpTip.title }
|
||||||
) { index, helpTip ->
|
) { index, helpTip ->
|
||||||
HelpItem(
|
HelpItem(
|
||||||
helpTip = helpTip,
|
helpTip = helpTip,
|
||||||
position = when (index) {
|
position = when (index) {
|
||||||
0 -> Position.TOP
|
0 -> Position.TOP
|
||||||
Constants.provideHelpTips().lastIndex -> Position.BOTTOM
|
provideHelpTips().lastIndex -> Position.BOTTOM
|
||||||
else -> Position.CENTER
|
else -> Position.CENTER
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.history.GroupedHistory
|
import ua.acclorite.book_story.domain.history.GroupedHistory
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.util.LocalActivity
|
import ua.acclorite.book_story.presentation.core.util.LocalActivity
|
||||||
import ua.acclorite.book_story.presentation.settings.components.SettingsSubcategoryTitle
|
import ua.acclorite.book_story.presentation.settings.components.SettingsSubcategoryTitle
|
||||||
|
|
@ -43,7 +42,7 @@ fun HistoryLayout(
|
||||||
LazyColumnWithScrollbar(
|
LazyColumnWithScrollbar(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
state = listState,
|
state = listState,
|
||||||
scrollbarSettings = Constants.providePrimaryScrollbar(false)
|
scrollbarSettings = providePrimaryScrollbar(false)
|
||||||
) {
|
) {
|
||||||
item {
|
item {
|
||||||
Spacer(modifier = Modifier.height(12.dp))
|
Spacer(modifier = Modifier.height(12.dp))
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.presentation.library
|
package ua.acclorite.book_story.presentation.library
|
||||||
|
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.combinedClickable
|
import androidx.compose.foundation.combinedClickable
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
|
|
@ -41,7 +40,6 @@ import ua.acclorite.book_story.presentation.core.components.common.AsyncCoverIma
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.StyledText
|
import ua.acclorite.book_story.presentation.core.components.common.StyledText
|
||||||
import ua.acclorite.book_story.presentation.core.util.calculateProgress
|
import ua.acclorite.book_story.presentation.core.util.calculateProgress
|
||||||
|
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun LazyGridItemScope.LibraryItem(
|
fun LazyGridItemScope.LibraryItem(
|
||||||
book: SelectableBook,
|
book: SelectableBook,
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.LazyVerticalGridWithScrollbar
|
import ua.acclorite.book_story.presentation.core.components.common.LazyVerticalGridWithScrollbar
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.presentation.core.constants.providePrimaryScrollbar
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -24,7 +23,7 @@ fun LibraryLayout(
|
||||||
LazyVerticalGridWithScrollbar(
|
LazyVerticalGridWithScrollbar(
|
||||||
columns = GridCells.Adaptive(120.dp),
|
columns = GridCells.Adaptive(120.dp),
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
scrollbarSettings = Constants.providePrimaryScrollbar(false),
|
scrollbarSettings = providePrimaryScrollbar(false),
|
||||||
contentPadding = PaddingValues(8.dp)
|
contentPadding = PaddingValues(8.dp)
|
||||||
) {
|
) {
|
||||||
items()
|
items()
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ fun LibraryMoveDialog(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var selectedCategory = remember {
|
val selectedCategory = remember {
|
||||||
mutableStateOf(moveCategories.value[0])
|
mutableStateOf(moveCategories.value[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
|
||||||
import androidx.compose.foundation.layout.FlowRow
|
import androidx.compose.foundation.layout.FlowRow
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
|
|
@ -32,7 +31,6 @@ import com.mikepenz.aboutlibraries.ui.compose.m3.util.author
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.StyledText
|
import ua.acclorite.book_story.presentation.core.components.common.StyledText
|
||||||
|
|
||||||
@OptIn(ExperimentalLayoutApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun LicensesItem(
|
fun LicensesItem(
|
||||||
library: Library,
|
library: Library,
|
||||||
|
|
|
||||||
|
|
@ -54,10 +54,15 @@ fun ReaderBottomBar(
|
||||||
scroll: (ReaderEvent.OnScroll) -> Unit,
|
scroll: (ReaderEvent.OnScroll) -> Unit,
|
||||||
changeProgress: (ReaderEvent.OnChangeProgress) -> Unit
|
changeProgress: (ReaderEvent.OnChangeProgress) -> Unit
|
||||||
) {
|
) {
|
||||||
val arrowDirection = remember(checkpoint.index, listState.firstVisibleItemIndex) {
|
val firstVisibleItemIndex = remember {
|
||||||
|
derivedStateOf {
|
||||||
|
listState.firstVisibleItemIndex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val arrowDirection = remember(checkpoint.index, firstVisibleItemIndex) {
|
||||||
derivedStateOf {
|
derivedStateOf {
|
||||||
val checkpointIndex = checkpoint.index
|
val checkpointIndex = checkpoint.index
|
||||||
val index = listState.firstVisibleItemIndex
|
val index = firstVisibleItemIndex.value
|
||||||
|
|
||||||
when {
|
when {
|
||||||
checkpointIndex > index -> Direction.END
|
checkpointIndex > index -> Direction.END
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,10 @@ import androidx.compose.material3.VerticalDivider
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
|
import androidx.compose.ui.platform.LocalWindowInfo
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.coerceAtMost
|
import androidx.compose.ui.unit.coerceAtMost
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ReaderPerceptionExpander(
|
fun ReaderPerceptionExpander(
|
||||||
|
|
@ -32,9 +32,11 @@ fun ReaderPerceptionExpander(
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.padding(
|
.padding(
|
||||||
horizontal = perceptionExpanderPadding.coerceAtMost(
|
horizontal = perceptionExpanderPadding.coerceAtMost(
|
||||||
LocalConfiguration.current.screenWidthDp.run {
|
with(LocalDensity.current) {
|
||||||
|
LocalWindowInfo.current.containerSize.width.toDp()
|
||||||
|
}.run {
|
||||||
this / 2f - (this * 0.1f)
|
this / 2f - (this * 0.1f)
|
||||||
}.dp
|
}
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
horizontalArrangement = Arrangement.SpaceBetween
|
horizontalArrangement = Arrangement.SpaceBetween
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import androidx.compose.animation.expandHorizontally
|
||||||
import androidx.compose.animation.fadeIn
|
import androidx.compose.animation.fadeIn
|
||||||
import androidx.compose.animation.fadeOut
|
import androidx.compose.animation.fadeOut
|
||||||
import androidx.compose.animation.shrinkHorizontally
|
import androidx.compose.animation.shrinkHorizontally
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.border
|
import androidx.compose.foundation.border
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
|
|
@ -76,7 +75,6 @@ import ua.acclorite.book_story.ui.settings.SettingsModel
|
||||||
import ua.acclorite.book_story.ui.theme.FadeTransitionPreservingSpace
|
import ua.acclorite.book_story.ui.theme.FadeTransitionPreservingSpace
|
||||||
import ua.acclorite.book_story.ui.theme.Transitions
|
import ua.acclorite.book_story.ui.theme.Transitions
|
||||||
|
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ColorPresetOption(backgroundColor: Color) {
|
fun ColorPresetOption(backgroundColor: Color) {
|
||||||
val settingsModel = hiltViewModel<SettingsModel>()
|
val settingsModel = hiltViewModel<SettingsModel>()
|
||||||
|
|
|
||||||
|
|
@ -26,13 +26,12 @@ import androidx.compose.ui.unit.dp
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import ua.acclorite.book_story.presentation.core.components.common.StyledText
|
import ua.acclorite.book_story.presentation.core.components.common.StyledText
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideExtensions
|
import ua.acclorite.book_story.presentation.core.constants.provideExtensions
|
||||||
import ua.acclorite.book_story.ui.main.MainEvent
|
import ua.acclorite.book_story.ui.main.MainEvent
|
||||||
import ua.acclorite.book_story.ui.main.MainModel
|
import ua.acclorite.book_story.ui.main.MainModel
|
||||||
|
|
||||||
fun LazyListScope.BrowseFilterOption() {
|
fun LazyListScope.BrowseFilterOption() {
|
||||||
items(Constants.provideExtensions(), key = { it }) {
|
items(provideExtensions(), key = { it }) {
|
||||||
val mainModel = hiltViewModel<MainModel>()
|
val mainModel = hiltViewModel<MainModel>()
|
||||||
val state = mainModel.state.collectAsStateWithLifecycle()
|
val state = mainModel.state.collectAsStateWithLifecycle()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ import android.content.Context
|
||||||
import android.content.UriPermission
|
import android.content.UriPermission
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.animation.ExperimentalSharedTransitionApi
|
|
||||||
import androidx.compose.animation.animateContentSize
|
import androidx.compose.animation.animateContentSize
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
|
@ -48,7 +47,6 @@ import ua.acclorite.book_story.ui.settings.SettingsEvent
|
||||||
import ua.acclorite.book_story.ui.settings.SettingsModel
|
import ua.acclorite.book_story.ui.settings.SettingsModel
|
||||||
import ua.acclorite.book_story.ui.theme.dynamicListItemColor
|
import ua.acclorite.book_story.ui.theme.dynamicListItemColor
|
||||||
|
|
||||||
@OptIn(ExperimentalSharedTransitionApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BrowseScanOption() {
|
fun BrowseScanOption() {
|
||||||
val settingsModel = hiltViewModel<SettingsModel>()
|
val settingsModel = hiltViewModel<SettingsModel>()
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.ui.ButtonItem
|
import ua.acclorite.book_story.domain.ui.ButtonItem
|
||||||
import ua.acclorite.book_story.presentation.core.components.settings.ChipsWithTitle
|
import ua.acclorite.book_story.presentation.core.components.settings.ChipsWithTitle
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideLanguages
|
import ua.acclorite.book_story.presentation.core.constants.provideLanguages
|
||||||
import ua.acclorite.book_story.ui.main.MainEvent
|
import ua.acclorite.book_story.ui.main.MainEvent
|
||||||
import ua.acclorite.book_story.ui.main.MainModel
|
import ua.acclorite.book_story.ui.main.MainModel
|
||||||
|
|
@ -26,7 +25,7 @@ fun AppLanguageOption() {
|
||||||
|
|
||||||
ChipsWithTitle(
|
ChipsWithTitle(
|
||||||
title = stringResource(id = R.string.language_option),
|
title = stringResource(id = R.string.language_option),
|
||||||
chips = Constants.provideLanguages().sortedBy { it.second }.map {
|
chips = provideLanguages().sortedBy { it.second }.map {
|
||||||
ButtonItem(
|
ButtonItem(
|
||||||
it.first,
|
it.first,
|
||||||
it.second,
|
it.second,
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.ui.ButtonItem
|
import ua.acclorite.book_story.domain.ui.ButtonItem
|
||||||
import ua.acclorite.book_story.presentation.core.components.settings.ChipsWithTitle
|
import ua.acclorite.book_story.presentation.core.components.settings.ChipsWithTitle
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
||||||
import ua.acclorite.book_story.ui.main.MainEvent
|
import ua.acclorite.book_story.ui.main.MainEvent
|
||||||
import ua.acclorite.book_story.ui.main.MainModel
|
import ua.acclorite.book_story.ui.main.MainModel
|
||||||
|
|
@ -26,7 +25,7 @@ fun FontFamilyOption() {
|
||||||
val state = mainModel.state.collectAsStateWithLifecycle()
|
val state = mainModel.state.collectAsStateWithLifecycle()
|
||||||
|
|
||||||
val fontFamily = remember(state.value.fontFamily) {
|
val fontFamily = remember(state.value.fontFamily) {
|
||||||
Constants.provideFonts().run {
|
provideFonts().run {
|
||||||
find {
|
find {
|
||||||
it.id == state.value.fontFamily
|
it.id == state.value.fontFamily
|
||||||
} ?: get(0)
|
} ?: get(0)
|
||||||
|
|
@ -35,7 +34,7 @@ fun FontFamilyOption() {
|
||||||
|
|
||||||
ChipsWithTitle(
|
ChipsWithTitle(
|
||||||
title = stringResource(id = R.string.font_family_option),
|
title = stringResource(id = R.string.font_family_option),
|
||||||
chips = Constants.provideFonts()
|
chips = provideFonts()
|
||||||
.map {
|
.map {
|
||||||
ButtonItem(
|
ButtonItem(
|
||||||
id = it.id,
|
id = it.id,
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.ui.ButtonItem
|
import ua.acclorite.book_story.domain.ui.ButtonItem
|
||||||
import ua.acclorite.book_story.presentation.core.components.settings.SegmentedButtonWithTitle
|
import ua.acclorite.book_story.presentation.core.components.settings.SegmentedButtonWithTitle
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
||||||
import ua.acclorite.book_story.ui.main.MainEvent
|
import ua.acclorite.book_story.ui.main.MainEvent
|
||||||
import ua.acclorite.book_story.ui.main.MainModel
|
import ua.acclorite.book_story.ui.main.MainModel
|
||||||
|
|
@ -27,7 +26,7 @@ fun FontStyleOption() {
|
||||||
val state = mainModel.state.collectAsStateWithLifecycle()
|
val state = mainModel.state.collectAsStateWithLifecycle()
|
||||||
|
|
||||||
val fontFamily = remember(state.value.fontFamily) {
|
val fontFamily = remember(state.value.fontFamily) {
|
||||||
Constants.provideFonts().run {
|
provideFonts().run {
|
||||||
find {
|
find {
|
||||||
it.id == state.value.fontFamily
|
it.id == state.value.fontFamily
|
||||||
} ?: get(0)
|
} ?: get(0)
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.reader.ReaderFontThickness
|
import ua.acclorite.book_story.domain.reader.ReaderFontThickness
|
||||||
import ua.acclorite.book_story.domain.ui.ButtonItem
|
import ua.acclorite.book_story.domain.ui.ButtonItem
|
||||||
import ua.acclorite.book_story.presentation.core.components.settings.ChipsWithTitle
|
import ua.acclorite.book_story.presentation.core.components.settings.ChipsWithTitle
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
||||||
import ua.acclorite.book_story.ui.main.MainEvent
|
import ua.acclorite.book_story.ui.main.MainEvent
|
||||||
import ua.acclorite.book_story.ui.main.MainModel
|
import ua.acclorite.book_story.ui.main.MainModel
|
||||||
|
|
@ -27,7 +26,7 @@ fun FontThicknessOption() {
|
||||||
val state = mainModel.state.collectAsStateWithLifecycle()
|
val state = mainModel.state.collectAsStateWithLifecycle()
|
||||||
|
|
||||||
val fontFamily = remember(state.value.fontFamily) {
|
val fontFamily = remember(state.value.fontFamily) {
|
||||||
Constants.provideFonts().run {
|
provideFonts().run {
|
||||||
find {
|
find {
|
||||||
it.id == state.value.fontFamily
|
it.id == state.value.fontFamily
|
||||||
} ?: get(0)
|
} ?: get(0)
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,8 @@ fun HighlightedReadingThicknessOption() {
|
||||||
|
|
||||||
ExpandingTransition(visible = state.value.highlightedReading) {
|
ExpandingTransition(visible = state.value.highlightedReading) {
|
||||||
SliderWithTitle(
|
SliderWithTitle(
|
||||||
value = state.value.highlightedReadingThickness.to(
|
value = state.value.highlightedReadingThickness
|
||||||
" ${stringResource(R.string.highlighted_reading_level)}"
|
to " ${stringResource(R.string.highlighted_reading_level)}",
|
||||||
),
|
|
||||||
fromValue = 1,
|
fromValue = 1,
|
||||||
toValue = 3,
|
toValue = 3,
|
||||||
title = stringResource(id = R.string.highlighted_reading_thickness_option),
|
title = stringResource(id = R.string.highlighted_reading_thickness_option),
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,12 @@
|
||||||
package ua.acclorite.book_story.ui.about
|
package ua.acclorite.book_story.ui.about
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
|
import androidx.core.net.toUri
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.FlowPreview
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
|
|
@ -21,7 +20,6 @@ import ua.acclorite.book_story.presentation.core.util.launchActivity
|
||||||
import ua.acclorite.book_story.presentation.core.util.showToast
|
import ua.acclorite.book_story.presentation.core.util.showToast
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@OptIn(FlowPreview::class)
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class AboutModel @Inject constructor() : ViewModel() {
|
class AboutModel @Inject constructor() : ViewModel() {
|
||||||
|
|
||||||
|
|
@ -31,7 +29,7 @@ class AboutModel @Inject constructor() : ViewModel() {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
val intent = Intent(
|
val intent = Intent(
|
||||||
Intent.ACTION_VIEW,
|
Intent.ACTION_VIEW,
|
||||||
Uri.parse(event.page)
|
event.page.toUri()
|
||||||
)
|
)
|
||||||
|
|
||||||
intent.launchActivity(event.context as ComponentActivity) {
|
intent.launchActivity(event.context as ComponentActivity) {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.FlowPreview
|
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
|
@ -35,7 +34,6 @@ import ua.acclorite.book_story.ui.history.HistoryScreen
|
||||||
import ua.acclorite.book_story.ui.library.LibraryScreen
|
import ua.acclorite.book_story.ui.library.LibraryScreen
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@OptIn(FlowPreview::class)
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class BookInfoModel @Inject constructor(
|
class BookInfoModel @Inject constructor(
|
||||||
private val getBookById: GetBookById,
|
private val getBookById: GetBookById,
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ import android.os.Parcelable
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.lazy.rememberLazyListState
|
import androidx.compose.foundation.lazy.rememberLazyListState
|
||||||
import androidx.compose.material.ExperimentalMaterialApi
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
import androidx.compose.runtime.DisposableEffect
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
|
@ -44,7 +43,6 @@ data class BookInfoScreen(val bookId: Int) : Screen, Parcelable {
|
||||||
val changePathChannel: Channel<Boolean> = Channel(Channel.CONFLATED)
|
val changePathChannel: Channel<Boolean> = Channel(Channel.CONFLATED)
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterialApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun Content() {
|
override fun Content() {
|
||||||
val navigator = LocalNavigator.current
|
val navigator = LocalNavigator.current
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,11 @@ import androidx.compose.runtime.Immutable
|
||||||
import ua.acclorite.book_story.domain.library.book.Book
|
import ua.acclorite.book_story.domain.library.book.Book
|
||||||
import ua.acclorite.book_story.domain.util.BottomSheet
|
import ua.acclorite.book_story.domain.util.BottomSheet
|
||||||
import ua.acclorite.book_story.domain.util.Dialog
|
import ua.acclorite.book_story.domain.util.Dialog
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideEmptyBook
|
import ua.acclorite.book_story.presentation.core.constants.provideEmptyBook
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class BookInfoState(
|
data class BookInfoState(
|
||||||
val book: Book = Constants.provideEmptyBook(),
|
val book: Book = provideEmptyBook(),
|
||||||
|
|
||||||
val canResetCover: Boolean = false,
|
val canResetCover: Boolean = false,
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -169,7 +169,7 @@ class BrowseModel @Inject constructor(
|
||||||
viewModelScope.launch(Dispatchers.IO) {
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
_state.update {
|
_state.update {
|
||||||
it.copy(
|
it.copy(
|
||||||
files = it.files.map { it.copy(selected = false) },
|
files = it.files.map { file -> file.copy(selected = false) },
|
||||||
hasSelectedItems = false
|
hasSelectedItems = false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -446,7 +446,7 @@ class BrowseModel @Inject constructor(
|
||||||
return files
|
return files
|
||||||
.filterFiles()
|
.filterFiles()
|
||||||
.sortedWith(
|
.sortedWith(
|
||||||
compareByWithOrder<SelectableFile> {
|
compareByWithOrder {
|
||||||
when (sortOrder) {
|
when (sortOrder) {
|
||||||
BrowseSortOrder.NAME -> {
|
BrowseSortOrder.NAME -> {
|
||||||
it.data.name.trim()
|
it.data.name.trim()
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,6 @@ import ua.acclorite.book_story.domain.use_case.data_store.ChangeLanguage
|
||||||
import ua.acclorite.book_story.domain.use_case.data_store.GetAllSettings
|
import ua.acclorite.book_story.domain.use_case.data_store.GetAllSettings
|
||||||
import ua.acclorite.book_story.domain.use_case.data_store.SetDatastore
|
import ua.acclorite.book_story.domain.use_case.data_store.SetDatastore
|
||||||
import ua.acclorite.book_story.domain.util.toHorizontalAlignment
|
import ua.acclorite.book_story.domain.util.toHorizontalAlignment
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.DataStoreConstants
|
import ua.acclorite.book_story.presentation.core.constants.DataStoreConstants
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideMainState
|
import ua.acclorite.book_story.presentation.core.constants.provideMainState
|
||||||
|
|
@ -62,7 +61,7 @@ class MainModel @Inject constructor(
|
||||||
private val mainModelReady = MutableStateFlow(false)
|
private val mainModelReady = MutableStateFlow(false)
|
||||||
|
|
||||||
private val _state: MutableStateFlow<MainState> = MutableStateFlow(
|
private val _state: MutableStateFlow<MainState> = MutableStateFlow(
|
||||||
stateHandle[Constants.provideMainState()] ?: MainState()
|
stateHandle[provideMainState()] ?: MainState()
|
||||||
)
|
)
|
||||||
val state = _state.asStateFlow()
|
val state = _state.asStateFlow()
|
||||||
|
|
||||||
|
|
@ -107,7 +106,7 @@ class MainModel @Inject constructor(
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(
|
it.copy(
|
||||||
fontFamily = Constants.provideFonts().run {
|
fontFamily = provideFonts().run {
|
||||||
find { font ->
|
find { font ->
|
||||||
font.id == event.value
|
font.id == event.value
|
||||||
}?.id ?: get(0).id
|
}?.id ?: get(0).id
|
||||||
|
|
@ -605,7 +604,7 @@ class MainModel @Inject constructor(
|
||||||
) {
|
) {
|
||||||
withContext(Dispatchers.Main.immediate) {
|
withContext(Dispatchers.Main.immediate) {
|
||||||
_state.update {
|
_state.update {
|
||||||
stateHandle[Constants.provideMainState()] = function(it)
|
stateHandle[provideMainState()] = function(it)
|
||||||
function(it)
|
function(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,6 @@ import ua.acclorite.book_story.domain.ui.toPureDark
|
||||||
import ua.acclorite.book_story.domain.ui.toThemeContrast
|
import ua.acclorite.book_story.domain.ui.toThemeContrast
|
||||||
import ua.acclorite.book_story.domain.util.HorizontalAlignment
|
import ua.acclorite.book_story.domain.util.HorizontalAlignment
|
||||||
import ua.acclorite.book_story.domain.util.toHorizontalAlignment
|
import ua.acclorite.book_story.domain.util.toHorizontalAlignment
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.DataStoreConstants
|
import ua.acclorite.book_story.presentation.core.constants.DataStoreConstants
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideLanguages
|
import ua.acclorite.book_story.presentation.core.constants.provideLanguages
|
||||||
|
|
@ -57,7 +56,7 @@ data class MainState(
|
||||||
// General Settings
|
// General Settings
|
||||||
val language: String = provideDefaultValue {
|
val language: String = provideDefaultValue {
|
||||||
val locale = Locale.getDefault().language.take(2)
|
val locale = Locale.getDefault().language.take(2)
|
||||||
Constants.provideLanguages().any { locale == it.first }.run {
|
provideLanguages().any { locale == it.first }.run {
|
||||||
if (this) locale
|
if (this) locale
|
||||||
else "en"// Default language.
|
else "en"// Default language.
|
||||||
}
|
}
|
||||||
|
|
@ -71,7 +70,7 @@ data class MainState(
|
||||||
val doublePressExit: Boolean = provideDefaultValue { false },
|
val doublePressExit: Boolean = provideDefaultValue { false },
|
||||||
|
|
||||||
// Reader Settings
|
// Reader Settings
|
||||||
val fontFamily: String = provideDefaultValue { Constants.provideFonts()[0].id },
|
val fontFamily: String = provideDefaultValue { provideFonts()[0].id },
|
||||||
val fontThickness: ReaderFontThickness = provideDefaultValue { ReaderFontThickness.NORMAL },
|
val fontThickness: ReaderFontThickness = provideDefaultValue { ReaderFontThickness.NORMAL },
|
||||||
val isItalic: Boolean = provideDefaultValue { false },
|
val isItalic: Boolean = provideDefaultValue { false },
|
||||||
val fontSize: Int = provideDefaultValue { 16 },
|
val fontSize: Int = provideDefaultValue { 16 },
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,11 @@ package ua.acclorite.book_story.ui.reader
|
||||||
|
|
||||||
import android.app.SearchManager
|
import android.app.SearchManager
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import androidx.compose.runtime.snapshotFlow
|
import androidx.compose.runtime.snapshotFlow
|
||||||
|
import androidx.core.net.toUri
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.core.view.WindowInsetsControllerCompat
|
import androidx.core.view.WindowInsetsControllerCompat
|
||||||
|
|
@ -396,7 +396,7 @@ class ReaderModel @Inject constructor(
|
||||||
|
|
||||||
browserIntent.action = Intent.ACTION_VIEW
|
browserIntent.action = Intent.ACTION_VIEW
|
||||||
val text = event.textToDefine.trim().replace(" ", "+")
|
val text = event.textToDefine.trim().replace(" ", "+")
|
||||||
browserIntent.data = Uri.parse("https://www.onelook.com/?w=$text")
|
browserIntent.data = "https://www.onelook.com/?w=$text".toUri()
|
||||||
|
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,6 @@ import ua.acclorite.book_story.domain.navigator.Screen
|
||||||
import ua.acclorite.book_story.domain.reader.ReaderColorEffects
|
import ua.acclorite.book_story.domain.reader.ReaderColorEffects
|
||||||
import ua.acclorite.book_story.domain.reader.ReaderProgressCount
|
import ua.acclorite.book_story.domain.reader.ReaderProgressCount
|
||||||
import ua.acclorite.book_story.domain.reader.ReaderTextAlignment
|
import ua.acclorite.book_story.domain.reader.ReaderTextAlignment
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
import ua.acclorite.book_story.presentation.core.constants.provideFonts
|
||||||
import ua.acclorite.book_story.presentation.core.util.LocalActivity
|
import ua.acclorite.book_story.presentation.core.util.LocalActivity
|
||||||
import ua.acclorite.book_story.presentation.core.util.calculateProgress
|
import ua.acclorite.book_story.presentation.core.util.calculateProgress
|
||||||
|
|
@ -118,7 +117,7 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable {
|
||||||
}
|
}
|
||||||
|
|
||||||
val fontFamily = remember(mainState.value.fontFamily) {
|
val fontFamily = remember(mainState.value.fontFamily) {
|
||||||
Constants.provideFonts().run {
|
provideFonts().run {
|
||||||
find {
|
find {
|
||||||
it.id == mainState.value.fontFamily
|
it.id == mainState.value.fontFamily
|
||||||
} ?: get(0)
|
} ?: get(0)
|
||||||
|
|
|
||||||
|
|
@ -15,12 +15,11 @@ import ua.acclorite.book_story.domain.reader.ReaderText.Chapter
|
||||||
import ua.acclorite.book_story.domain.ui.UIText
|
import ua.acclorite.book_story.domain.ui.UIText
|
||||||
import ua.acclorite.book_story.domain.util.BottomSheet
|
import ua.acclorite.book_story.domain.util.BottomSheet
|
||||||
import ua.acclorite.book_story.domain.util.Drawer
|
import ua.acclorite.book_story.domain.util.Drawer
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideEmptyBook
|
import ua.acclorite.book_story.presentation.core.constants.provideEmptyBook
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class ReaderState(
|
data class ReaderState(
|
||||||
val book: Book = Constants.provideEmptyBook(),
|
val book: Book = provideEmptyBook(),
|
||||||
val text: List<ReaderText> = emptyList(),
|
val text: List<ReaderText> = emptyList(),
|
||||||
val listState: LazyListState = LazyListState(),
|
val listState: LazyListState = LazyListState(),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@ import ua.acclorite.book_story.domain.use_case.color_preset.SelectColorPreset
|
||||||
import ua.acclorite.book_story.domain.use_case.color_preset.UpdateColorPreset
|
import ua.acclorite.book_story.domain.use_case.color_preset.UpdateColorPreset
|
||||||
import ua.acclorite.book_story.domain.use_case.permission.GrantPersistableUriPermission
|
import ua.acclorite.book_story.domain.use_case.permission.GrantPersistableUriPermission
|
||||||
import ua.acclorite.book_story.domain.use_case.permission.ReleasePersistableUriPermission
|
import ua.acclorite.book_story.domain.use_case.permission.ReleasePersistableUriPermission
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideDefaultColorPreset
|
import ua.acclorite.book_story.presentation.core.constants.provideDefaultColorPreset
|
||||||
import ua.acclorite.book_story.presentation.core.util.showToast
|
import ua.acclorite.book_story.presentation.core.util.showToast
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
@ -65,7 +64,7 @@ class SettingsModel @Inject constructor(
|
||||||
var colorPresets = getColorPresets.execute()
|
var colorPresets = getColorPresets.execute()
|
||||||
|
|
||||||
if (colorPresets.isEmpty()) {
|
if (colorPresets.isEmpty()) {
|
||||||
updateColorPreset.execute(Constants.provideDefaultColorPreset())
|
updateColorPreset.execute(provideDefaultColorPreset())
|
||||||
getColorPresets.execute().first().select()
|
getColorPresets.execute().first().select()
|
||||||
colorPresets = getColorPresets.execute()
|
colorPresets = getColorPresets.execute()
|
||||||
}
|
}
|
||||||
|
|
@ -365,7 +364,7 @@ class SettingsModel @Inject constructor(
|
||||||
addColorPresetJob = launch {
|
addColorPresetJob = launch {
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
val newColorPreset = Constants.provideDefaultColorPreset().copy(
|
val newColorPreset = provideDefaultColorPreset().copy(
|
||||||
backgroundColor = event.backgroundColor,
|
backgroundColor = event.backgroundColor,
|
||||||
fontColor = event.fontColor
|
fontColor = event.fontColor
|
||||||
)
|
)
|
||||||
|
|
@ -483,7 +482,7 @@ class SettingsModel @Inject constructor(
|
||||||
val selectedPreset = presets.firstOrNull { it.isSelected }
|
val selectedPreset = presets.firstOrNull { it.isSelected }
|
||||||
|
|
||||||
if (selectedPreset == null) {
|
if (selectedPreset == null) {
|
||||||
return Constants.provideDefaultColorPreset()
|
return provideDefaultColorPreset()
|
||||||
}
|
}
|
||||||
|
|
||||||
return selectedPreset
|
return selectedPreset
|
||||||
|
|
|
||||||
|
|
@ -9,13 +9,12 @@ package ua.acclorite.book_story.ui.settings
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import ua.acclorite.book_story.domain.reader.ColorPreset
|
import ua.acclorite.book_story.domain.reader.ColorPreset
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideDefaultColorPreset
|
import ua.acclorite.book_story.presentation.core.constants.provideDefaultColorPreset
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class SettingsState(
|
data class SettingsState(
|
||||||
val colorPresets: List<ColorPreset> = emptyList(),
|
val colorPresets: List<ColorPreset> = emptyList(),
|
||||||
val selectedColorPreset: ColorPreset = Constants.provideDefaultColorPreset(),
|
val selectedColorPreset: ColorPreset = provideDefaultColorPreset(),
|
||||||
val animateColorPreset: Boolean = false,
|
val animateColorPreset: Boolean = false,
|
||||||
val colorPresetListState: LazyListState = LazyListState()
|
val colorPresetListState: LazyListState = LazyListState()
|
||||||
)
|
)
|
||||||
|
|
@ -8,7 +8,6 @@ package ua.acclorite.book_story.ui.start
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.mutableIntStateOf
|
import androidx.compose.runtime.mutableIntStateOf
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
|
@ -21,7 +20,6 @@ import kotlinx.parcelize.Parcelize
|
||||||
import ua.acclorite.book_story.domain.navigator.Screen
|
import ua.acclorite.book_story.domain.navigator.Screen
|
||||||
import ua.acclorite.book_story.domain.navigator.StackEvent
|
import ua.acclorite.book_story.domain.navigator.StackEvent
|
||||||
import ua.acclorite.book_story.domain.ui.ButtonItem
|
import ua.acclorite.book_story.domain.ui.ButtonItem
|
||||||
import ua.acclorite.book_story.presentation.core.constants.Constants
|
|
||||||
import ua.acclorite.book_story.presentation.core.constants.provideLanguages
|
import ua.acclorite.book_story.presentation.core.constants.provideLanguages
|
||||||
import ua.acclorite.book_story.presentation.core.util.LocalActivity
|
import ua.acclorite.book_story.presentation.core.util.LocalActivity
|
||||||
import ua.acclorite.book_story.presentation.navigator.LocalNavigator
|
import ua.acclorite.book_story.presentation.navigator.LocalNavigator
|
||||||
|
|
@ -50,7 +48,6 @@ object StartScreen : Screen, Parcelable {
|
||||||
const val DONE = "done"
|
const val DONE = "done"
|
||||||
|
|
||||||
@SuppressLint("InlinedApi")
|
@SuppressLint("InlinedApi")
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun Content() {
|
override fun Content() {
|
||||||
val navigator = LocalNavigator.current
|
val navigator = LocalNavigator.current
|
||||||
|
|
@ -64,7 +61,7 @@ object StartScreen : Screen, Parcelable {
|
||||||
val stackEvent = remember { mutableStateOf(StackEvent.Default) }
|
val stackEvent = remember { mutableStateOf(StackEvent.Default) }
|
||||||
|
|
||||||
val languages = remember(mainState.value.language) {
|
val languages = remember(mainState.value.language) {
|
||||||
Constants.provideLanguages().sortedBy { it.second }.map {
|
provideLanguages().sortedBy { it.second }.map {
|
||||||
ButtonItem(
|
ButtonItem(
|
||||||
id = it.first,
|
id = it.first,
|
||||||
title = it.second,
|
title = it.second,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue