diff --git a/app/schemas/ua.acclorite.book_story.data.local.room.BookDatabase/8.json b/app/schemas/ua.acclorite.book_story.data.local.room.BookDatabase/8.json new file mode 100644 index 00000000..3014ff18 --- /dev/null +++ b/app/schemas/ua.acclorite.book_story.data.local.room.BookDatabase/8.json @@ -0,0 +1,190 @@ +{ + "formatVersion": 1, + "database": { + "version": 8, + "identityHash": "095e8b560edd2bf64b64720308b686c4", + "entities": [ + { + "tableName": "BookEntity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `author` TEXT, `description` TEXT, `filePath` TEXT NOT NULL, `scrollIndex` INTEGER NOT NULL, `scrollOffset` INTEGER NOT NULL, `progress` REAL NOT NULL, `image` TEXT, `category` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "filePath", + "columnName": "filePath", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrollIndex", + "columnName": "scrollIndex", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "scrollOffset", + "columnName": "scrollOffset", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "progress", + "columnName": "progress", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "image", + "columnName": "image", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "HistoryEntity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `bookId` INTEGER NOT NULL, `time` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "bookId", + "columnName": "bookId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "time", + "columnName": "time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ColorPresetEntity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT, `backgroundColor` INTEGER NOT NULL, `fontColor` INTEGER NOT NULL, `isSelected` INTEGER NOT NULL, `order` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "backgroundColor", + "columnName": "backgroundColor", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fontColor", + "columnName": "fontColor", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isSelected", + "columnName": "isSelected", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "order", + "columnName": "order", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "FavoriteDirectoryEntity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`path` TEXT NOT NULL, PRIMARY KEY(`path`))", + "fields": [ + { + "fieldPath": "path", + "columnName": "path", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "path" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '095e8b560edd2bf64b64720308b686c4')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/data/local/converter/ChapterConverter.kt b/app/src/main/java/ua/acclorite/book_story/data/local/converter/ChapterConverter.kt deleted file mode 100644 index 32af0a13..00000000 --- a/app/src/main/java/ua/acclorite/book_story/data/local/converter/ChapterConverter.kt +++ /dev/null @@ -1,25 +0,0 @@ -package ua.acclorite.book_story.data.local.converter - -import androidx.room.TypeConverter -import com.google.common.reflect.TypeToken -import com.google.gson.Gson -import com.google.gson.JsonSyntaxException -import ua.acclorite.book_story.domain.reader.Chapter - -class ChapterConverter { - @TypeConverter - fun fromChapterList(chapters: List): String { - return Gson().toJson(chapters) - } - - @TypeConverter - fun toChapterList(data: String): List { - val listType = object : TypeToken>() {}.type - return try { - Gson().fromJson?>(data, listType).sortedBy { it.index } - } catch (j: JsonSyntaxException) { - j.printStackTrace() - emptyList() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/data/local/dto/BookEntity.kt b/app/src/main/java/ua/acclorite/book_story/data/local/dto/BookEntity.kt index fcacf462..ec8f1ee3 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/local/dto/BookEntity.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/local/dto/BookEntity.kt @@ -1,23 +1,15 @@ package ua.acclorite.book_story.data.local.dto -import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import androidx.room.TypeConverters -import ua.acclorite.book_story.data.local.converter.ChapterConverter import ua.acclorite.book_story.domain.library.category.Category -import ua.acclorite.book_story.domain.reader.Chapter @Entity -@TypeConverters(ChapterConverter::class) data class BookEntity( @PrimaryKey(true) val id: Int = 0, val title: String, val author: String?, val description: String?, - val textPath: String, - @ColumnInfo(defaultValue = "[]") - val chapters: List, val filePath: String, val scrollIndex: Int, val scrollOffset: Int, diff --git a/app/src/main/java/ua/acclorite/book_story/data/local/room/BookDao.kt b/app/src/main/java/ua/acclorite/book_story/data/local/room/BookDao.kt index 5ef972fc..378704c9 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/local/room/BookDao.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/local/room/BookDao.kt @@ -20,8 +20,8 @@ interface BookDao { /* ------ BookEntity ------------------------ */ @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertBooks( - books: List + suspend fun insertBook( + book: BookEntity ) @Query( diff --git a/app/src/main/java/ua/acclorite/book_story/data/local/room/BookDatabase.kt b/app/src/main/java/ua/acclorite/book_story/data/local/room/BookDatabase.kt index 19c6b211..06bbb226 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/local/room/BookDatabase.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/local/room/BookDatabase.kt @@ -20,7 +20,7 @@ import ua.acclorite.book_story.data.local.dto.HistoryEntity ColorPresetEntity::class, FavoriteDirectoryEntity::class, ], - version = 7, + version = 8, autoMigrations = [ AutoMigration(1, 2), AutoMigration(2, 3), @@ -28,6 +28,7 @@ import ua.acclorite.book_story.data.local.dto.HistoryEntity AutoMigration(4, 5), AutoMigration(5, 6), AutoMigration(6, 7), + AutoMigration(7, 8, spec = DatabaseHelper.MIGRATION_7_8::class) ], exportSchema = true ) @@ -83,4 +84,8 @@ object DatabaseHelper { ) } } + + @DeleteColumn("BookEntity", "textPath") + @DeleteColumn("BookEntity", "chapters") + class MIGRATION_7_8 : AutoMigrationSpec } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/data/mapper/book/BookMapperImpl.kt b/app/src/main/java/ua/acclorite/book_story/data/mapper/book/BookMapperImpl.kt index 7eaba3ab..45a317a8 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/mapper/book/BookMapperImpl.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/mapper/book/BookMapperImpl.kt @@ -17,11 +17,9 @@ class BookMapperImpl @Inject constructor() : BookMapper { scrollOffset = book.scrollOffset, progress = book.progress, author = book.author.getAsString(), - textPath = book.textPath, description = book.description, image = book.coverImage?.toString(), - category = book.category, - chapters = book.chapters + category = book.category ) } @@ -36,12 +34,10 @@ class BookMapperImpl @Inject constructor() : BookMapper { scrollIndex = bookEntity.scrollIndex, scrollOffset = bookEntity.scrollOffset, progress = bookEntity.progress, - textPath = bookEntity.textPath, filePath = bookEntity.filePath, lastOpened = null, category = bookEntity.category, - coverImage = if (bookEntity.image != null) Uri.parse(bookEntity.image) else null, - chapters = bookEntity.chapters + coverImage = if (bookEntity.image != null) Uri.parse(bookEntity.image) else null ) } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/epub/EpubFileParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/epub/EpubFileParser.kt index 4550f5f7..58038981 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/epub/EpubFileParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/epub/EpubFileParser.kt @@ -76,7 +76,6 @@ class EpubFileParser @Inject constructor() : FileParser { title = title, author = author, description = description, - textPath = "", scrollIndex = 0, scrollOffset = 0, progress = 0f, diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/fb2/Fb2FileParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/fb2/Fb2FileParser.kt index 1e587a92..d5febc08 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/fb2/Fb2FileParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/fb2/Fb2FileParser.kt @@ -55,7 +55,6 @@ class Fb2FileParser @Inject constructor() : FileParser { title = title, author = author, description = descriptionFromFile, - textPath = "", scrollIndex = 0, scrollOffset = 0, progress = 0f, diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/html/HtmlFileParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/html/HtmlFileParser.kt index b536d264..88cfb406 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/html/HtmlFileParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/html/HtmlFileParser.kt @@ -27,7 +27,6 @@ class HtmlFileParser @Inject constructor() : FileParser { title = title, author = UIText.StringResource(R.string.unknown_author), description = null, - textPath = "", scrollIndex = 0, scrollOffset = 0, progress = 0f, diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfFileParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfFileParser.kt index ca08a01a..7536c8fa 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfFileParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfFileParser.kt @@ -36,7 +36,6 @@ class PdfFileParser @Inject constructor( title = title, author = author, description = description, - textPath = "", scrollIndex = 0, scrollOffset = 0, progress = 0f, diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/txt/TxtFileParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/txt/TxtFileParser.kt index b374d5c6..d2bf9f93 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/txt/TxtFileParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/txt/TxtFileParser.kt @@ -21,7 +21,6 @@ class TxtFileParser @Inject constructor() : FileParser { title = title, author = author, description = null, - textPath = "", scrollIndex = 0, scrollOffset = 0, progress = 0f, diff --git a/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt b/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt index 640a86c1..add1f632 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt @@ -9,26 +9,20 @@ import android.util.Log import androidx.compose.ui.text.AnnotatedString import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import kotlinx.coroutines.yield -import ua.acclorite.book_story.R import ua.acclorite.book_story.data.local.room.BookDao import ua.acclorite.book_story.data.mapper.book.BookMapper import ua.acclorite.book_story.data.parser.FileParser import ua.acclorite.book_story.data.parser.MarkdownParser import ua.acclorite.book_story.data.parser.TextParser import ua.acclorite.book_story.domain.library.book.Book -import ua.acclorite.book_story.domain.library.book.BookWithText -import ua.acclorite.book_story.domain.library.book.BookWithTextAndCover -import ua.acclorite.book_story.domain.reader.Chapter +import ua.acclorite.book_story.domain.library.book.BookWithCover +import ua.acclorite.book_story.domain.reader.ChaptersAndText import ua.acclorite.book_story.domain.repository.BookRepository -import ua.acclorite.book_story.domain.ui.UIText import ua.acclorite.book_story.domain.util.CoverImage import ua.acclorite.book_story.domain.util.Resource -import java.io.BufferedReader import java.io.ByteArrayOutputStream import java.io.File import java.io.FileOutputStream -import java.io.FileReader import java.util.UUID import javax.inject.Inject import javax.inject.Singleton @@ -41,7 +35,6 @@ private const val UPDATE_BOOK = "UPDATE BOOK, REPO" private const val DELETE_BOOKS = "DELETE BOOKS, REPO" private const val CAN_RESET_COVER = "CAN RESET COVER, REPO" private const val RESET_COVER = "RESET COVER, REPO" -private const val CHECK_FOR_TEXT_UPDATE = "CHECK TEXT UPD, REPO" @Suppress("DEPRECATION") @Singleton @@ -97,166 +90,65 @@ class BookRepositoryImpl @Inject constructor( } /** - * Loads text from given path. Should be .txt. - * Used to get text from book and load Reader. + * Loads text from the book. */ - override suspend fun getBookText(textPath: String): List { - val textFile = File(textPath) + override suspend fun getBookText(bookId: Int): ChaptersAndText { + if (bookId == -1) return ChaptersAndText(chapters = emptyList(), text = emptyList()) + + val book = database.findBookById(bookId) + val file = File(book.filePath) + + if (!file.exists()) { + Log.e(GET_TEXT, "File [$bookId] does not exist") + return ChaptersAndText(chapters = emptyList(), text = emptyList()) + } + + val parsedText = textParser.parse(file) + if (parsedText is Resource.Error) { + Log.e(GET_TEXT, "Failed to load text: $bookId") + return ChaptersAndText(chapters = emptyList(), text = emptyList()) + } + + val chapters = parsedText.data!!.map { it.chapter } val markdownLines = mutableListOf() - if (textPath.isBlank() || !textFile.exists() || textFile.extension != "txt") { - Log.w(GET_TEXT, "Failed to load file: $textPath") - return emptyList() - } - - try { - withContext(Dispatchers.IO) { - BufferedReader(FileReader(textFile)).forEachLine { line -> - if (line.isNotBlank()) { - markdownLines.add( - markdownParser.parse(line.trim()) - ) - } - } - } - } catch (e: Exception) { - e.printStackTrace() - Log.e(GET_TEXT, "Could not get text with markdown.") - return emptyList() - } - - Log.i(GET_TEXT, "Successfully loaded text with markdown.") - return markdownLines - } - - /** - * Checks whether the text of the book([bookId]) is up-to-date and did not change. - * - * @return If [Resource.Success] and returns null, then the book is up-to-date. - */ - override suspend fun checkForTextUpdate(bookId: Int): Resource, List>?> { - yield() - - try { - val book = database.findBookById(bookId) - Log.i(CHECK_FOR_TEXT_UPDATE, "Checking [${book.title}] for text update.") - - yield() - - val text = withContext(Dispatchers.IO) { - val lines = mutableListOf() - BufferedReader(FileReader(book.textPath)).forEachLine { line -> - if (line.isNotBlank()) { - lines.add(line.trim()) - } - } - lines.toList() - } - val chapters = book.chapters - Log.i(CHECK_FOR_TEXT_UPDATE, "Got current text and chapters.") - - yield() - - val bookFile = File(book.filePath).apply { - if (!exists()) { - Log.e(CHECK_FOR_TEXT_UPDATE, "Couldn't get book's file: does not exist.") - return Resource.Error( - message = UIText.StringResource( - R.string.file_not_found, - name.takeLast(50) - ) + withContext(Dispatchers.IO) { + for (line in parsedText.data.map { it.text }.flatten()) { + if (line.isNotBlank()) { + markdownLines.add( + markdownParser.parse(line.trim()) ) } } - - yield() - - val (updatedText, updatedChapters) = textParser.parse(bookFile).run { - if (this is Resource.Error) { - Log.e(CHECK_FOR_TEXT_UPDATE, "Couldn't get updated book's text.") - return Resource.Error( - message = UIText.StringResource( - R.string.error_file_empty - ) - ) - } - - data!!.map { it.text }.flatten() to data.map { it.chapter } - } - Log.i(CHECK_FOR_TEXT_UPDATE, "Successfully got new text and chapters.") - - yield() - - return Resource.Success( - if (updatedText == text && updatedChapters == chapters) { - Log.i(CHECK_FOR_TEXT_UPDATE, "Text is up-to-date(${book.title}).") - null - } else { - Log.i(CHECK_FOR_TEXT_UPDATE, "Found difference in ${book.title}.") - updatedText to updatedChapters - } - ) - } catch (e: Exception) { - e.printStackTrace() - Log.e(CHECK_FOR_TEXT_UPDATE, "Check failed with the error: ${e.message}") - return Resource.Error( - UIText.StringResource( - R.string.error_query, - e.message ?: "" - ) - ) } + + Log.i(GET_TEXT, "Successfully loaded text of [$bookId] with markdown.") + return ChaptersAndText( + chapters = chapters, + text = markdownLines + ) } /** * Inserts book in database. - * Creates covers and books folders, which contain book's text and cover. + * Creates covers folder, which contains cover. */ override suspend fun insertBook( - bookWithTextAndCover: BookWithTextAndCover + bookWithCover: BookWithCover ): Boolean { - Log.i(INSERT_BOOK, "Inserting ${bookWithTextAndCover.book.title}.") + Log.i(INSERT_BOOK, "Inserting ${bookWithCover.book.title}.") val filesDir = application.filesDir val coversDir = File(filesDir, "covers") - val booksDir = File(filesDir, "books") if (!coversDir.exists()) { Log.i(INSERT_BOOK, "Created covers folder.") coversDir.mkdirs() } - if (!booksDir.exists()) { - Log.i(INSERT_BOOK, "Created books folder.") - booksDir.mkdirs() - } var coverUri = "" - val textUri: String - if (bookWithTextAndCover.text.isEmpty()) { - Log.e(INSERT_BOOK, "Text is empty.") - return false - } - - try { - textUri = "${UUID.randomUUID()}.txt" - val textPath = File(booksDir, textUri) - - withContext(Dispatchers.IO) { - FileOutputStream(textPath).use { stream -> - bookWithTextAndCover.text.forEach { line -> - stream.write(line.toByteArray()) - stream.write(System.lineSeparator().toByteArray()) - } - } - } - } catch (e: Exception) { - Log.e(INSERT_BOOK, "Could not write text.") - e.printStackTrace() - return false - } - - if (bookWithTextAndCover.coverImage != null) { + if (bookWithCover.coverImage != null) { try { coverUri = "${UUID.randomUUID()}.webp" val cover = File(coversDir, coverUri) @@ -264,7 +156,7 @@ class BookRepositoryImpl @Inject constructor( withContext(Dispatchers.IO) { FileOutputStream(cover).use { stream -> if ( - !bookWithTextAndCover.coverImage.copy(Bitmap.Config.RGB_565, false) + !bookWithCover.coverImage.copy(Bitmap.Config.RGB_565, false) .compress( Bitmap.CompressFormat.WEBP, 20, @@ -282,30 +174,27 @@ class BookRepositoryImpl @Inject constructor( } } - val updatedBook = bookWithTextAndCover.book.copy( - textPath = "$booksDir/$textUri", + val updatedBook = bookWithCover.book.copy( coverImage = if (coverUri.isNotBlank()) { Uri.fromFile(File("$coversDir/$coverUri")) } else null ) val bookToInsert = bookMapper.toBookEntity(updatedBook) - database.insertBooks(listOf(bookToInsert)) + database.insertBook(bookToInsert) Log.i(INSERT_BOOK, "Successfully inserted book.") return true } /** - * Update book without text or cover image. + * Update book without cover image. */ override suspend fun updateBook(book: Book) { - // without text and cover image val entity = database.findBookById(book.id) database.updateBooks( listOf( bookMapper.toBookEntity( book.copy( - textPath = entity.textPath, coverImage = if (entity.image != null) Uri.parse(entity.image) else null ) ) @@ -313,76 +202,6 @@ class BookRepositoryImpl @Inject constructor( ) } - /** - * Update book with text. Deletes old text file and replaces it with new. - */ - override suspend fun updateBookWithText(bookWithText: BookWithText): Boolean { - Log.i(UPDATE_BOOK, "Updating book with text: ${bookWithText.book.title}.") - - // without cover image - val filesDir = application.filesDir - val booksDir = File(filesDir, "books") - - if (!booksDir.exists()) { - Log.i(UPDATE_BOOK, "Created books folder.") - booksDir.mkdirs() - } - - val textUri: String - val bookEntity = database.findBookById(bookWithText.book.id) - - if (bookWithText.text.isEmpty()) { - Log.e(UPDATE_BOOK, "Text is empty.") - return false - } - - try { - textUri = "${UUID.randomUUID()}.txt" - val textPath = File(booksDir, textUri) - - withContext(Dispatchers.IO) { - FileOutputStream(textPath).use { stream -> - bookWithText.text.forEach { line -> - stream.write(line.toByteArray()) - stream.write(System.lineSeparator().toByteArray()) - } - } - } - } catch (e: Exception) { - Log.e(UPDATE_BOOK, "Could not update text.") - e.printStackTrace() - return false - } - - if (bookWithText.book.textPath.isNotBlank()) { - try { - val fileToDelete = File( - bookWithText.book.textPath - ) - - if (fileToDelete.exists()) { - fileToDelete.delete() - } - } catch (e: Exception) { - Log.e(UPDATE_BOOK, "Failed to delete old text.") - e.printStackTrace() - } - } - - val updatedBook = bookMapper.toBookEntity( - bookWithText.book.copy( - textPath = "$booksDir/$textUri", - coverImage = if (bookEntity.image != null) Uri.parse(bookEntity.image) else null - ) - ) - - database.updateBooks( - listOf(updatedBook) - ) - Log.i(UPDATE_BOOK, "Successfully updated book.") - return true - } - /** * Update cover image of the book. Deletes old cover and replaces with new. */ @@ -392,7 +211,6 @@ class BookRepositoryImpl @Inject constructor( ) { Log.i(UPDATE_BOOK, "Updating cover image: ${bookWithOldCover.title}.") - // without text val book = database.findBookById(bookWithOldCover.id) var uri: String? = null @@ -451,7 +269,6 @@ class BookRepositoryImpl @Inject constructor( } val bookWithNewCover = bookWithOldCover.copy( - textPath = book.textPath, coverImage = newCoverImageUri ) @@ -474,16 +291,11 @@ class BookRepositoryImpl @Inject constructor( val filesDir = application.filesDir val coversDir = File(filesDir, "covers") - val booksDir = File(filesDir, "books") if (!coversDir.exists()) { Log.i(DELETE_BOOKS, "Created covers folder.") coversDir.mkdirs() } - if (!booksDir.exists()) { - Log.i(DELETE_BOOKS, "Created books folder.") - booksDir.mkdirs() - } database.deleteBooks( books.map { @@ -504,19 +316,6 @@ class BookRepositoryImpl @Inject constructor( } } - if (book.textPath.isNotBlank()) { - try { - val fileToDelete = File(book.textPath) - - if (fileToDelete.exists()) { - fileToDelete.delete() - } - } catch (e: Exception) { - Log.e(DELETE_BOOKS, "Could not delete text.") - e.printStackTrace() - } - } - book } ) diff --git a/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt b/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt index 3ecf67b8..6c02519a 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt @@ -6,15 +6,12 @@ import ua.acclorite.book_story.R import ua.acclorite.book_story.data.local.room.BookDao import ua.acclorite.book_story.data.mapper.book.BookMapper import ua.acclorite.book_story.data.parser.FileParser -import ua.acclorite.book_story.data.parser.TextParser import ua.acclorite.book_story.domain.browse.SelectableFile -import ua.acclorite.book_story.domain.library.book.BookWithTextAndCover import ua.acclorite.book_story.domain.library.book.NullableBook 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.repository.FileSystemRepository import ua.acclorite.book_story.domain.ui.UIText -import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.constants.provideSupportedExtensions import java.io.File @@ -31,11 +28,8 @@ private const val GET_FILES_FROM_DEVICE = "FILES FROM DEVICE, REPO" @Singleton class FileSystemRepositoryImpl @Inject constructor( private val database: BookDao, - private val bookMapper: BookMapper, - - private val fileParser: FileParser, - private val textParser: TextParser, + private val fileParser: FileParser ) : FileSystemRepository { /** @@ -155,26 +149,7 @@ class FileSystemRepositoryImpl @Inject constructor( ) } - val parsedText = textParser.parse(file) - if (parsedText is Resource.Error) { - Log.e(GET_BOOK_FROM_FILE, "Parsed text(${file.name}) has error.") - return Null( - file.name, - parsedText.message - ) - } - Log.i(GET_BOOK_FROM_FILE, "Successfully got book from file.") - return NotNull( - bookWithTextAndCover = BookWithTextAndCover( - book = parsedBook.book.copy( - chapters = parsedText.data!!.map { it.chapter } - ), - coverImage = parsedBook.coverImage, - text = parsedText.data.map { - it.text - }.flatten() - ) - ) + return NotNull(bookWithCover = parsedBook) } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/domain/library/book/Book.kt b/app/src/main/java/ua/acclorite/book_story/domain/library/book/Book.kt index e37703c2..9ec7308e 100644 --- a/app/src/main/java/ua/acclorite/book_story/domain/library/book/Book.kt +++ b/app/src/main/java/ua/acclorite/book_story/domain/library/book/Book.kt @@ -5,7 +5,6 @@ import android.os.Parcelable import androidx.compose.runtime.Immutable import kotlinx.parcelize.Parcelize import ua.acclorite.book_story.domain.library.category.Category -import ua.acclorite.book_story.domain.reader.Chapter import ua.acclorite.book_story.domain.ui.UIText @Parcelize @@ -17,15 +16,13 @@ data class Book( val author: UIText, val description: String?, - val textPath: String, val filePath: String, val coverImage: Uri?, val scrollIndex: Int, val scrollOffset: Int, val progress: Float, - val chapters: List = emptyList(), val lastOpened: Long?, - val category: Category, + val category: Category ) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/domain/library/book/BookWithText.kt b/app/src/main/java/ua/acclorite/book_story/domain/library/book/BookWithText.kt deleted file mode 100644 index 55251007..00000000 --- a/app/src/main/java/ua/acclorite/book_story/domain/library/book/BookWithText.kt +++ /dev/null @@ -1,9 +0,0 @@ -package ua.acclorite.book_story.domain.library.book - -import androidx.compose.runtime.Immutable - -@Immutable -data class BookWithText( - val book: Book, - val text: List -) \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/domain/library/book/BookWithTextAndCover.kt b/app/src/main/java/ua/acclorite/book_story/domain/library/book/BookWithTextAndCover.kt deleted file mode 100644 index a7bf3bc1..00000000 --- a/app/src/main/java/ua/acclorite/book_story/domain/library/book/BookWithTextAndCover.kt +++ /dev/null @@ -1,11 +0,0 @@ -package ua.acclorite.book_story.domain.library.book - -import androidx.compose.runtime.Immutable -import ua.acclorite.book_story.domain.util.CoverImage - -@Immutable -data class BookWithTextAndCover( - val book: Book, - val coverImage: CoverImage?, - val text: List -) \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/domain/library/book/NullableBook.kt b/app/src/main/java/ua/acclorite/book_story/domain/library/book/NullableBook.kt index 6b769c81..fe121554 100644 --- a/app/src/main/java/ua/acclorite/book_story/domain/library/book/NullableBook.kt +++ b/app/src/main/java/ua/acclorite/book_story/domain/library/book/NullableBook.kt @@ -5,14 +5,14 @@ import ua.acclorite.book_story.domain.ui.UIText @Immutable sealed class NullableBook( - val bookWithTextAndCover: BookWithTextAndCover?, + val bookWithCover: BookWithCover?, val fileName: String?, val message: UIText? ) { class NotNull( - bookWithTextAndCover: BookWithTextAndCover + bookWithCover: BookWithCover ) : NullableBook( - bookWithTextAndCover = bookWithTextAndCover, + bookWithCover = bookWithCover, fileName = null, message = null ) @@ -21,7 +21,7 @@ sealed class NullableBook( fileName: String, message: UIText? ) : NullableBook( - bookWithTextAndCover = null, + bookWithCover = null, fileName = fileName, message = message ) diff --git a/app/src/main/java/ua/acclorite/book_story/domain/reader/ChaptersAndText.kt b/app/src/main/java/ua/acclorite/book_story/domain/reader/ChaptersAndText.kt new file mode 100644 index 00000000..b87053c4 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/domain/reader/ChaptersAndText.kt @@ -0,0 +1,10 @@ +package ua.acclorite.book_story.domain.reader + +import androidx.compose.runtime.Immutable +import androidx.compose.ui.text.AnnotatedString + +@Immutable +data class ChaptersAndText( + val chapters: List, + val text: List +) \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/domain/repository/BookRepository.kt b/app/src/main/java/ua/acclorite/book_story/domain/repository/BookRepository.kt index 9748292d..6ffe724f 100644 --- a/app/src/main/java/ua/acclorite/book_story/domain/repository/BookRepository.kt +++ b/app/src/main/java/ua/acclorite/book_story/domain/repository/BookRepository.kt @@ -1,12 +1,9 @@ package ua.acclorite.book_story.domain.repository -import androidx.compose.ui.text.AnnotatedString import ua.acclorite.book_story.domain.library.book.Book -import ua.acclorite.book_story.domain.library.book.BookWithText -import ua.acclorite.book_story.domain.library.book.BookWithTextAndCover -import ua.acclorite.book_story.domain.reader.Chapter +import ua.acclorite.book_story.domain.library.book.BookWithCover +import ua.acclorite.book_story.domain.reader.ChaptersAndText import ua.acclorite.book_story.domain.util.CoverImage -import ua.acclorite.book_story.domain.util.Resource interface BookRepository { @@ -19,23 +16,17 @@ interface BookRepository { ): List suspend fun getBookText( - textPath: String - ): List - - suspend fun checkForTextUpdate(bookId: Int): Resource, List>?> + bookId: Int + ): ChaptersAndText suspend fun insertBook( - bookWithTextAndCover: BookWithTextAndCover + bookWithCover: BookWithCover ): Boolean suspend fun updateBook( book: Book ) - suspend fun updateBookWithText( - bookWithText: BookWithText - ): Boolean - suspend fun updateCoverImageOfBook( bookWithOldCover: Book, newCoverImage: CoverImage? diff --git a/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/CheckForTextUpdate.kt b/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/CheckForTextUpdate.kt deleted file mode 100644 index 1e5e961a..00000000 --- a/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/CheckForTextUpdate.kt +++ /dev/null @@ -1,15 +0,0 @@ -package ua.acclorite.book_story.domain.use_case.book - -import ua.acclorite.book_story.domain.reader.Chapter -import ua.acclorite.book_story.domain.repository.BookRepository -import ua.acclorite.book_story.domain.util.Resource -import javax.inject.Inject - -class CheckForTextUpdate @Inject constructor( - private val repository: BookRepository -) { - - suspend fun execute(bookId: Int): Resource, List>?> { - return repository.checkForTextUpdate(bookId) - } -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/GetText.kt b/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/GetText.kt index 5b03d6bc..c0808ee4 100644 --- a/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/GetText.kt +++ b/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/GetText.kt @@ -1,6 +1,6 @@ package ua.acclorite.book_story.domain.use_case.book -import androidx.compose.ui.text.AnnotatedString +import ua.acclorite.book_story.domain.reader.ChaptersAndText import ua.acclorite.book_story.domain.repository.BookRepository import javax.inject.Inject @@ -8,7 +8,7 @@ class GetText @Inject constructor( private val repository: BookRepository ) { - suspend fun execute(textPath: String): List { - return repository.getBookText(textPath = textPath) + suspend fun execute(bookId: Int): ChaptersAndText { + return repository.getBookText(bookId = bookId) } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/InsertBook.kt b/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/InsertBook.kt index 87e6d4e0..0ea45109 100644 --- a/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/InsertBook.kt +++ b/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/InsertBook.kt @@ -1,6 +1,6 @@ package ua.acclorite.book_story.domain.use_case.book -import ua.acclorite.book_story.domain.library.book.BookWithTextAndCover +import ua.acclorite.book_story.domain.library.book.BookWithCover import ua.acclorite.book_story.domain.repository.BookRepository import javax.inject.Inject @@ -8,9 +8,7 @@ class InsertBook @Inject constructor( private val repository: BookRepository ) { - suspend fun execute( - bookWithTextAndCover: BookWithTextAndCover - ): Boolean { - return repository.insertBook(bookWithTextAndCover) + suspend fun execute(bookWithCover: BookWithCover): Boolean { + return repository.insertBook(bookWithCover) } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/UpdateBookWithText.kt b/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/UpdateBookWithText.kt deleted file mode 100644 index 270b21ef..00000000 --- a/app/src/main/java/ua/acclorite/book_story/domain/use_case/book/UpdateBookWithText.kt +++ /dev/null @@ -1,14 +0,0 @@ -package ua.acclorite.book_story.domain.use_case.book - -import ua.acclorite.book_story.domain.library.book.BookWithText -import ua.acclorite.book_story.domain.repository.BookRepository -import javax.inject.Inject - -class UpdateBookWithText @Inject constructor( - private val repository: BookRepository -) { - - suspend fun execute(bookWithText: BookWithText): Boolean { - return repository.updateBookWithText(bookWithText) - } -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoBackHandler.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoBackHandler.kt index 00dee2fa..c8f8714e 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoBackHandler.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoBackHandler.kt @@ -9,11 +9,9 @@ fun BookInfoBackHandler( editTitle: Boolean, editAuthor: Boolean, editDescription: Boolean, - isUpdating: Boolean, editTitleMode: (BookInfoEvent.OnEditTitleMode) -> Unit, editAuthorMode: (BookInfoEvent.OnEditAuthorMode) -> Unit, editDescriptionMode: (BookInfoEvent.OnEditDescriptionMode) -> Unit, - cancelTextUpdate: (BookInfoEvent.OnCancelTextUpdate) -> Unit, navigateBack: () -> Unit ) { BackHandler { @@ -38,9 +36,6 @@ fun BookInfoBackHandler( return@BackHandler } - if (!isUpdating) { - cancelTextUpdate(BookInfoEvent.OnCancelTextUpdate) - navigateBack() - } + navigateBack() } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoBottomSheet.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoBottomSheet.kt index 6a064ed3..6b72dc32 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoBottomSheet.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoBottomSheet.kt @@ -1,6 +1,5 @@ package ua.acclorite.book_story.presentation.book_info -import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import ua.acclorite.book_story.domain.library.book.Book import ua.acclorite.book_story.domain.util.BottomSheet @@ -11,7 +10,6 @@ import ua.acclorite.book_story.ui.book_info.BookInfoScreen fun BookInfoBottomSheet( bottomSheet: BottomSheet?, book: Book, - snackbarState: SnackbarHostState, canResetCover: Boolean, changeCover: (BookInfoEvent.OnChangeCover) -> Unit, resetCover: (BookInfoEvent.OnResetCover) -> Unit, @@ -38,7 +36,6 @@ fun BookInfoBottomSheet( BookInfoScreen.MORE_BOTTOM_SHEET -> { BookInfoMoreBottomSheet( - snackbarState = snackbarState, showDetailsBottomSheet = showDetailsBottomSheet, showDeleteDialog = showDeleteDialog, showMoveDialog = showMoveDialog, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoContent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoContent.kt index 25fec44c..e1fd92d1 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoContent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoContent.kt @@ -2,8 +2,6 @@ package ua.acclorite.book_story.presentation.book_info import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.PullRefreshState -import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import ua.acclorite.book_story.domain.library.book.Book import ua.acclorite.book_story.domain.util.BottomSheet @@ -16,12 +14,8 @@ fun BookInfoContent( book: Book, bottomSheet: BottomSheet?, dialog: Dialog?, - refreshState: PullRefreshState, listState: LazyListState, - snackbarState: SnackbarHostState, canResetCover: Boolean, - isUpdating: Boolean, - checkingForUpdate: Boolean, editTitle: Boolean, titleValue: String, editAuthor: Boolean, @@ -48,14 +42,10 @@ fun BookInfoContent( resetCover: (BookInfoEvent.OnResetCover) -> Unit, deleteCover: (BookInfoEvent.OnDeleteCover) -> Unit, checkCoverReset: (BookInfoEvent.OnCheckCoverReset) -> Unit, - actionUpdateDialog: (BookInfoEvent.OnActionUpdateDialog) -> Unit, - dismissUpdateDialog: (BookInfoEvent.OnDismissUpdateDialog) -> Unit, dismissDialog: (BookInfoEvent.OnDismissDialog) -> Unit, dismissBottomSheet: (BookInfoEvent.OnDismissBottomSheet) -> Unit, updateData: (BookInfoEvent.OnUpdateData) -> Unit, copyToClipboard: (BookInfoEvent.OnCopyToClipboard) -> Unit, - checkForTextUpdate: (BookInfoEvent.OnCheckForTextUpdate) -> Unit, - cancelTextUpdate: (BookInfoEvent.OnCancelTextUpdate) -> Unit, navigateToReader: () -> Unit, navigateToLibrary: () -> Unit, navigateBack: () -> Unit @@ -63,12 +53,9 @@ fun BookInfoContent( BookInfoDialog( dialog = dialog, book = book, - snackbarState = snackbarState, actionDeleteDialog = actionDeleteDialog, actionMoveDialog = actionMoveDialog, dismissDialog = dismissDialog, - actionUpdateDialog = actionUpdateDialog, - dismissUpdateDialog = dismissUpdateDialog, navigateToLibrary = navigateToLibrary, navigateBack = navigateBack ) @@ -76,7 +63,6 @@ fun BookInfoContent( BookInfoBottomSheet( bottomSheet = bottomSheet, book = book, - snackbarState = snackbarState, canResetCover = canResetCover, changeCover = changeCover, resetCover = resetCover, @@ -91,11 +77,7 @@ fun BookInfoContent( BookInfoScaffold( book = book, - refreshState = refreshState, listState = listState, - snackbarState = snackbarState, - isUpdating = isUpdating, - checkingForUpdate = checkingForUpdate, editTitle = editTitle, titleValue = titleValue, editAuthor = editAuthor, @@ -114,8 +96,6 @@ fun BookInfoContent( showChangeCoverBottomSheet = showChangeCoverBottomSheet, showMoreBottomSheet = showMoreBottomSheet, updateData = updateData, - checkForTextUpdate = checkForTextUpdate, - cancelTextUpdate = cancelTextUpdate, navigateToReader = navigateToReader, navigateBack = navigateBack ) @@ -124,11 +104,9 @@ fun BookInfoContent( editTitle = editTitle, editAuthor = editAuthor, editDescription = editDescription, - isUpdating = isUpdating, editTitleMode = editTitleMode, editAuthorMode = editAuthorMode, editDescriptionMode = editDescriptionMode, - cancelTextUpdate = cancelTextUpdate, navigateBack = navigateBack ) } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoDialog.kt index 34e23373..baf74edc 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoDialog.kt @@ -1,6 +1,5 @@ package ua.acclorite.book_story.presentation.book_info -import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import ua.acclorite.book_story.domain.library.book.Book import ua.acclorite.book_story.domain.util.Dialog @@ -11,24 +10,13 @@ import ua.acclorite.book_story.ui.book_info.BookInfoScreen fun BookInfoDialog( dialog: Dialog?, book: Book, - snackbarState: SnackbarHostState, actionDeleteDialog: (BookInfoEvent.OnActionDeleteDialog) -> Unit, actionMoveDialog: (BookInfoEvent.OnActionMoveDialog) -> Unit, dismissDialog: (BookInfoEvent.OnDismissDialog) -> Unit, - actionUpdateDialog: (BookInfoEvent.OnActionUpdateDialog) -> Unit, - dismissUpdateDialog: (BookInfoEvent.OnDismissUpdateDialog) -> Unit, navigateBack: () -> Unit, navigateToLibrary: () -> Unit ) { when (dialog) { - BookInfoScreen.UPDATE_DIALOG -> { - BookInfoUpdateDialog( - snackbarState = snackbarState, - actionUpdateDialog = actionUpdateDialog, - dismissUpdateDialog = dismissUpdateDialog - ) - } - BookInfoScreen.DELETE_DIALOG -> { BookInfoDeleteDialog( actionDeleteDialog = actionDeleteDialog, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoFloatingActionButton.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoFloatingActionButton.kt index 4963dfc3..482b91e0 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoFloatingActionButton.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoFloatingActionButton.kt @@ -31,14 +31,11 @@ import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisib fun BoxScope.BookInfoFloatingActionButton( book: Book, listState: LazyListState, - isUpdating: Boolean, navigateToReader: () -> Unit ) { FloatingActionButton( onClick = { - if (!isUpdating) { - navigateToReader() - } + navigateToReader() }, shape = MaterialTheme.shapes.large, modifier = Modifier diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoMoreBottomSheet.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoMoreBottomSheet.kt index f2b8a0e6..0d65285e 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoMoreBottomSheet.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoMoreBottomSheet.kt @@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -17,7 +16,6 @@ import ua.acclorite.book_story.ui.book_info.BookInfoEvent @Composable fun BookInfoMoreBottomSheet( - snackbarState: SnackbarHostState, showDetailsBottomSheet: (BookInfoEvent.OnShowDetailsBottomSheet) -> Unit, showMoveDialog: (BookInfoEvent.OnShowMoveDialog) -> Unit, showDeleteDialog: (BookInfoEvent.OnShowDeleteDialog) -> Unit, @@ -37,7 +35,6 @@ fun BookInfoMoreBottomSheet( primary = false, position = Position.SOLO ) { - snackbarState.currentSnackbarData?.dismiss() showDetailsBottomSheet(BookInfoEvent.OnShowDetailsBottomSheet) } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoRefreshIndicator.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoRefreshIndicator.kt deleted file mode 100644 index e9bf6d0b..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoRefreshIndicator.kt +++ /dev/null @@ -1,31 +0,0 @@ -package ua.acclorite.book_story.presentation.book_info - -import androidx.compose.foundation.layout.BoxScope -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.padding -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.PullRefreshIndicator -import androidx.compose.material.pullrefresh.PullRefreshState -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier - -@OptIn(ExperimentalMaterialApi::class) -@Composable -fun BoxScope.BookInfoRefreshIndicator( - isUpdating: Boolean, - checkingForUpdate: Boolean, - refreshState: PullRefreshState, - paddingValues: PaddingValues -) { - PullRefreshIndicator( - refreshing = isUpdating || checkingForUpdate, - state = refreshState, - Modifier - .align(Alignment.TopCenter) - .padding(top = paddingValues.calculateTopPadding()), - backgroundColor = MaterialTheme.colorScheme.inverseSurface, - contentColor = MaterialTheme.colorScheme.inverseOnSurface - ) -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoScaffold.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoScaffold.kt index 8b711e1f..698b9d07 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoScaffold.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoScaffold.kt @@ -5,31 +5,21 @@ import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.PullRefreshState -import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp import ua.acclorite.book_story.domain.library.book.Book -import ua.acclorite.book_story.presentation.core.components.common.Snackbar import ua.acclorite.book_story.ui.book_info.BookInfoEvent @OptIn(ExperimentalMaterialApi::class) @Composable fun BookInfoScaffold( book: Book, - refreshState: PullRefreshState, listState: LazyListState, - snackbarState: SnackbarHostState, - isUpdating: Boolean, - checkingForUpdate: Boolean, editTitle: Boolean, titleValue: String, editAuthor: Boolean, @@ -48,8 +38,6 @@ fun BookInfoScaffold( showChangeCoverBottomSheet: (BookInfoEvent.OnShowChangeCoverBottomSheet) -> Unit, showMoreBottomSheet: (BookInfoEvent.OnShowMoreBottomSheet) -> Unit, updateData: (BookInfoEvent.OnUpdateData) -> Unit, - checkForTextUpdate: (BookInfoEvent.OnCheckForTextUpdate) -> Unit, - cancelTextUpdate: (BookInfoEvent.OnCancelTextUpdate) -> Unit, navigateToReader: () -> Unit, navigateBack: () -> Unit ) { @@ -57,16 +45,12 @@ fun BookInfoScaffold( Modifier .fillMaxSize() .imePadding() - .windowInsetsPadding(WindowInsets.navigationBars) - .pullRefresh(refreshState), + .windowInsetsPadding(WindowInsets.navigationBars), containerColor = MaterialTheme.colorScheme.surface, topBar = { BookInfoTopBar( book = book, listState = listState, - snackbarState = snackbarState, - isUpdating = isUpdating, - checkingForUpdate = checkingForUpdate, editTitle = editTitle, titleValue = titleValue, editAuthor = editAuthor, @@ -78,16 +62,8 @@ fun BookInfoScaffold( editDescriptionMode = editDescriptionMode, updateData = updateData, showMoreBottomSheet = showMoreBottomSheet, - checkForTextUpdate = checkForTextUpdate, - cancelTextUpdate = cancelTextUpdate, navigateBack = navigateBack ) - }, - bottomBar = { - Snackbar( - modifier = Modifier.padding(bottom = 70.dp), - snackbarState = snackbarState - ) } ) { paddingValues -> Box(Modifier.fillMaxSize()) { @@ -116,16 +92,8 @@ fun BookInfoScaffold( BookInfoFloatingActionButton( book = book, listState = listState, - isUpdating = isUpdating, navigateToReader = navigateToReader ) - - BookInfoRefreshIndicator( - isUpdating = isUpdating, - checkingForUpdate = checkingForUpdate, - refreshState = refreshState, - paddingValues = paddingValues - ) } } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoTopBar.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoTopBar.kt index 24250882..a55e9a51 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoTopBar.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoTopBar.kt @@ -7,15 +7,12 @@ import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.outlined.Done -import androidx.compose.material.icons.outlined.Refresh import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.library.book.Book @@ -34,9 +31,6 @@ import ua.acclorite.book_story.ui.theme.Transitions fun BookInfoTopBar( book: Book, listState: LazyListState, - snackbarState: SnackbarHostState, - isUpdating: Boolean, - checkingForUpdate: Boolean, editTitle: Boolean, titleValue: String, editAuthor: Boolean, @@ -48,12 +42,8 @@ fun BookInfoTopBar( editDescriptionMode: (BookInfoEvent.OnEditDescriptionMode) -> Unit, updateData: (BookInfoEvent.OnUpdateData) -> Unit, showMoreBottomSheet: (BookInfoEvent.OnShowMoreBottomSheet) -> Unit, - checkForTextUpdate: (BookInfoEvent.OnCheckForTextUpdate) -> Unit, - cancelTextUpdate: (BookInfoEvent.OnCancelTextUpdate) -> Unit, navigateBack: () -> Unit ) { - val context = LocalContext.current - val firstVisibleItemIndex = remember { derivedStateOf { listState.firstVisibleItemIndex @@ -99,8 +89,7 @@ fun BookInfoTopBar( } } } else { - NavigatorBackIconButton(enabled = !isUpdating) { - cancelTextUpdate(BookInfoEvent.OnCancelTextUpdate) + NavigatorBackIconButton { navigateBack() } } @@ -117,20 +106,6 @@ fun BookInfoTopBar( } }, contentActions = { - IconButton( - icon = Icons.Outlined.Refresh, - contentDescription = R.string.refresh_book_content_desc, - disableOnClick = false, - enabled = !isUpdating && !checkingForUpdate - ) { - checkForTextUpdate( - BookInfoEvent.OnCheckForTextUpdate( - snackbarState = snackbarState, - context = context - ) - ) - } - Box { DefaultTransition( visible = !editTitle && @@ -152,8 +127,7 @@ fun BookInfoTopBar( icon = Icons.Outlined.Done, contentDescription = R.string.apply_changes_content_desc, disableOnClick = true, - enabled = !isUpdating && - titleChanged || + enabled = titleChanged || authorChanged || descriptionChanged, color = if ( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoUpdateDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoUpdateDialog.kt deleted file mode 100644 index 1666af50..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/book_info/BookInfoUpdateDialog.kt +++ /dev/null @@ -1,40 +0,0 @@ -package ua.acclorite.book_story.presentation.book_info - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Update -import androidx.compose.material3.SnackbarHostState -import androidx.compose.runtime.Composable -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource -import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.dialog.Dialog -import ua.acclorite.book_story.ui.book_info.BookInfoEvent - -@Composable -fun BookInfoUpdateDialog( - snackbarState: SnackbarHostState, - actionUpdateDialog: (BookInfoEvent.OnActionUpdateDialog) -> Unit, - dismissUpdateDialog: (BookInfoEvent.OnDismissUpdateDialog) -> Unit -) { - val context = LocalContext.current - - Dialog( - title = stringResource(id = R.string.confirm_update), - imageVectorIcon = Icons.Default.Update, - description = stringResource( - id = R.string.confirm_update_description - ), - actionText = stringResource(id = R.string.confirm), - actionEnabled = true, - onDismiss = { dismissUpdateDialog(BookInfoEvent.OnDismissUpdateDialog) }, - onAction = { - actionUpdateDialog( - BookInfoEvent.OnActionUpdateDialog( - snackbarState = snackbarState, - context = context - ) - ) - }, - withDivider = false - ) -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/browse/BrowseAddDialogItem.kt b/app/src/main/java/ua/acclorite/book_story/presentation/browse/BrowseAddDialogItem.kt index b2b1658b..e1489171 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/browse/BrowseAddDialogItem.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/browse/BrowseAddDialogItem.kt @@ -40,14 +40,14 @@ fun BrowseAddDialogItem(result: SelectableNullableBook, onClick: (Boolean) -> Un Modifier.weight(1f) ) { Text( - text = result.data.bookWithTextAndCover!!.book.title, + text = result.data.bookWithCover!!.book.title, style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, maxLines = 1, overflow = TextOverflow.Ellipsis ) Text( - text = result.data.bookWithTextAndCover.book.author.asString(), + text = result.data.bookWithCover.book.author.asString(), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, maxLines = 1, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/CommonConstants.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/CommonConstants.kt index 5fc71896..510b0c41 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/CommonConstants.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/CommonConstants.kt @@ -17,7 +17,6 @@ fun Constants.provideEmptyBook() = Book( title = "", author = UIText.StringValue(""), description = null, - textPath = "", filePath = "", coverImage = null, scrollIndex = 0, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt index bd543275..27634333 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt @@ -38,8 +38,6 @@ object DataStoreConstants { val PERCEPTION_EXPANDER = booleanPreferencesKey("perception_expander") val PERCEPTION_EXPANDER_PADDING = intPreferencesKey("perception_expander_padding") val PERCEPTION_EXPANDER_THICKNESS = intPreferencesKey("perception_expander_thickness") - val CHECK_FOR_TEXT_UPDATE = booleanPreferencesKey("check_for_text_update") - val CHECK_FOR_TEXT_UPDATE_TOAST = booleanPreferencesKey("check_for_text_update_toast") val SCREEN_ORIENTATION = stringPreferencesKey("screen_orientation") val CUSTOM_SCREEN_BRIGHTNESS = booleanPreferencesKey("custom_screen_brightness") val SCREEN_BRIGHTNESS = doublePreferencesKey("screen_brightness") diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/HelpTipConstants.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/HelpTipConstants.kt index c7602fc2..6853ca1c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/HelpTipConstants.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/HelpTipConstants.kt @@ -95,20 +95,6 @@ fun Constants.provideHelpTips() = listOf( } ), - HelpTip( - title = R.string.help_title_how_to_update_book, - description = { - append(stringResource(id = R.string.help_desc_how_to_update_book_1) + " ") - - HelpAnnotation { - append(stringResource(id = R.string.help_desc_how_to_update_book_2)) - } - append(" ") - - append(stringResource(id = R.string.help_desc_how_to_update_book_3)) - } - ), - HelpTip( title = R.string.help_title_how_to_manage_history, description = { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt index 8045721b..9b84099c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt @@ -17,7 +17,6 @@ import ua.acclorite.book_story.domain.reader.ReaderHorizontalGesture import ua.acclorite.book_story.domain.reader.ReaderTextAlignment import ua.acclorite.book_story.domain.ui.UIText import ua.acclorite.book_story.domain.util.BottomSheet -import ua.acclorite.book_story.domain.util.Dialog import ua.acclorite.book_story.domain.util.Drawer import ua.acclorite.book_story.ui.reader.ReaderEvent import ua.acclorite.book_story.ui.settings.SettingsEvent @@ -26,7 +25,6 @@ import ua.acclorite.book_story.ui.settings.SettingsEvent fun ReaderContent( book: Book, text: List, - dialog: Dialog?, bottomSheet: BottomSheet?, drawer: Drawer?, listState: LazyListState, @@ -40,8 +38,6 @@ fun ReaderContent( isLoading: Boolean, errorMessage: UIText?, checkpoint: Checkpoint, - checkingForUpdate: Boolean, - updateFound: Boolean, showMenu: Boolean, lockMenu: Boolean, chapters: Map, @@ -76,24 +72,13 @@ fun ReaderContent( openTranslator: (ReaderEvent.OnOpenTranslator) -> Unit, openDictionary: (ReaderEvent.OnOpenDictionary) -> Unit, scrollToChapter: (ReaderEvent.OnScrollToChapter) -> Unit, - updateText: (ReaderEvent.OnUpdateText) -> Unit, - dismissDialog: (ReaderEvent.OnDismissDialog) -> Unit, - cancelCheckForTextUpdate: (ReaderEvent.OnCancelCheckForTextUpdate) -> Unit, - showUpdateDialog: (ReaderEvent.OnShowUpdateDialog) -> Unit, showSettingsBottomSheet: (ReaderEvent.OnShowSettingsBottomSheet) -> Unit, dismissBottomSheet: (ReaderEvent.OnDismissBottomSheet) -> Unit, showChaptersDrawer: (ReaderEvent.OnShowChaptersDrawer) -> Unit, dismissDrawer: (ReaderEvent.OnDismissDrawer) -> Unit, navigateBack: () -> Unit, - navigateToBookInfo: (startUpdate: Boolean) -> Unit + navigateToBookInfo: () -> Unit ) { - ReaderDialog( - dialog = dialog, - updateText = updateText, - dismissDialog = dismissDialog, - navigateToBookInfo = navigateToBookInfo - ) - ReaderBottomSheet( bottomSheet = bottomSheet, fullscreenMode = fullscreenMode, @@ -115,8 +100,6 @@ fun ReaderContent( isLoading = isLoading, errorMessage = errorMessage, checkpoint = checkpoint, - checkingForUpdate = checkingForUpdate, - updateFound = updateFound, showMenu = showMenu, lockMenu = lockMenu, chapters = chapters, @@ -150,8 +133,6 @@ fun ReaderContent( openWebBrowser = openWebBrowser, openTranslator = openTranslator, openDictionary = openDictionary, - cancelCheckForTextUpdate = cancelCheckForTextUpdate, - showUpdateDialog = showUpdateDialog, showSettingsBottomSheet = showSettingsBottomSheet, showChaptersDrawer = showChaptersDrawer, navigateBack = navigateBack, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderDialog.kt deleted file mode 100644 index 98dba5a2..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderDialog.kt +++ /dev/null @@ -1,24 +0,0 @@ -package ua.acclorite.book_story.presentation.reader - -import androidx.compose.runtime.Composable -import ua.acclorite.book_story.domain.util.Dialog -import ua.acclorite.book_story.ui.reader.ReaderEvent -import ua.acclorite.book_story.ui.reader.ReaderScreen - -@Composable -fun ReaderDialog( - dialog: Dialog?, - updateText: (ReaderEvent.OnUpdateText) -> Unit, - dismissDialog: (ReaderEvent.OnDismissDialog) -> Unit, - navigateToBookInfo: (startUpdate: Boolean) -> Unit -) { - when (dialog) { - ReaderScreen.UPDATE_DIALOG -> { - ReaderUpdateDialog( - updateText = updateText, - dismissDialog = dismissDialog, - navigateToBookInfo = navigateToBookInfo - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt index 4b58152e..75914d6f 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt @@ -45,8 +45,6 @@ fun ReaderScaffold( isLoading: Boolean, errorMessage: UIText?, checkpoint: Checkpoint, - checkingForUpdate: Boolean, - updateFound: Boolean, showMenu: Boolean, lockMenu: Boolean, chapters: Map, @@ -80,12 +78,10 @@ fun ReaderScaffold( openWebBrowser: (ReaderEvent.OnOpenWebBrowser) -> Unit, openTranslator: (ReaderEvent.OnOpenTranslator) -> Unit, openDictionary: (ReaderEvent.OnOpenDictionary) -> Unit, - cancelCheckForTextUpdate: (ReaderEvent.OnCancelCheckForTextUpdate) -> Unit, - showUpdateDialog: (ReaderEvent.OnShowUpdateDialog) -> Unit, showSettingsBottomSheet: (ReaderEvent.OnShowSettingsBottomSheet) -> Unit, showChaptersDrawer: (ReaderEvent.OnShowChaptersDrawer) -> Unit, navigateBack: () -> Unit, - navigateToBookInfo: (startUpdate: Boolean) -> Unit + navigateToBookInfo: () -> Unit ) { Scaffold( Modifier @@ -104,14 +100,10 @@ fun ReaderScaffold( fastColorPresetChange = fastColorPresetChange, currentChapterProgress = currentChapterProgress, isLoading = isLoading, - checkingForUpdate = checkingForUpdate, - updateFound = updateFound, lockMenu = lockMenu, leave = leave, selectPreviousPreset = selectPreviousPreset, selectNextPreset = selectNextPreset, - cancelCheckForTextUpdate = cancelCheckForTextUpdate, - showUpdateDialog = showUpdateDialog, showSettingsBottomSheet = showSettingsBottomSheet, showChaptersDrawer = showChaptersDrawer, navigateBack = navigateBack, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderTopBar.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderTopBar.kt index a7798bb4..0468c26d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderTopBar.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderTopBar.kt @@ -1,21 +1,15 @@ package ua.acclorite.book_story.presentation.reader import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.animation.shrinkHorizontally import androidx.compose.foundation.background import androidx.compose.foundation.basicMarquee -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.rounded.Menu -import androidx.compose.material.icons.rounded.Upgrade import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.LinearProgressIndicator @@ -24,7 +18,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextOverflow @@ -33,9 +26,7 @@ import androidx.compose.ui.unit.sp import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.library.book.Book import ua.acclorite.book_story.domain.reader.Chapter -import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility import ua.acclorite.book_story.presentation.core.components.common.IconButton -import ua.acclorite.book_story.presentation.core.components.progress_indicator.CircularProgressIndicator import ua.acclorite.book_story.presentation.core.util.LocalActivity import ua.acclorite.book_story.presentation.core.util.noRippleClickable import ua.acclorite.book_story.ui.reader.ReaderEvent @@ -50,18 +41,14 @@ fun ReaderTopBar( fastColorPresetChange: Boolean, currentChapterProgress: Float, isLoading: Boolean, - checkingForUpdate: Boolean, - updateFound: Boolean, lockMenu: Boolean, leave: (ReaderEvent.OnLeave) -> Unit, selectPreviousPreset: (SettingsEvent.OnSelectPreviousPreset) -> Unit, selectNextPreset: (SettingsEvent.OnSelectNextPreset) -> Unit, - cancelCheckForTextUpdate: (ReaderEvent.OnCancelCheckForTextUpdate) -> Unit, - showUpdateDialog: (ReaderEvent.OnShowUpdateDialog) -> Unit, showSettingsBottomSheet: (ReaderEvent.OnShowSettingsBottomSheet) -> Unit, showChaptersDrawer: (ReaderEvent.OnShowChaptersDrawer) -> Unit, navigateBack: () -> Unit, - navigateToBookInfo: (startUpdate: Boolean) -> Unit + navigateToBookInfo: () -> Unit ) { val activity = LocalActivity.current val animatedChapterProgress = animateFloatAsState( @@ -113,17 +100,13 @@ fun ReaderTopBar( ReaderEvent.OnLeave( activity = activity, navigate = { - navigateToBookInfo(false) + navigateToBookInfo() } ) ) } ) - .then( - if (checkingForUpdate || updateFound) Modifier - else Modifier.basicMarquee(iterations = Int.MAX_VALUE) - ) - ) + .basicMarquee(iterations = Int.MAX_VALUE)) }, subtitle = { Text( @@ -136,38 +119,6 @@ fun ReaderTopBar( ) }, actions = { - AnimatedVisibility( - visible = checkingForUpdate || updateFound, - enter = fadeIn(), - exit = shrinkHorizontally() + fadeOut() - ) { - Box( - modifier = Modifier.size(40.dp), - contentAlignment = Alignment.Center - ) { - if (updateFound) { - IconButton( - icon = Icons.Rounded.Upgrade, - contentDescription = R.string.update_text_content_desc, - color = MaterialTheme.colorScheme.primary, - disableOnClick = false, - enabled = !lockMenu && !checkingForUpdate - ) { - showUpdateDialog(ReaderEvent.OnShowUpdateDialog) - } - } else { - CircularProgressIndicator( - modifier = Modifier - .size(19.dp) - .noRippleClickable { - cancelCheckForTextUpdate(ReaderEvent.OnCancelCheckForTextUpdate) - }, - strokeWidth = 2.4.dp - ) - } - } - } - if (currentChapter != null) { IconButton( icon = Icons.Rounded.Menu, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderUpdateDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderUpdateDialog.kt deleted file mode 100644 index 460df298..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderUpdateDialog.kt +++ /dev/null @@ -1,41 +0,0 @@ -package ua.acclorite.book_story.presentation.reader - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.Upgrade -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.dialog.Dialog -import ua.acclorite.book_story.presentation.core.util.LocalActivity -import ua.acclorite.book_story.ui.reader.ReaderEvent - -@Composable -fun ReaderUpdateDialog( - updateText: (ReaderEvent.OnUpdateText) -> Unit, - dismissDialog: (ReaderEvent.OnDismissDialog) -> Unit, - navigateToBookInfo: (startUpdate: Boolean) -> Unit -) { - val activity = LocalActivity.current - - Dialog( - title = stringResource(id = R.string.update_book), - imageVectorIcon = Icons.Rounded.Upgrade, - description = stringResource( - id = R.string.update_book_description - ), - actionText = stringResource(id = R.string.proceed), - actionEnabled = true, - onDismiss = { dismissDialog(ReaderEvent.OnDismissDialog) }, - onAction = { - updateText( - ReaderEvent.OnUpdateText( - activity = activity, - navigateToBookInfo = { - navigateToBookInfo(true) - } - ) - ) - }, - withDivider = false - ) -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/MiscSubcategory.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/MiscSubcategory.kt index 21213082..07977356 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/MiscSubcategory.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/MiscSubcategory.kt @@ -9,8 +9,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.settings.components.SettingsSubcategory -import ua.acclorite.book_story.presentation.settings.reader.misc.components.CheckForTextUpdateOption -import ua.acclorite.book_story.presentation.settings.reader.misc.components.CheckForTextUpdateToastOption import ua.acclorite.book_story.presentation.settings.reader.misc.components.FullscreenOption import ua.acclorite.book_story.presentation.settings.reader.misc.components.HideBarsOnFastScrollOption import ua.acclorite.book_story.presentation.settings.reader.misc.components.KeepScreenOnOption @@ -27,14 +25,6 @@ fun LazyListScope.MiscSubcategory( showTitle = showTitle, showDivider = showDivider, ) { - item { - CheckForTextUpdateOption() - } - - item { - CheckForTextUpdateToastOption() - } - item { FullscreenOption() } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/components/CheckForTextUpdateOption.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/components/CheckForTextUpdateOption.kt deleted file mode 100644 index d44f956e..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/components/CheckForTextUpdateOption.kt +++ /dev/null @@ -1,29 +0,0 @@ -package ua.acclorite.book_story.presentation.settings.reader.misc.components - -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.settings.SwitchWithTitle -import ua.acclorite.book_story.ui.main.MainEvent -import ua.acclorite.book_story.ui.main.MainModel - -@Composable -fun CheckForTextUpdateOption() { - val mainModel = hiltViewModel() - val state = mainModel.state.collectAsStateWithLifecycle() - - SwitchWithTitle( - selected = state.value.checkForTextUpdate, - title = stringResource(id = R.string.check_for_text_update_option), - description = stringResource(id = R.string.check_for_text_update_option_desc), - onClick = { - mainModel.onEvent( - MainEvent.OnChangeCheckForTextUpdate( - !state.value.checkForTextUpdate - ) - ) - } - ) -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/components/CheckForTextUpdateToastOption.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/components/CheckForTextUpdateToastOption.kt deleted file mode 100644 index b9ff85a6..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/misc/components/CheckForTextUpdateToastOption.kt +++ /dev/null @@ -1,31 +0,0 @@ -package ua.acclorite.book_story.presentation.settings.reader.misc.components - -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.settings.SwitchWithTitle -import ua.acclorite.book_story.ui.main.MainEvent -import ua.acclorite.book_story.ui.main.MainModel -import ua.acclorite.book_story.ui.theme.ExpandingTransition - -@Composable -fun CheckForTextUpdateToastOption() { - val mainModel = hiltViewModel() - val state = mainModel.state.collectAsStateWithLifecycle() - - ExpandingTransition(visible = state.value.checkForTextUpdate) { - SwitchWithTitle( - selected = state.value.checkForTextUpdateToast, - title = stringResource(id = R.string.check_for_text_update_toast_option), - onClick = { - mainModel.onEvent( - MainEvent.OnChangeCheckForTextUpdateToast( - !state.value.checkForTextUpdateToast - ) - ) - } - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoEvent.kt b/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoEvent.kt index bf1e19a0..663cc1aa 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoEvent.kt @@ -2,11 +2,9 @@ package ua.acclorite.book_story.ui.book_info import android.content.Context import android.net.Uri -import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Immutable import androidx.compose.ui.focus.FocusRequester import ua.acclorite.book_story.domain.library.category.Category -import ua.acclorite.book_story.domain.reader.Chapter @Immutable sealed class BookInfoEvent { @@ -54,14 +52,6 @@ sealed class BookInfoEvent { data object OnUpdateData : BookInfoEvent() - data class OnShowSnackbar( - val text: String, - val action: String?, - val onAction: () -> Unit = {}, - val durationMillis: Long, - val snackbarState: SnackbarHostState - ) : BookInfoEvent() - data object OnShowChangeCoverBottomSheet : BookInfoEvent() data class OnChangeCover( @@ -101,23 +91,4 @@ sealed class BookInfoEvent { ) : BookInfoEvent() data object OnDismissDialog : BookInfoEvent() - - data class OnCheckForTextUpdate( - val snackbarState: SnackbarHostState, - val context: Context - ) : BookInfoEvent() - - data class OnShowUpdateDialog( - val updatedText: List, - val updatedChapters: List - ) : BookInfoEvent() - - data class OnActionUpdateDialog( - val snackbarState: SnackbarHostState, - val context: Context - ) : BookInfoEvent() - - data object OnDismissUpdateDialog : BookInfoEvent() - - data object OnCancelTextUpdate : BookInfoEvent() } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoModel.kt b/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoModel.kt index ebefc78e..5b1f1ff7 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoModel.kt @@ -2,12 +2,9 @@ package ua.acclorite.book_story.ui.book_info import android.content.ClipData import android.content.ClipboardManager -import android.content.Context import android.content.Context.CLIPBOARD_SERVICE import android.graphics.BitmapFactory import android.os.Build -import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.SnackbarResult import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -15,7 +12,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch @@ -24,36 +20,29 @@ import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import kotlinx.coroutines.yield import ua.acclorite.book_story.R -import ua.acclorite.book_story.domain.library.book.BookWithText import ua.acclorite.book_story.domain.library.category.Category import ua.acclorite.book_story.domain.ui.UIText import ua.acclorite.book_story.domain.use_case.book.CanResetCover -import ua.acclorite.book_story.domain.use_case.book.CheckForTextUpdate import ua.acclorite.book_story.domain.use_case.book.DeleteBooks import ua.acclorite.book_story.domain.use_case.book.GetBookById import ua.acclorite.book_story.domain.use_case.book.ResetCoverImage import ua.acclorite.book_story.domain.use_case.book.UpdateBook -import ua.acclorite.book_story.domain.use_case.book.UpdateBookWithText import ua.acclorite.book_story.domain.use_case.book.UpdateCoverImageOfBook -import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.ui.browse.BrowseScreen import ua.acclorite.book_story.ui.history.HistoryScreen import ua.acclorite.book_story.ui.library.LibraryScreen import javax.inject.Inject -import kotlin.math.roundToInt @OptIn(FlowPreview::class) @HiltViewModel class BookInfoModel @Inject constructor( private val getBookById: GetBookById, - private val checkForTextUpdate: CheckForTextUpdate, private val updateBook: UpdateBook, private val canResetCover: CanResetCover, private val updateCoverImageOfBook: UpdateCoverImageOfBook, private val resetCoverImage: ResetCoverImage, - private val deleteBooks: DeleteBooks, - private val updateBookWithText: UpdateBookWithText + private val deleteBooks: DeleteBooks ) : ViewModel() { private val mutex = Mutex() @@ -64,9 +53,6 @@ class BookInfoModel @Inject constructor( private var eventJob = SupervisorJob() private var resetJob: Job? = null - private var updateJob: Job? = null - private var snackBarJob: Job? = null - fun onEvent(event: BookInfoEvent) { viewModelScope.launch(eventJob + Dispatchers.Main) { when (event) { @@ -245,34 +231,6 @@ class BookInfoModel @Inject constructor( } } - is BookInfoEvent.OnShowSnackbar -> { - launch { - snackBarJob?.cancel() - event.snackbarState.currentSnackbarData?.dismiss() - - if (event.durationMillis > 0) { - snackBarJob = launch(Dispatchers.IO) { - yield() - delay(event.durationMillis) - yield() - event.snackbarState.currentSnackbarData?.dismiss() - } - } - - val snackbar = event.snackbarState.showSnackbar( - event.text, - actionLabel = event.action - ) - - when (snackbar) { - SnackbarResult.Dismissed -> Unit - SnackbarResult.ActionPerformed -> { - event.onAction() - } - } - } - } - is BookInfoEvent.OnShowChangeCoverBottomSheet -> { _state.update { it.copy( @@ -505,276 +463,12 @@ class BookInfoModel @Inject constructor( ) } } - - is BookInfoEvent.OnCheckForTextUpdate -> { - updateJob?.cancel() - updateJob = launch(Dispatchers.IO) { - _state.update { - it.copy( - dialog = null, - checkingForUpdate = true, - editTitle = false, - editAuthor = false, - editDescription = false - ) - } - - yield() - - val result = checkForTextUpdate.execute(bookId = _state.value.book.id) - when (result) { - is Resource.Success -> { - if (result.data == null) { - onEvent( - BookInfoEvent.OnShowSnackbar( - event.context.getString(R.string.nothing_changed), - action = null, - durationMillis = 4000L, - snackbarState = event.snackbarState - ) - ) - delay(500) - _state.update { - it.copy( - checkingForUpdate = false - ) - } - return@launch - } else { - onEvent( - BookInfoEvent.OnShowUpdateDialog( - updatedText = result.data.first, - updatedChapters = result.data.second - ) - ) - - _state.update { - it.copy( - checkingForUpdate = false - ) - } - return@launch - } - } - - is Resource.Error -> { - onEvent( - BookInfoEvent.OnShowSnackbar( - text = result.message?.asString(event.context) ?: "", - action = event.context.getString(R.string.retry), - onAction = { - onEvent( - BookInfoEvent.OnCheckForTextUpdate( - snackbarState = event.snackbarState, - context = event.context - ) - ) - }, - durationMillis = 4000L, - snackbarState = event.snackbarState - ) - ) - - delay(500) - _state.update { - it.copy( - checkingForUpdate = false - ) - } - return@launch - } - } - } - } - - is BookInfoEvent.OnShowUpdateDialog -> { - _state.update { - it.copy( - dialog = BookInfoScreen.UPDATE_DIALOG, - updatedText = event.updatedText, - updatedChapters = event.updatedChapters - ) - } - } - - is BookInfoEvent.OnActionUpdateDialog -> { - launch(Dispatchers.IO) { - _state.update { - it.copy( - isUpdating = true, - dialog = null - ) - } - - if (_state.value.updatedText == null || _state.value.updatedChapters == null) { - onEvent( - BookInfoEvent.OnShowSnackbar( - text = event.context.getString( - R.string.error_something_went_wrong_with_file - ), - action = event.context.getString(R.string.retry), - onAction = { - onEvent( - BookInfoEvent.OnCheckForTextUpdate( - snackbarState = event.snackbarState, - context = event.context - ) - ) - }, - durationMillis = 4000L, - snackbarState = event.snackbarState - ) - ) - - delay(500) - _state.update { - it.copy( - isUpdating = false, - updatedText = null, - updatedChapters = null - ) - } - return@launch - } - - val updatedText = _state.value.updatedText ?: return@launch - val updatedChapters = _state.value.updatedChapters ?: return@launch - - updateBookWithText.execute( - BookWithText( - book = _state.value.book.copy( - scrollIndex = (updatedText.size * _state.value.book.progress).roundToInt(), - scrollOffset = 0, - chapters = updatedChapters - ), - text = updatedText - ) - ).apply { - if (this) return@apply - - onEvent( - BookInfoEvent.OnShowSnackbar( - text = event.context.getString( - R.string.error_something_went_wrong_with_file - ), - action = event.context.getString(R.string.retry), - onAction = { - onEvent( - BookInfoEvent.OnCheckForTextUpdate( - snackbarState = event.snackbarState, - context = event.context - ) - ) - }, - durationMillis = 4000L, - snackbarState = event.snackbarState - ) - ) - - delay(500) - _state.update { - it.copy( - isUpdating = false, - updatedText = null, - updatedChapters = null - ) - } - return@launch - } - - getBookById.execute(_state.value.book.id).apply { - if (this == null) { - onEvent( - BookInfoEvent.OnShowSnackbar( - text = event.context.getString( - R.string.error_something_went_wrong_with_file - ), - action = event.context.getString(R.string.retry), - onAction = { - onEvent( - BookInfoEvent.OnCheckForTextUpdate( - snackbarState = event.snackbarState, - context = event.context - ) - ) - }, - durationMillis = 4000L, - snackbarState = event.snackbarState - ) - ) - - delay(500) - _state.update { - it.copy( - isUpdating = false, - updatedText = null, - updatedChapters = null - ) - } - return@launch - } - - _state.update { - it.copy( - book = this, - updatedText = null, - updatedChapters = null - ) - } - - LibraryScreen.refreshListChannel.trySend(0) - HistoryScreen.refreshListChannel.trySend(0) - - onEvent( - BookInfoEvent.OnShowSnackbar( - event.context.getString(R.string.book_updated), - action = null, - durationMillis = 4000L, - snackbarState = event.snackbarState - ) - ) - - delay(500) - _state.update { - it.copy( - isUpdating = false - ) - } - } - } - } - - is BookInfoEvent.OnDismissUpdateDialog -> { - _state.update { - it.copy( - dialog = null, - updatedText = null, - updatedChapters = null - ) - } - } - - is BookInfoEvent.OnCancelTextUpdate -> { - _state.update { - updateJob?.cancel() - - it.copy( - dialog = null, - checkingForUpdate = false, - updatedText = null, - updatedChapters = null - ) - } - } } } } fun init( bookId: Int, - startUpdate: Boolean, - snackbarState: SnackbarHostState, - context: Context, navigateBack: () -> Unit ) { viewModelScope.launch(Dispatchers.IO) { @@ -797,14 +491,6 @@ class BookInfoModel @Inject constructor( ) } - if (startUpdate) { - onEvent( - BookInfoEvent.OnCheckForTextUpdate( - snackbarState = snackbarState, - context = context - ) - ) - } onEvent(BookInfoEvent.OnCheckCoverReset) } } diff --git a/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoScreen.kt b/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoScreen.kt index 058b91f0..bea6baed 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoScreen.kt @@ -3,17 +3,11 @@ package ua.acclorite.book_story.ui.book_info import android.os.Parcelable import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.rememberPullRefreshState -import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.channels.getOrElse import kotlinx.parcelize.Parcelize import ua.acclorite.book_story.domain.navigator.Screen import ua.acclorite.book_story.presentation.book_info.BookInfoContent @@ -26,15 +20,12 @@ import ua.acclorite.book_story.ui.reader.ReaderScreen data class BookInfoScreen(val bookId: Int) : Screen, Parcelable { companion object { - const val UPDATE_DIALOG = "update_dialog" const val DELETE_DIALOG = "delete_dialog" const val MOVE_DIALOG = "move_dialog" const val CHANGE_COVER_BOTTOM_SHEET = "change_cover_bottom_sheet" const val MORE_BOTTOM_SHEET = "more_bottom_sheet" const val DETAILS_BOTTOM_SHEET = "details_bottom_sheet" - - val startUpdateChannel: Channel = Channel(Channel.CONFLATED) } @OptIn(ExperimentalMaterialApi::class) @@ -44,28 +35,11 @@ data class BookInfoScreen(val bookId: Int) : Screen, Parcelable { val screenModel = hiltViewModel() val state = screenModel.state.collectAsStateWithLifecycle() - - val context = LocalContext.current - val snackbarState = remember { SnackbarHostState() } val listState = rememberLazyListState() - val refreshState = rememberPullRefreshState( - refreshing = state.value.isUpdating || state.value.checkingForUpdate, - onRefresh = { - screenModel.onEvent( - BookInfoEvent.OnCheckForTextUpdate( - snackbarState = snackbarState, - context = context - ) - ) - } - ) LaunchedEffect(Unit) { screenModel.init( bookId = bookId, - startUpdate = startUpdateChannel.tryReceive().getOrElse { false }, - snackbarState = snackbarState, - context = context, navigateBack = { navigator.pop() } @@ -82,9 +56,7 @@ data class BookInfoScreen(val bookId: Int) : Screen, Parcelable { book = state.value.book, bottomSheet = state.value.bottomSheet, dialog = state.value.dialog, - refreshState = refreshState, listState = listState, - snackbarState = snackbarState, canResetCover = state.value.canResetCover, editTitle = state.value.editTitle, titleValue = state.value.titleValue, @@ -92,8 +64,6 @@ data class BookInfoScreen(val bookId: Int) : Screen, Parcelable { authorValue = state.value.authorValue, editDescription = state.value.editDescription, descriptionValue = state.value.descriptionValue, - isUpdating = state.value.isUpdating, - checkingForUpdate = state.value.checkingForUpdate, editTitleMode = screenModel::onEvent, editTitleValueChange = screenModel::onEvent, editTitleRequestFocus = screenModel::onEvent, @@ -116,12 +86,8 @@ data class BookInfoScreen(val bookId: Int) : Screen, Parcelable { actionMoveDialog = screenModel::onEvent, showDeleteDialog = screenModel::onEvent, actionDeleteDialog = screenModel::onEvent, - actionUpdateDialog = screenModel::onEvent, - dismissUpdateDialog = screenModel::onEvent, updateData = screenModel::onEvent, copyToClipboard = screenModel::onEvent, - checkForTextUpdate = screenModel::onEvent, - cancelTextUpdate = screenModel::onEvent, navigateToReader = { if (state.value.book.id != -1) { HistoryScreen.insertHistoryChannel.trySend(state.value.book.id) diff --git a/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoState.kt b/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoState.kt index f74b096d..7e2a68b0 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoState.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/book_info/BookInfoState.kt @@ -2,7 +2,6 @@ package ua.acclorite.book_story.ui.book_info import androidx.compose.runtime.Immutable import ua.acclorite.book_story.domain.library.book.Book -import ua.acclorite.book_story.domain.reader.Chapter import ua.acclorite.book_story.domain.util.BottomSheet import ua.acclorite.book_story.domain.util.Dialog import ua.acclorite.book_story.presentation.core.constants.Constants @@ -12,11 +11,6 @@ import ua.acclorite.book_story.presentation.core.constants.provideEmptyBook data class BookInfoState( val book: Book = Constants.provideEmptyBook(), - val checkingForUpdate: Boolean = false, - val isUpdating: Boolean = false, - val updatedText: List? = null, - val updatedChapters: List? = null, - val editTitle: Boolean = false, val hasTitleFocused: Boolean = false, val titleValue: String = "", diff --git a/app/src/main/java/ua/acclorite/book_story/ui/browse/BrowseModel.kt b/app/src/main/java/ua/acclorite/book_story/ui/browse/BrowseModel.kt index a4ef38f9..23fc8260 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/browse/BrowseModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/browse/BrowseModel.kt @@ -518,7 +518,7 @@ class BrowseModel @Inject constructor( var failed = false for (book in booksToInsert) { - if (!insertBook.execute(book.bookWithTextAndCover!!)) { + if (!insertBook.execute(book.bookWithCover!!)) { failed = true break } diff --git a/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt b/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt index 51832a55..e1489fb4 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt @@ -40,8 +40,6 @@ sealed class MainEvent { data class OnChangePerceptionExpander(val value: Boolean) : MainEvent() data class OnChangePerceptionExpanderPadding(val value: Int) : MainEvent() data class OnChangePerceptionExpanderThickness(val value: Int) : MainEvent() - data class OnChangeCheckForTextUpdate(val value: Boolean) : MainEvent() - data class OnChangeCheckForTextUpdateToast(val value: Boolean) : MainEvent() data class OnChangeScreenOrientation(val value: String) : MainEvent() data class OnChangeCustomScreenBrightness(val value: Boolean) : MainEvent() data class OnChangeScreenBrightness(val value: Float) : MainEvent() diff --git a/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt b/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt index 18266b8a..50f72120 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt @@ -343,22 +343,6 @@ class MainModel @Inject constructor( } ) - is MainEvent.OnChangeCheckForTextUpdate -> handleDatastoreUpdate( - key = DataStoreConstants.CHECK_FOR_TEXT_UPDATE, - value = event.value, - updateState = { - it.copy(checkForTextUpdate = this) - } - ) - - is MainEvent.OnChangeCheckForTextUpdateToast -> handleDatastoreUpdate( - key = DataStoreConstants.CHECK_FOR_TEXT_UPDATE_TOAST, - value = event.value, - updateState = { - it.copy(checkForTextUpdateToast = this) - } - ) - is MainEvent.OnChangeScreenOrientation -> handleDatastoreUpdate( key = DataStoreConstants.SCREEN_ORIENTATION, value = event.value, diff --git a/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt b/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt index c06e2715..d5cd958b 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt @@ -79,8 +79,6 @@ data class MainState( val perceptionExpander: Boolean = provideDefaultValue { false }, val perceptionExpanderPadding: Int = provideDefaultValue { 5 }, val perceptionExpanderThickness: Int = provideDefaultValue { 4 }, - val checkForTextUpdate: Boolean = provideDefaultValue { true }, - val checkForTextUpdateToast: Boolean = provideDefaultValue { true }, val screenOrientation: ReaderScreenOrientation = provideDefaultValue { ReaderScreenOrientation.DEFAULT }, @@ -270,14 +268,6 @@ data class MainState( PERCEPTION_EXPANDER_THICKNESS ) { perceptionExpanderThickness }, - checkForTextUpdate = provideValue( - CHECK_FOR_TEXT_UPDATE - ) { checkForTextUpdate }, - - checkForTextUpdateToast = provideValue( - CHECK_FOR_TEXT_UPDATE_TOAST - ) { checkForTextUpdateToast }, - screenOrientation = provideValue( SCREEN_ORIENTATION, convert = { toReaderScreenOrientation() } ) { screenOrientation }, diff --git a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEvent.kt b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEvent.kt index 970c678b..babed6de 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEvent.kt @@ -8,8 +8,6 @@ import androidx.compose.runtime.Immutable sealed class ReaderEvent { data class OnLoadText( - val checkForTextUpdate: Boolean, - val checkForTextUpdateToast: Boolean, val context: Context ) : ReaderEvent() @@ -62,22 +60,6 @@ sealed class ReaderEvent { val activity: ComponentActivity ) : ReaderEvent() - data class OnCheckTextForUpdate( - val showToast: Boolean, - val context: Context - ) : ReaderEvent() - - data class OnUpdateText( - val activity: ComponentActivity, - val navigateToBookInfo: () -> Unit - ) : ReaderEvent() - - data object OnCancelCheckForTextUpdate : ReaderEvent() - - data object OnShowUpdateDialog : ReaderEvent() - - data object OnDismissDialog : ReaderEvent() - data object OnShowSettingsBottomSheet : ReaderEvent() data object OnDismissBottomSheet : ReaderEvent() diff --git a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderModel.kt b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderModel.kt index d2e0d43c..ed2be3d3 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderModel.kt @@ -31,12 +31,10 @@ import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.reader.Chapter import ua.acclorite.book_story.domain.reader.Checkpoint import ua.acclorite.book_story.domain.ui.UIText -import ua.acclorite.book_story.domain.use_case.book.CheckForTextUpdate import ua.acclorite.book_story.domain.use_case.book.GetBookById import ua.acclorite.book_story.domain.use_case.book.GetText import ua.acclorite.book_story.domain.use_case.book.UpdateBook import ua.acclorite.book_story.domain.use_case.history.GetLatestHistory -import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.presentation.core.util.coerceAndPreventNaN import ua.acclorite.book_story.presentation.core.util.launchActivity import ua.acclorite.book_story.presentation.core.util.setBrightness @@ -51,8 +49,7 @@ class ReaderModel @Inject constructor( private val getBookById: GetBookById, private val updateBook: UpdateBook, private val getText: GetText, - private val getLatestHistory: GetLatestHistory, - private val checkForTextUpdate: CheckForTextUpdate + private val getLatestHistory: GetLatestHistory ) : ViewModel() { private val mutex = Mutex() @@ -64,30 +61,27 @@ class ReaderModel @Inject constructor( private var resetJob: Job? = null private var scrollJob: Job? = null - private var updateJob: Job? = null fun onEvent(event: ReaderEvent) { viewModelScope.launch(eventJob + Dispatchers.Main) { when (event) { is ReaderEvent.OnLoadText -> { launch(Dispatchers.IO) { - val text = getText.execute(_state.value.book.textPath) - + val chaptersAndText = getText.execute(_state.value.book.id) yield() - if (text.isEmpty()) { + if (chaptersAndText.text.isEmpty()) { _state.update { it.copy( isLoading = false, - errorMessage = UIText.StringResource(R.string.error_no_text) + errorMessage = UIText.StringResource(R.string.error_no_text) //todo rename ) } + return@launch } yield() - val lastOpened = getLatestHistory.execute(_state.value.book.id)?.time - yield() _state.update { @@ -95,7 +89,8 @@ class ReaderModel @Inject constructor( book = it.book.copy( lastOpened = lastOpened ), - text = text + chapters = chaptersAndText.chapters, + text = chaptersAndText.text ) } @@ -120,15 +115,6 @@ class ReaderModel @Inject constructor( updateChapter(index = scrollIndex) } - if (event.checkForTextUpdate) { - onEvent( - ReaderEvent.OnCheckTextForUpdate( - showToast = event.checkForTextUpdateToast, - context = event.context - ) - ) - } - _state.update { it.copy( isLoading = false, @@ -412,105 +398,6 @@ class ReaderModel @Inject constructor( } } - is ReaderEvent.OnCheckTextForUpdate -> { - updateJob?.cancel() - updateJob = launch(Dispatchers.IO) { - _state.update { - it.copy( - checkingForUpdate = true, - updateFound = false, - dialog = null - ) - } - - yield() - - val result = checkForTextUpdate.execute(bookId = _state.value.book.id) - - yield() - - when (result) { - is Resource.Success -> { - if (result.data == null) { - withContext(Dispatchers.Main) { - if (event.showToast) { - event.context.getString(R.string.nothing_changed) - .showToast( - context = event.context, - longToast = false - ) - } - } - _state.update { - it.copy( - checkingForUpdate = false, - updateFound = false - ) - } - return@launch - } else { - _state.update { - it.copy( - dialog = ReaderScreen.UPDATE_DIALOG, - updateFound = true, - checkingForUpdate = false - ) - } - return@launch - } - } - - is Resource.Error -> { - _state.update { - it.copy( - checkingForUpdate = false, - updateFound = false - ) - } - return@launch - } - } - } - } - - is ReaderEvent.OnUpdateText -> { - launch { - systemBarsVisibility( - show = true, - fullscreenMode = true, - activity = event.activity - ) - event.navigateToBookInfo() - } - } - - is ReaderEvent.OnCancelCheckForTextUpdate -> { - _state.update { - updateJob?.cancel() - - it.copy( - dialog = null, - checkingForUpdate = false - ) - } - } - - is ReaderEvent.OnShowUpdateDialog -> { - _state.update { - it.copy( - dialog = ReaderScreen.UPDATE_DIALOG - ) - } - } - - is ReaderEvent.OnDismissDialog -> { - _state.update { - it.copy( - dialog = null - ) - } - } - is ReaderEvent.OnShowSettingsBottomSheet -> { _state.update { it.copy( @@ -551,8 +438,6 @@ class ReaderModel @Inject constructor( fun init( bookId: Int, fullscreenMode: Boolean, - checkForTextUpdate: Boolean, - checkForTextUpdateToast: Boolean, activity: ComponentActivity, navigateBack: () -> Unit ) { @@ -584,8 +469,6 @@ class ReaderModel @Inject constructor( ) onEvent( ReaderEvent.OnLoadText( - checkForTextUpdate = checkForTextUpdate, - checkForTextUpdateToast = checkForTextUpdateToast, context = activity ) ) @@ -635,7 +518,7 @@ class ReaderModel @Inject constructor( } private fun calculateCurrentChapter(index: Int): Pair { - val currentChapter = _state.value.book.chapters.find { chapter -> + val currentChapter = _state.value.chapters.find { chapter -> index in chapter.startIndex..chapter.endIndex } val currentChapterProgress = currentChapter.run { diff --git a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt index a80ffa47..bc24ba6b 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt @@ -50,7 +50,6 @@ import ua.acclorite.book_story.ui.settings.SettingsModel data class ReaderScreen(val bookId: Int) : Screen, Parcelable { companion object { - const val UPDATE_DIALOG = "update_dialog" const val CHAPTERS_DRAWER = "chapters_drawer" const val SETTINGS_BOTTOM_SHEET = "settings_bottom_sheet" } @@ -225,9 +224,9 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { (mainState.value.bottomBarPadding * 4f).dp } - val chapters = remember(state.value.book.chapters) { + val chapters = remember(state.value.chapters) { val chapters = mutableMapOf() - state.value.book.chapters.forEach { + state.value.chapters.forEach { chapters[it.startIndex] = it } chapters @@ -237,8 +236,6 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { screenModel.init( bookId = bookId, fullscreenMode = mainState.value.fullscreen, - checkForTextUpdate = mainState.value.checkForTextUpdate, - checkForTextUpdateToast = mainState.value.checkForTextUpdateToast, activity = activity, navigateBack = { navigator.pop() @@ -301,7 +298,6 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { ReaderContent( book = state.value.book, text = state.value.text, - dialog = state.value.dialog, bottomSheet = state.value.bottomSheet, drawer = state.value.drawer, listState = listState, @@ -315,8 +311,6 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { isLoading = state.value.isLoading, errorMessage = state.value.errorMessage, checkpoint = state.value.checkpoint, - checkingForUpdate = state.value.checkingForUpdate, - updateFound = state.value.updateFound, showMenu = state.value.showMenu, lockMenu = state.value.lockMenu, chapters = chapters, @@ -351,10 +345,6 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { openTranslator = screenModel::onEvent, openDictionary = screenModel::onEvent, scrollToChapter = screenModel::onEvent, - updateText = screenModel::onEvent, - cancelCheckForTextUpdate = screenModel::onEvent, - showUpdateDialog = screenModel::onEvent, - dismissDialog = screenModel::onEvent, showSettingsBottomSheet = screenModel::onEvent, dismissBottomSheet = screenModel::onEvent, showChaptersDrawer = screenModel::onEvent, @@ -362,8 +352,7 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { navigateBack = { navigator.pop() }, - navigateToBookInfo = { startUpdate -> - if (startUpdate) BookInfoScreen.startUpdateChannel.trySend(true) + navigateToBookInfo = { navigator.push( BookInfoScreen( bookId = bookId, diff --git a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderState.kt b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderState.kt index e72023ba..ef8fcc56 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderState.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderState.kt @@ -8,7 +8,6 @@ import ua.acclorite.book_story.domain.reader.Chapter import ua.acclorite.book_story.domain.reader.Checkpoint import ua.acclorite.book_story.domain.ui.UIText import ua.acclorite.book_story.domain.util.BottomSheet -import ua.acclorite.book_story.domain.util.Dialog 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 @@ -16,6 +15,7 @@ import ua.acclorite.book_story.presentation.core.constants.provideEmptyBook @Immutable data class ReaderState( val book: Book = Constants.provideEmptyBook(), + val chapters: List = emptyList(), val text: List = emptyList(), val listState: LazyListState = LazyListState(), @@ -29,10 +29,6 @@ data class ReaderState( val checkpoint: Checkpoint = Checkpoint(0, 0), val lockMenu: Boolean = false, - val checkingForUpdate: Boolean = false, - val updateFound: Boolean = false, - - val dialog: Dialog? = null, val bottomSheet: BottomSheet? = null, val drawer: Drawer? = null ) \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index ba9f5d48..793b6b99 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -5,7 +5,6 @@ نحتاج إذن التخزين لفحص جهازك من أجل الكتب. من دون هذا الإذن، لن تكون قادرا على إضافة كتاب. التحديث %1$s تم نشره للتو! انقر للذهاب الى صفحة الإصدار. اختر الفئة التي تريد نقل هذا الكتاب إليها. سيتم نقل هذا الكتاب إلى الفئة المختارة. - تحديث نص و فصول هذا الكتاب. ينبغي ان يظل التقدم كما هو ما لم يتم تغيير الفقرات. تم العثور على إصدار جديد من Book\'s Story. هل تريد الإنتقال الى صفحة الاصدار ؟ التحديثات الجديدة تحديث جديد ل Book\'s Story! @@ -22,7 +21,6 @@ حذف الكتاب؟ نقل الكتاب؟ حذف سجل القراءة؟ - تأكيد التحديث؟ تفعيل التحقق من التنبيهات؟ اختر الفئة التي تريد نقل جميع الكتب%1$s المختارة إليها. جميع الكتب المختارة سيتم نقلها إلى الفئة المختارة. هذا سيحذف جميع الكتب%1$sالمختارة من قاعدة البيانات. هذا لن يحذف الكتب المختارة من جهازك. @@ -77,7 +75,6 @@ نسخ ترجمة القاموس - أعد المحاولة التالي نص نعم، اذهب إلى المساعدة @@ -89,7 +86,6 @@ غير معروف حذف نقل - تأكيد إعادة ضبط صورة غلاف الكتاب الى الافتراضي تغيير صورة الغلاف اختر غلاف جديد من صورك @@ -172,11 +168,9 @@ تم اضافة جميع الكتب المختارة بنجاح. عادي تم محو عناصر السجل بنجاح. - تم تحديث نص الكتاب بنجاح. حجم الملف غير معروف حجم الشبكة - النص محدث. إصدار التطبيق قصة كتاب الإصدار%1$s رخص مفتوحة المصدر @@ -184,7 +178,6 @@ إدارة التحديثات الجديدة ابدأ المركز - لم يتم العثور على الملف \"%1$s\" نقل حذف التفاصيل @@ -239,14 +232,10 @@ الحشو العمودي سرعة القراءة الافتراضي - تحديث الكتاب؟ - تم ايجاد تحديث للنص ، التحديث مطلوب لضمان ان احدث اساليب الفرز يتم استخدامها ، لا تحتاج الى اتصال انترنت ، لن تفقد تقدمك ما لم تحدث تغييرات كبيرة . هل تريد المضي قدما بالتحديث؟ المضي قدما النظام عشوائي بحث… - التحقق من تحديث النص - تحقق تلقائيا ان كان هناك تحديث للنص اتجاه الشاشة حر المساهمون @@ -269,7 +258,6 @@ مكتبتك المجد لأوكرانيا! قطع هوامش - تحديث الكتاب هامش جانبي تأكيد التغييرات قراءتك الماضية @@ -277,10 +265,8 @@ إضافة ملفات اذهب الى جر - تحديث النص اضغط باستمرار على صورة غلاف الكتاب الأول حتى يتم تحديدها، والآن يمكنك ببساطة النقر فوق جميع صور أغلفة الكتب التي تريد تحديدها. يمكنك أيضًا تحديد الكتب في فئات متعددة. بعد تحديد جميع الكتب المطلوبة، يمكنك النقر فوق رمز السهم لنقلها ورمز سلة المهملات لحذف الكتب. لبدء قراءة الكتاب اضغط على الزر الموجود في الزاوية اليمنى السفلية للكتاب الذي تريد قراءته. كما يمكنك البدء في قراءة الكتاب بالنقر على صورة غلافه لرؤية تفاصيل الكتاب ثم اضغط على الزر الموجود في الزاوية اليمنى السفلية. سيتم حفظ مكان القراءة واستعادته تلقائيًا. يمكنك تحريك الشريطين العلوي والسفلي بالنقر في أي مكان على الشاشة. بالنقر فوق عنوان الكتاب سيتم نقلك إلى تفاصيل الكتاب. إذا قمت بالنقر فوق رمز الترس سترى إعدادات القراءة. يمكنك استخدام شريط التمرير في الشريط السفلي للتحرك للأمام أو للخلف. - كيف أقوم بتحديث كتاب؟? الاعدادات اذهب الى كيف أدير السجل؟ @@ -292,9 +278,6 @@ الوضع الافقي المقفل المكتبة و اختر فئة القارئ لتخصيص الاعدادات العامة، أو فئة المظهر لتخصيص اعدادات الألوان. - اذهب الى - المكتبة الاعتمادات ابدأ بقراءة الكتاب (انظر: كيف أقرأ كتاباً؟ ) بعد ذلك أحضر الاشرطة العلوية و السفلية بالنقر في أي مكان على الشاشة ثم اضغط على أيقونة الاعدادات في الزاوية اليمنى. هذا سيظهر كل اعدادات القارئ. الطريقة الثانية هي الذهاب إلى - و انقر على غلاف الكتاب لرؤية تفاصيل الكتاب اسحب الشاشة أو اضغط على أيقونة إعادة التحميل في الزاوية العلوية اليمنى لتحديث الكتاب. إذا تغير ملف الكتاب يمكنك تأكيد و تحديث الكتاب أو إلغاء التحديث. \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7326ab98..1cddc964 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -13,13 +13,11 @@ Buch löschen? Buch verschieben? Leseverlauf löschen? - Update bestätigen? Überprüfen von Updates aktivieren? Sie können auswählen, welche Bücher Sie hinzufügen möchten. Titel und Coverbild des Buches können Sie später bearbeiten. Der Ladevorgang kann mehrere Minuten dauern. Wählen Sie die Kategorie, in die Sie alle ausgewählten Bücher verschieben möchten (%1$s). Alle ausgewählten Bücher werden in die ausgewählte Kategorie verschoben. Dadurch wird das Buch aus der Datenbank gelöscht. Von Ihrem Gerät wird das Buch jedoch nicht gelöscht. Wählen Sie die Kategorie aus, in die Sie dieses Buch verschieben möchten. Dieses Buch wird in die ausgewählte Kategorie verschoben. - Aktualisieren Sie den Text und die Kapitel dieses Buches. Der Fortschritt sollte unverändert bleiben, sofern die Reihenfolge der Absätze nicht geändert wurde. Durch Aktivieren von „Nach Updates suchen“ ruft die App bei jedem Start der App die neuesten Versionsinformationen von „api.github.com“ ab. Möchten Sie fortfahren und „Nach Updates suchen“ aktivieren? Keine Beschreibung. Der Buchinhalt ist leer. Bitte stellen Sie sicher, dass der Buchinhalt nicht leer ist und aktualisieren Sie ihn. @@ -47,8 +45,6 @@ Kopieren Übersetzen Wörterbuch - Wiederholen - Bestätigen Nächste Nein Fertig @@ -114,9 +110,6 @@ Die neuste Version der App ist bereits installiert. Das Titelbild wurde erfolgreich zurückgesetzt. Das Verlaufselement wurde erfolgreich gelöscht. - Die Datei „%1$s“ wurde nicht gefunden. - Der Buchtext wurde erfolgreich aktualisiert. - Der Text ist aktuell. Verschieben Löschen Quecksilber @@ -144,9 +137,6 @@ Bibliothek Wie passe ich den Reader an? Beginnen Sie mit dem Lesen des Buches (siehe: Wie lese ich ein Buch?), und bringen Sie dann die oberen und unteren Balken zum Vorschein, indem Sie irgendwo auf den Bildschirm klicken. Klicken Sie dann auf das Zahnradsymbol in der oberen rechten Ecke. Dadurch werden alle Reader-Einstellungen angezeigt. Der zweite Weg ist, zu den - Gehen Sie zum - Bibliothek - und klicken Sie auf das Coverbild des Buches, um die Buchdetails anzuzeigen. Ziehen Sie den Bildschirm nach unten oder klicken Sie auf das Aktualisierungssymbol in der oberen rechten Ecke, um das Buch zu aktualisieren. Wenn sich die Buchdatei geändert hat, können Sie das Buch bestätigen und aktualisieren oder die Aktualisierung abbrechen. Gewährt Speicherberechtigung Erforderlich, um Ihr Gerät zu scannen und Bücher zu finden @@ -156,7 +146,6 @@ Sie haben die Grundeinstellungen der App erfolgreich abgeschlossen. Möchten Sie anhand des Hilfebildschirms erfahren, wie Sie die App verwenden? Heute Gestern - Buch aktualisieren Weiterlesen Geh zurück Titelbild @@ -236,7 +225,6 @@ Wie bearbeite ich ein Buch? Um mit dem Lesen des Buches zu beginnen, klicken Sie auf die Schaltfläche in der unteren rechten Ecke des Buches, das Sie lesen möchten. Sie können das Buch auch lesen, indem Sie auf das Coverbild klicken, um die Buchdetails anzuzeigen, und dann auf die Schaltfläche in der unteren rechten Ecke klicken. Der Fortschritt wird automatisch gespeichert und wiederhergestellt. Sie können die oberen und unteren Leisten einblenden, indem Sie irgendwo auf den Bildschirm klicken. Wenn Sie auf den Titel des Buches klicken, gelangen Sie zu den Buchdetails. Wenn Sie auf das Zahnradsymbol klicken, werden die Reader-Einstellungen angezeigt. Sie können den Schieberegler der unteren Leiste verwenden, um den Fortschritt zu ändern. Einstellungen - Wie aktualisiere ich ein Buch? Gehen Sie zum Die meisten Symbolschaltflächen haben Tooltips. Diese können Ihnen helfen, wenn Sie nicht wissen, was eine Symbolschaltfläche macht. Um den Tooltip anzuzeigen, können Sie eine Symbolschaltfläche gedrückt halten. und wählen Sie die Kategorie „Reader“, um die allgemeinen Einstellungen anzupassen, oder die Kategorie „Darstellung“, um die Farbeinstellungen anzupassen. @@ -330,16 +318,10 @@ Systemleisten ausblenden und Polsterung entfernen Polsterung auf Ausschnittbereich auftragen Aussparungspolster - Auf Textaktualisierungen prüfen - Text aktualisieren Standard - Bücher updaten? - Es wurde ein Update des Textes gefunden. Das Update ist erforderlich, um sicherzustellen, dass die neuesten Parsermethoden verwendet werden. Es handelt sich um einen Offline-Prozess. Ihr Fortschritt wird nicht beeinträchtigt, sofern keine großen Änderungen auftreten. Möchten Sie mit dem Update fortfahren? Fortfahren Zeilenauffüllung des Perception Expander Linienstärke des Perception Expander - Automatisch prüfen, ob ein Text-Update vorliegt - Toast „Text ist aktuell“ anzeigen Bildschirmausrichtung Frei Porträt diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ebc479cf..7dbbcd54 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -17,7 +17,6 @@ ¡Nueva actualización de Book\'s Story! ¿Mover libro? ¿Borrar el historial de lectura? - ¿Confirmar actualización? ¿Comprobar actualizaciones? Elija la categoría a la que desea mover todos los libros seleccionados (%1$s). Todos los libros seleccionados serán trasladados a la categoría seleccionada. Elija la categoría a la que quiere mover este libro. Este libro será trasladado a la categoría seleccionada. @@ -35,7 +34,6 @@ Necesito ayuda Añadir un libro Mover - Reintentar ¡Necesitas leer más! ¡Bien hecho, has leído todo el libro! Cambiar portada @@ -111,7 +109,6 @@ Nunca Regresar Copiar - Confirmar Hecho Deshacer Siguiente @@ -158,7 +155,6 @@ Neptuno Tierra Marte - Actualizar el texto y los capítulos de este libro. El progreso debe permanecer inalterado a menos que se haya modificado el orden de los párrafos. Por defecto %1$s Seleccionado « %1$s » Color preestablecido @@ -167,8 +163,6 @@ Nombrar un preajuste… Este libro se movió correctamente. El elemento del historial se eliminó correctamente. - No se ha encontrado el archivo \"%1$s\". - El texto del libro se ha actualizado correctamente. Detalles Nombre del archivo Último archivo abierto @@ -192,7 +186,6 @@ y haz clic en la imagen de la portada del libro para ver los detalles del libro. Ahora puedes mantener presionado el título, el autor o la descripción del libro para editarlo o la imagen de la portada para cambiarla, restablecerla o eliminarla. ¿Cómo personalizo el lector? Mover - El texto está actualizado. Borrar Ruta del archivo Navegar @@ -216,23 +209,18 @@ Permiso de almacenamiento En primer lugar, vaya a los ajustes del lector (ver: ¿Cómo personalizo el lector?), luego encienda el ajuste correspondiente. Después de eso, comienza a leer el libro (ver: ¿Cómo leo un libro?). Ahora si hace doble clic en el párrafo deseado, el traductor externo se abrirá con el texto del párrafo. Necesario para escanear tu dispositivo y encontrar los libros - ¿Cómo actualizo un libro? Ajustes - Biblioteca - Ir al Ir al Historial ¿Cómo administro el historial? ¿Cómo utilizo las herramientas? Al hacer clic en el botón eliminar a la derecha del elemento del historial, se eliminará. El historial afecta el orden de libros en la Biblioteca, eliminando el historial también reordenará el libro. El último libro abierto es siempre el primero en Biblioteca e Historial. La mayoría de los botones con íconos tienen información sobre herramientas que pueden ayudarte si no sabes qué hace un botón. Para mostrar la información sobre las herramientas, puedes mantener presionado el botón. - y haz clic en la imagen de la portada del libro para ver los detalles del libro. Desliza hacia abajo la pantalla o haz clic en el icono de la actualización en la esquina superior derecha para actualizar el libro. Si el archivo del libro cambió, puedes confirmar y actualizar el libro o cancelar la actualización. Comienza a leer el libro (consulta: ¿Cómo leo un libro?), luego haz clic en cualquier parte de la pantalla para abrir las barras superior e inferior. Luego, haz clic en el ícono del engranaje en la esquina superior derecha. Esto mostrará todas las configuraciones del lector. La segunda forma es ir a los y selecciona la categoría Lector para personalizar la configuración general, o la categoría Apariencia para personalizar los temas. Hoy Ayer Has completado correctamente la configuración básica de la aplicación. ¿Te gustaría aprender a usar la aplicación leyendo la ayuda? - Actualizar libro Seguir leyendo Regresar Portada @@ -339,8 +327,6 @@ Velocidad de lectura Ampliador de percepción Aumente su velocidad de lectura centrándose en los principal - ¿Actualizar libro? - Se encontró una actualización del texto del libro. La actualización es necesaria para garantizar que se utilicen los métodos de análisis más recientes. Este es un proceso autónomo y en la mayoría de los casos está asociado con la actualización del analizador de texto. Su progreso no se verá afectado a menos que haya cambios significativos. ¿Quieres continuar con la actualización? Proceder Por defecto Sistema @@ -348,12 +334,8 @@ Vertical Apaisada Bloquear en vertical - Actualizar texto - Comprobar automáticamente si hay actualización del texto - Buscar actualizaciones del texto Orientación de la pantalla Bloqueado en apaisado - Mostrar mensaje emergente \"El texto está actualizado\" Colaboradores ¿Qué es un potenciador de la percepción y cómo utilizarlo? El expansor de percepción puede ayudarte a leer más rápido. En primer lugar, actívelo en los ajustes del Lector (consulte: ¿Cómo personalizo el Lector?). Una vez activado, aparecerán dos líneas verticales a cada lado del Reader. Para optimizar aún más su velocidad de lectura, ajuste el relleno para crear menos espacio alrededor del centro. Para utilizarlo, concéntrate en el centro de la pantalla y deja que tu visión periférica capte el texto de los lados. Mientras lees, mantén la atención en el centro sin mirar directamente a los lados después de cada línea. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9eb66bf0..9580b8ae 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -13,13 +13,11 @@ Supprimer le livre ? Déplacer le livre ? Effacer l\'historique de lecture ? - Confirmer la mise à jour ? Activer la vérification des mises à jour ? Vous pouvez choisir les livres que vous souhaitez ajouter. Vous pouvez modifier le titre et l\'image de couverture du livre par la suite. Le chargement peut prendre plusieurs minutes. Cela supprimera tous les livres sélectionnés (%1$s) de la base de données. Ceci ne supprimera pas les livres sélectionnés de votre appareil. Cela supprimera ce livre de la base de données. Ceci ne le supprimera pas de votre appareil. Choisissez la catégorie dans laquelle vous souhaitez déplacer ce livre. Ce dernier sera déplacé vers la catégorie choisie. - Met à jour le texte et les chapitres de ce livre. La progression devrait rester inchangée sauf si l\'ordre des paragraphes a été changé. En activant la fonction “Vérifier les mises à jour”, l\'application récupérera les informations de la dernière version de “api.github.com” à chaque fois que l\'application démarrera. Voulez-vous continuer et activer “Vérifier les mises à jour” ? Nous avons besoin de l\'autorisation de stockage pour scanner votre appareil à la recherche de livres "Erreur : %1$s" @@ -47,8 +45,6 @@ Copier Traduire Dictionnaire - Réessayer - Confirmer Suivant Oui, accéder à l\'aide Non @@ -151,8 +147,6 @@ La dernière version de l\'application est déjà installée. L\'image de couverture a été réinitialisée avec succès. Cet élément de l\'historique a été supprimé avec succès. - Fichier \"%1$s\" est introuvable. - Le texte du livre a été mis à jour avec succès. Chemin du fichier Dernier fichier ouvert Taille du fichier @@ -189,8 +183,6 @@ Commencez à lire le livre (voir : Comment lire un livre ?), puis faites apparaître les barres supérieure et inférieure en cliquant n\'importe où sur l\'écran. Cliquez ensuite sur l\'icône de l\'engrenage dans le coin supérieur droit. Cela affichera tous les paramètres du lecteur. La deuxième méthode consiste à aller dans les Paramètres et sélectionnez la catégorie Lecteur pour personnaliser les paramètres généraux, ou la catégorie Apparence pour personnaliser les paramètres Couleurs. - Comment mettre à jour un livre ? - et cliquez sur l\'image de la couverture du livre pour en voir les détails. Tirez vers le bas ou cliquez sur l\'icône d\'actualisation dans le coin supérieur droit pour mettre à jour le livre. Si le fichier du livre a changé, vous pouvez confirmer et mettre à jour le livre ou annuler la mise à jour. Comment gérer l\'historique ? Allez vers la page de L\'historique @@ -212,7 +204,6 @@ Nécessaire pour vérifier si une nouvelle version de l\'application est disponible Tout est prêt! Hier - Rafraîchir le livre Poursuivre la lecture Retourner Image de couverture @@ -291,7 +282,6 @@ Répertoires Format de fichier Alphabétiquement - Le texte est à jour. Déplacer Supprimer Détails @@ -306,8 +296,6 @@ Si vous ne voyez pas les livres téléchargés, essayez d\'actualiser la liste en tirant vers le bas. Assurez-vous que le format de fichier de votre livre est compatible. Cliquez ensuite sur le livre pour le sélectionner ou maintenez-le pour afficher son emplacement. Après avoir sélectionné tous les livres que vous voulez, cliquez sur l\'icône de la coche dans le coin supérieur droit, attendez que tous les livres soient chargés et cliquez sur « Ajouter ». Vous devriez maintenant voir tous les livres que vous avez ajoutés dans la section Maintenez l\'image de couverture du premier livre enfoncée jusqu\'à ce qu\'elle soit sélectionnée. Il vous suffit ensuite de cliquer sur toutes les images de couverture des livres que vous souhaitez sélectionner. Vous pouvez également sélectionner des livres dans plusieurs catégories. Une fois que vous avez sélectionné tous les livres souhaités, vous pouvez cliquer sur l\'icône de la flèche pour les déplacer et sur l\'icône de la corbeille pour les supprimer. Pour commencer à lire le livre, cliquez sur le bouton situé dans le coin inférieur droit du livre que vous souhaitez lire. Vous pouvez également commencer à lire le livre en cliquant sur l\'image de la couverture pour voir les détails du livre, puis en cliquant sur le bouton dans le coin inférieur droit. La progression sera sauvegardée et restaurée automatiquement. Vous pouvez faire apparaître les barres supérieure et inférieure en cliquant n\'importe où sur l\'écran. En cliquant sur le titre du livre, vous accéderez aux détails du livre. En cliquant sur l\'icône de l\'engrenage, vous verrez les paramètres du lecteur. Vous pouvez utiliser le curseur de la barre inférieure pour modifier la progression. - Allez vers la - Bibliothèque En cliquant sur le bouton de suppression à droite de l\'élément historique, celui-ci sera supprimé. L\'historique affecte l\'ordre des livres dans la librairie. En supprimant un élément de l\'historique, l\'ordre des livres sera également modifié. Le dernier livre ouvert est toujours le premier dans la librairie et dans l\'historique. Tout d\'abord, allez dans les paramètres du lecteur(voir: Comment personnaliser le lecteur?), puis activez les réglages correspondants. Ensuite, commencez à lire le livre(voir: Comment lire un livre?). Maintenant, si vous double-cliquez sur le paragraphe souhaité, le traducteur externe s\'ouvrira avec le texte du paragraphe. Allez dans les paramètres d\'apparence(voir: Comment personnaliser le lecteur?). Vous pouvez modifier les paramètres de tous les préréglages de couleur dans la boîte située sous «Préréglage de couleur» dans la sous-catégorie «Couleurs». Pour créer un nouveau préréglage de couleur, cliquez sur l\'icône-bouton «Ajouter». Il y a plusieurs façons de modifier un préréglage de couleur: en cliquant sur le champ de texte, vous pouvez changer le nom du préréglage de couleur, en déplaçant les curseurs, vous pouvez changer les couleurs du préréglage de couleur, en cliquant sur l\'icône «Mélanger», vous pouvez mélanger toutes les couleurs. Si vous souhaitez supprimer un préréglage de couleur, cliquez sur l\'icône «Supprimer». @@ -334,23 +322,17 @@ Cacher les barres en cas de défilement rapide Retour au point de contrôle Défaut - Mettre à jour le livre ? Continuer Vitesse de lecture Expansion de la perception Augmentez votre vitesse de lecture en vous concentrant sur le centre Épaisseur du trait de l\'extenseur de perception - Afficher la notification toast “le texte est à jour” Orientation de l\'écran Portrait verrouillé Contributeurs Qu\'est-ce que l\'expandeur de perception et comment l\'utiliser? Chapitres - Mettre à jour le texte - Une mise à jour du texte a été trouvée. La mise à jour est nécessaire pour s\'assurer que les dernières méthodes d\'analyse sont utilisées. Il s\'agit d\'un processus hors ligne. Votre progression ne sera pas affectée, à moins que des changements importants ne surviennent. Voulez-vous procéder à la mise à jour ? Système - Vérifier si le texte est actualisé - Vérifie automatiquement s\'il y a une mise à jour du texte Libre Paysage Portrait diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index b8be2520..060fb952 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -13,11 +13,8 @@ किताबें शामिल करें ? किताबें स्थानांतरित करें? किताब हटाएं? - अपडेट करें? अपडेट्स की जाँच चालू करें? - किताब अपडेट करें? वह श्रेणी चुनें जिसमें आप सभी चयनित पुस्तकों को ले जाना चाहते हैं(%1$s)। सभी चयनित पुस्तकें चयनित श्रेणी में ले जाई जाएँगी। - इस पुस्तक के पाठ और अध्यायों को अपडेट करें। जब तक पैराग्राफ़ों का क्रम नहीं बदला जाता, तब तक प्रगति अपरिवर्तित रहनी चाहिए। नया ऐप वर्शन मिला। क्या आप आगे बढ़ना चाहते हैं और रिलीज़ पेज पर जाना चाहते हैं? कुछ गड़बड़ हुआ है । ग़लत प्रकार का फाइल । @@ -43,8 +40,6 @@ कॉपी करें अनुवाद करें शब्दकोष - पुन: प्रयास करें - पुष्टि करें अगला हां, सहायता पर जाएं नहीं @@ -105,7 +100,6 @@ यह डेटाबेस से पूरा इतिहास मिटा देगा। पूरा इतिहास मिटाने के बाद, किताबों का क्रम फिर से सेट हो जाएगा। हमें किताबों के लिए आपके डिवाइस को स्कैन करने के लिए भंडारण अनुमति की आवश्यकता है «अपडेट की जाँच करें» को सक्षम करके, ऐप हर बार ऐप शुरू होने पर «api.github.com» से नवीनतम रिलीज़ जानकारी प्राप्त करेगा। क्या आप आगे बढ़ना चाहते हैं और «अपडेट की जाँच करें» को सक्षम करना चाहते हैं? - टेक्स्ट का अपडेट मिल गया है. नवीनतम पार्सर विधियों का उपयोग सुनिश्चित करने के लिए अद्यतन की आवश्यकता है। यह ऑफ़लाइन प्रक्रिया है। जब तक बड़े परिवर्तन नहीं होते, तब तक आपकी प्रगति प्रभावित नहीं होगी। क्या आप अपडेट जारी रखना चाहते हैं? कोई वर्णन नहीं। कुछ गड़बड़ हो गई है। कृपया जाँचें कि इस पुस्तक की फ़ाइल दूषित तो नहीं है। यह फ़ाइल खाली या दूषित है। @@ -148,9 +142,6 @@ धारणा विस्तारक केंद्र पर ध्यान केंद्रित करके अपनी पढ़ने की गति बढ़ाएँ धारणा विस्तारक लाइन पैडिंग - टेक्स्ट अपडेट की जांच करें - स्वचालित रूप से जांचें कि टेक्स्ट अपडेट है या नहीं - \"टेक्स्ट अप-टू-डेट है\" टोस्ट दिखाएं फ़ाइल संरचना प्रदर्शन मोड ग्रिड का आकार @@ -225,8 +216,6 @@ लाल ऐप का नवीनतम संस्करण पहले से इंस्टॉल है। कवर छवि सफलतापूर्वक रीसेट कर दी गई। - फ़ाइल \"%1$s\" नहीं मिली। - पुस्तक का पाठ सफलतापूर्वक अद्यतन किया गया। कदम मिटाना विवरण @@ -257,7 +246,6 @@ ब्राउज़ पुस्तकालय इतिहास तत्व सफलतापूर्वक हटा दिया गया। - पाठ अद्यतित है। फ़ाइल का नाम अज्ञात आंतरिक स्टोरेज diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 78706bc0..211dca2f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -12,7 +12,6 @@ Traduci Concedi permesso Aggiungi - Aggiornare libro? Esplora Procedi Continua così! @@ -30,7 +29,6 @@ Segnala un errore Capitoli Libreria - Aggiorna libro Copertina Aggiungi libri Impostazioni lettore @@ -56,7 +54,6 @@ Abilita Ricerca web Abilitato - Conferma Permesso per le notifiche Icone Preferenze tema @@ -82,14 +79,12 @@ Abbiamo bisogno del permesso di archiviazione per la scansione del Tuo Dispositivo per i libri. Senza questo permesso, non sarai in grado di aggiungere i libri. Qualcosa è andato storto. Per favore controllare che il file di questo libro non sia danneggiato. Fatto - Riprova Condividi Sì, vai ad Aiuto No Elimina preset di colori Cartelle Abilitato - Conferma aggiornamento? Aiuto Errore Carattere, testo, traduttore @@ -117,7 +112,6 @@ Tutti i libri selezionati sono stati aggiunti correttamente. Eliminerà questo libro dal database. Non eliminerà questo libro dal tuo dispositivo. Puoi scegliere quali libri vuoi aggiungere. È possibile modificare il titolo e l\'immagine di copertina in seguito. Il processo di caricamento può richiedere fino a diversi minuti. - Aggiorna il testo e i capitoli di questo libro. I progressi dovrebbero rimanere invariati a meno che l\'ordine dei paragrafi non sia stato modificato. Elimina l\'intera cronologia dal database. Dopo avere eliminato la cronologia, l\'ordine dei libri sarà reimpostato. Eliminerà tutti i libri selezionati (%1$s) dal database. Non eliminerà i libri selezionati dal tuo dispositivo. Nuova versione dell\'app trovata. Vuoi procedere alla pagina di rilascio? @@ -215,7 +209,6 @@ Cerca… Selezionato «%1$s» Traduttore - È stato trovato un aggiornamento del testo. L\'aggiornamento è necessario per garantire che vengano utilizzati i metodi parser più recenti. È un processo offline. I tuoi progressi non saranno influenzati a meno che non si verifichino grandi cambiamenti. Vuoi procedere con l\'aggiornamento? %1$s selezionato Luminosità personalizzata Luminosità diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 913928fd..da151d2f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -9,8 +9,6 @@ Cofnij Kopiuj Słownik - Spróbuj ponownie - Potwierdź Dalej Nie Gotowe @@ -71,7 +69,6 @@ Usunąć książkę? Przenieść książkę? Usunąć historię czytania? - Potwierdzić aktualizację? Wybierz kategorię, do której chcesz przenieść wszystkie wybrane książki (%1$s). Wszystkie wybrane książki zostaną przeniesione do wybranej kategorii. To spowoduje usunięcie tej książki z bazy danych, ale nie usunie jej z twojego urządzenia. To spowoduje usuniecie całej historii z bazy danych. Po usunięciu całej historii kolejność książek zostanie zresetowana. @@ -204,7 +201,6 @@ Kontynuuj czytanie Profil GitHub Przenieś - Tekst książki jest aktualny. Zacznij czytać książkę (patrz: Jak mogę przeczytać książkę?), A następnie przynieś górne i dolne paski, klikając w dowolnym miejscu na ekranie. Następnie kliknij ikonę zębatki w prawym górnym rogu. Spowoduje to wyświetlenie wszystkich ustawień Czytnika. Drugim sposobem jest przejście do Nazwij ustawienie… Rozmiar siatki @@ -222,8 +218,6 @@ Najnowsza wersja aplikacji jest już zainstalowana. Obraz okładki został pomyślnie zresetowany. Element historii został pomyślnie usunięty. - Plik „%1$s” nie został znaleziony. - Tekst książki został pomyślnie zaktualizowany. Plik ostatnio otwarty Rozmiar pliku Nieznany @@ -238,7 +232,6 @@ Tłumaczenie Pomysły i wybierz kategorię Czytnik, aby dostosować ustawienia ogólne lub kategorię Wygląd, aby dostosować ustawienia kolorów. - Biblioteka Idź do Historia Klikając przycisk usuwania po prawej stronie elementu historii, zostanie on usunięty. Historia wpływa na porządek książek w Bibliotece, usuwając element historii, zmieni również kolejność książki. Ostatnio otwarta książka jest zawsze pierwsza w bibliotece i historii. @@ -271,7 +264,6 @@ Uprawnienia Przyznane Pomyślnie wykonałeś podstawowe ustawienie aplikacji. Czy chcesz dowiedzieć się, jak korzystać z aplikacji, czytając Pomoc? - Odśwież książkę Plik Zastosuj zmiany Wybierz wszystkie pliki @@ -289,7 +281,6 @@ Historia czytania Usuń Opuść wyszukiwanie - Kliknięcie przycisku potwierdź spowoduje, że tekst tej książki zostanie zaktualizowany. Zapamiętaj, w którym miejscu przestałeś czytać przed aktualizacją tekstu. Wszystkie wybrane książki zostały pomyślnie przeniesione. Usuń całą historię Przeglądaj @@ -298,8 +289,6 @@ Idź do Ustawienia Biblioteka - Idź do - i kliknij obraz okładki książki, aby zobaczyć szczegóły książki. Przeciągnij w dół ekran lub kliknij ikonę odświeżania w prawym górnym rogu, aby zaktualizować książkę. Jeśli plik książki ulegnie zmianie, możesz potwierdzić i zaktualizować książkę lub anulować aktualizację. Jak mogę zarządzać historią? Jak mogę korzystać z ustawień kolorów? Do świata, w którym słowa oczarowują, uczą i prowadzą niesamowite przygody! Ustawmy kilka rzeczy! @@ -313,7 +302,6 @@ Co nowego Licencje open source Ustawienia - Jak mogę zaktualizować książkę? Katalog Błąd Szukaj diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7eec8496..12b91332 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -4,7 +4,6 @@ Mover livro? Apagar livro? Padrão - Confirmar atualização? Habilitar verificação de atualizações? Cancelar Adicionar @@ -38,8 +37,6 @@ Copiar Traduzir Dicionário - Tentar novamente - Confirmar Próximo Compartilhar Desconhecido @@ -62,7 +59,6 @@ A atualização %1$s acabou de lançar! Clique para ir à página de lançamento. Novo update do Book\'s Story! Adicionar livros? - Atualizar livro? Precisamos de permissão de acesso ao armazenamento para procurar livros no seu dispositivo. Sem essa permissão, você não será capaz de adicionar um livro. Começar Apagar @@ -119,7 +115,6 @@ Erro Pesquisar Permissões - Biblioteca Copiado Requerido Justificar @@ -148,7 +143,6 @@ Tema escuro Escolha a categoria para qual você quer mover este livro. Esse livro será movido para tal categoria. Isto irá deletar todo o histórico da base de dados. Após deletá-lo, a ordem dos livros será restaurada. - Atualizar os capítulos e o texto deste livro. O progresso deve se manter, a não ser que a ordem dos parágrafos mudaram. Recuo de parágrafo Espaçamento das letras Nome do arquivo @@ -215,7 +209,6 @@ Ajude a traduzir Permissão de notificações Está tudo feito! - Atualizar livro Imagem da capa Configurações do leitor Diretório favorito @@ -238,7 +231,6 @@ Geral, filtro, ordem Procurar atualizações Manter a tela ligada - O texto está atualizado. Aplicar alterações Adicionar arquivos Sua biblioteca @@ -246,7 +238,6 @@ Adicionar livros Sem capítulos Velocidade de leitura - Atualizar texto Vertical travado Horizontal travado Iluminação customizada diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 7a70d260..6bcd1a5f 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -6,7 +6,6 @@ வரலாறு புத்தகங்களைச் சேர்க்கவா? புதுப்பிப்புகளை சரிபார்க்கவா? - புதுப்பிப்பு புத்தகம்? இந்த புத்தகத்தை நீங்கள் நகர்த்த விரும்பும் வகையைத் தேர்வுசெய்க. இந்த நூல் தேர்ந்தெடுக்கப்பட்ட வகைக்கு மாற்றப்படும். புதிய பயன்பாட்டு பதிப்பு கண்டறியப்பட்டது. நீங்கள் தொடர விரும்புகிறீர்களா? ஏதோ தவறு நடந்தது. @@ -25,14 +24,12 @@ இசைவு வழங்கவும் எனக்கு உதவி தேவை நீக்கு - உறுதிப்படுத்தவும் அடுத்தது ஆம், உதவிக்குச் செல்லுங்கள் இல்லை முடிந்தது இயக்கு அகராதி - மீண்டும் முயற்சிக்கவும் தொடரவும் அதை வைத்திருங்கள்! பயன்பாட்டு மொழி @@ -57,9 +54,6 @@ இந்த நூல் வெற்றிகரமாக நீக்கப்பட்டது. இந்த நூல் வெற்றிகரமாக நகர்த்தப்பட்டது. நகலெடுக்கப்பட்டது - \"%1$s\" கோப்பு காணப்படவில்லை. - புத்தகத்தின் உரை வெற்றிகரமாக புதுப்பிக்கப்பட்டது. - உரை புதுப்பித்த நிலையில் உள்ளது. நகர்த்தவும் வரலாற்று உறுப்பு வெற்றிகரமாக நீக்கப்பட்டது. மொழிபெயர்ப்பு @@ -69,7 +63,6 @@ அமைப்புகள் செல்லுங்கள் அமைப்புகள் - ஒரு புத்தகத்தை எவ்வாறு புதுப்பிப்பது? வண்ண முன்னமைவுகளை நான் எவ்வாறு பயன்படுத்துவது? புத்தகத்தின் கதைக்கு வருக! திரும்பிச் செல்லுங்கள் @@ -170,7 +163,6 @@ கணினி பட்டிகளை மறைத்து, திணிப்பை அகற்றவும் திரையை தொடர்ந்து வைத்திருங்கள் புலனுணர்வு விரிவாக்க வரி தடிமன் - உரை புதுப்பிப்புக்கு சரிபார்க்கவும் பட்டியல் வலைவாய் தானி @@ -200,7 +192,6 @@ சோதனைச் சாவடி மீண்டும் சோதனைச் சாவடி முன்னோக்கி பாடங்கள் - உரையைப் புதுப்பிக்கவும் மேலும் தேடுங்கள்… தனிப்பயன் ஒளி @@ -218,15 +209,12 @@ புத்தகங்களை நீக்கவா? புத்தகத்தை நீக்கவா? புத்தகத்தை நகர்த்தவா? - புதுப்பிப்பை உறுதிப்படுத்தவா? புத்தகங்களுக்காக உங்கள் சாதனத்தை ச்கேன் செய்ய எங்களுக்கு சேமிப்பக இசைவு தேவை. இந்த அனுமதியின்றி, நீங்கள் ஒரு புத்தகத்தைச் சேர்க்க முடியாது. நீங்கள் எந்த புத்தகங்களைச் சேர்க்க விரும்புகிறீர்கள் என்பதை நீங்கள் தேர்வு செய்யலாம். புத்தகத்தின் தலைப்பு மற்றும் படத்தை பின்னர் திருத்தலாம். ஏற்றுதல் செயல்முறை பல நிமிடங்கள் வரை ஆகலாம். தேர்ந்தெடுக்கப்பட்ட அனைத்து புத்தகங்களையும் (%1$s) நகர்த்த விரும்பும் வகையைத் தேர்வுசெய்க. தேர்ந்தெடுக்கப்பட்ட அனைத்து புத்தகங்களும் தேர்ந்தெடுக்கப்பட்ட வகைக்கு மாற்றப்படும். இது தரவுத்தளத்திலிருந்து தேர்ந்தெடுக்கப்பட்ட அனைத்து புத்தகங்களையும் (%1$s) நீக்கிவிடும். இது உங்கள் சாதனத்திலிருந்து தேர்ந்தெடுக்கப்பட்ட புத்தகங்களை நீக்காது. இது முழு வரலாற்றையும் தரவுத்தளத்திலிருந்து நீக்குகிறது. முழு வரலாற்றையும் நீக்கிய பிறகு, புத்தகங்களின் வரிசை மீட்டமைக்கப்படும். இது இந்த புத்தகத்தை தரவுத்தளத்திலிருந்து நீக்கிவிடும். இது உங்கள் சாதனத்திலிருந்து இந்த புத்தகத்தை நீக்காது. - இந்த புத்தகத்தின் உரை மற்றும் அத்தியாயங்களைப் புதுப்பிக்கவும். பத்திகளின் வரிசை மாற்றப்படாவிட்டால் முன்னேற்றம் மாறாமல் இருக்க வேண்டும். - உரையின் புதுப்பிப்பு கண்டறியப்பட்டுள்ளது. அண்மைக் கால பாகுபடுத்தி முறைகள் பயன்படுத்தப்படுவதை உறுதிப்படுத்த புதுப்பிப்பு தேவை. இது இணைப்பில்லாத செயல்முறை. பெரிய மாற்றங்கள் ஏற்படாவிட்டால் உங்கள் முன்னேற்றம் பாதிக்கப்படாது. புதுப்பிப்புடன் தொடர விரும்புகிறீர்களா? மொழிபெயர்ப்பாளர் பயன்பாடு எதுவும் கிடைக்கவில்லை. பகிர்வதற்கு பயன்பாடு இல்லை. புத்தக உள்ளடக்கம் காலியாக உள்ளது. தயவுசெய்து, புத்தக உள்ளடக்கம் காலியாக இல்லை என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள். @@ -261,8 +249,6 @@ உரை சீரமைப்பு வண்ண முன்னமைவை மாற்ற மேல் பட்டியை இடது அல்லது வலதுபுறமாக ச்வைப் செய்யவும் கடிதம் இடைவெளி - உரை புதுப்பிப்பு இருக்கிறதா என்று தானாகவே சரிபார்க்கவும் - \"உரை புதுப்பித்த\" சிற்றுண்டி காட்டுங்கள் திரை நோக்குநிலை கோப்புகள் அமைப்பு கட்டம் அளவு @@ -334,9 +320,6 @@ புத்தகத்தைப் படிக்கத் தொடங்குங்கள் (பார்க்க: நான் ஒரு புத்தகத்தை எவ்வாறு படிப்பது?), அதன் பிறகு திரையில் எங்கும் சொடுக்கு செய்வதன் மூலம் மேல் மற்றும் கீழ் பட்டிகளைக் கொண்டு வாருங்கள். பின்னர் மேல் வலது மூலையில் உள்ள கியர் ஐகானைக் சொடுக்கு செய்க. இது அனைத்து வாசகர் அமைப்புகளையும் காண்பிக்கும். இரண்டாவது வழி செல்ல வேண்டும் வண்ண அமைப்புகளைத் தனிப்பயனாக்க பொது அமைப்புகளைத் தனிப்பயனாக்க வாசகர் வகையைத் தேர்ந்தெடுக்கவும் அல்லது தோற்ற வகை. உதவிக்குறிப்புகளை நான் எவ்வாறு பயன்படுத்துவது? - செல்லுங்கள் - நூலகம் - புத்தகத்தின் விவரங்களைக் காண புத்தகத்தின் அட்டை படத்தைக் சொடுக்கு செய்க. புத்தகத்தைப் புதுப்பிக்க திரையை கீழே இழுக்கவும் அல்லது மேல் வலது மூலையில் உள்ள புதுப்பிப்பு ஐகானைக் சொடுக்கு செய்யவும். புத்தகத்தின் கோப்பு மாற்றப்பட்டால், நீங்கள் புத்தகத்தை உறுதிப்படுத்தி புதுப்பிக்கலாம் அல்லது புதுப்பிப்பை ரத்து செய்யலாம். வரலாற்றை எவ்வாறு நிர்வகிப்பது? செல்லுங்கள் வரலாற்று உறுப்பின் வலதுபுறத்தில் நீக்கு பொத்தானைக் சொடுக்கு செய்வதன் மூலம், அது நீக்கப்படும். வரலாறு நூலகத்தில் புத்தகங்களை பாதிக்கிறது, வரலாற்று உறுப்பை நீக்குவதன் மூலம் அது ஒரு புத்தகத்தையும் மறுவரிசைப்படுத்தும். கடைசியாக திறக்கப்பட்ட நூல் எப்போதும் நூலகம் மற்றும் வரலாற்றில் முதன்மையானது. @@ -350,7 +333,6 @@ அறிவிப்புகள் இசைவு பயன்பாட்டின் அடிப்படை அமைப்பை நீங்கள் வெற்றிகரமாக முடித்துவிட்டீர்கள். உதவித் திரையைப் படிப்பதன் மூலம் பயன்பாட்டை எவ்வாறு பயன்படுத்துவது என்பதை அறிய விரும்புகிறீர்களா? நேற்று - புத்தகத்தை புதுப்பிக்கவும் தொடர்ந்து படிக்கவும் பிடித்த அடைவு வரிசைப்படுத்தும் முறை diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 1897f012..9cb5f5e3 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -17,7 +17,6 @@ Kitap silinsin mi? Kitap taşınsın mı? Okuma geçmişi silinsin mi? - Güncelleme onaylansın mı? Güncelleme kontrolü etkinleştirilsin mi? Cihazınızdaki kitapları taramak için depolama izni gerekiyor. Bu izin olmadan kitap ekleyemezsiniz. Hangi kitapları eklemek istediğinizi seçebilirsiniz. Kitabın Başlığını ve Kapak resmini daha sonra düzenleyebilirsiniz. Yükleme işlemi birkaç dakika sürebilir. @@ -26,7 +25,6 @@ Bu, kitabı veritabanından silecektir. Bu kitabı cihazınızdan silmeyecektir. Bu kitabı taşımak istediğiniz kategoriyi seçin. Bu kitap seçilen kategoriye taşınacaktır. Bu, tüm geçmişi veritabanından silecektir. Tüm geçmişi sildikten sonra, kitapların sırası sıfırlanacaktır. - Bu kitabın metnini ve bölümlerini güncelleyin. Paragrafların sırası değişmediği sürece ilerleme değişmeden kalacaktır. Yeni uygulama sürümü bulundu. Devam etmek ve yayın sayfasına gitmek istiyor musunuz? «Güncellemeleri kontrol et» seçeneğini etkinleştirerek uygulama her başlatıldığında «api.github.com» adresinden en son sürüm bilgilerini alacaktır. Devam edip «Güncellemeleri kontrol et» seçeneğini etkinleştirmek istiyor musunuz? Cihazınızdaki kitapları taramak için depolama izni gerekiyor @@ -68,8 +66,6 @@ Kopyala Çevir Sözlük - Tekrar Dene - Onayla İleri Evet, Yardım\'a git Hayır @@ -195,9 +191,6 @@ Uygulamanın en son sürümü zaten yüklü. Kapak resmi başarıyla sıfırlandı. Geçmiş öğesi başarıyla silindi. - \"%1$s\" dosyası bulunamadı. - Kitabın metni başarıyla güncellendi. - Metin güncel. Taşı Sil Ayrıntılar @@ -248,10 +241,6 @@ Kitabı okumaya başlayın (bkz: Bir kitabı nasıl okurum?), ardından ekrana herhangi bir yere tıklayarak üst ve alt çubukları getirin. Sonra sağ üst köşedeki dişli simgesine tıklayın. Bu, tüm Okuyucu ayarlarını gösterecektir. İkinci yol şuraya gitmektir: Ayarlar ve Genel ayarları özelleştirmek için Okuyucu kategorisini, veya Renk ayarlarını özelleştirmek için Görünüm kategorisini seçin. - Bir kitabı nasıl güncellerim? - Şuraya gidin: - Kütüphane - ve kitabın ayrıntılarını görmek için kitabın kapak görselini tıklayın. Kitabı güncellemek için ekranı aşağı çekin veya sağ üst köşedeki yenileme simgesine tıklayın. Kitap dosyası değiştiyse, kitabı onaylayıp güncelleyebilir veya güncellemeyi iptal edebilirsiniz. Geçmişi nasıl yönetirim? Şuraya gidin: Geçmiş @@ -278,7 +267,6 @@ Uygulamanın temel ayarlarını başarıyla tamamladınız. Yardım ekranını okuyarak uygulamayı nasıl kullanacağınızı öğrenmek ister misiniz? Bugün Dün - Kitabı yenile Okumaya devam et Geri git Kapak resmi @@ -330,18 +318,12 @@ Kesme alanına dolgu uygulayın Dikey dolgu Ekranı açık tut - Kitap güncellensin mi? Okuma hızı Merkeze odaklanarak okuma hızınızı artırın Algı iyileştirici satır kalınlığı - Metin güncellemesi olup olmadığını otomatik olarak denetle Bölümler - Metni güncelle - Metin güncellemesi bulundu. En son ayrıştırıcı yöntemlerinin kullanıldığından emin olmak için güncelleme gereklidir. Bu çevrim dışı bir işlemdir. Büyük değişiklikler olmadıkça ilerlemeniz etkilenmeyecektir. Güncellemeye devam etmek istiyor musunuz? Devam et Algı iyileştirici - Metin güncellemesini denetle - \"metin güncel\" bildirimi göster Bölüm yok Algı iyileştirici satır dolgusu Hızlı kaydırmada çubukları gizle diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 58abd9b8..05096863 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -31,9 +31,7 @@ Видалити книгу? Перемістити книгу? Видалити історію читання? - Підтвердити оновлення? Увімнкути перевірку на оновлення? - Оновити книгу? @@ -65,10 +63,6 @@ Це видалить всю історію з бази даних. Після видалення всієї історії порядок книг буде скинутий. - - Оновіть текст та розділи цієї книги. - Прогрес повинен залишитися незмінним, якщо порядок параграфів не був змінений. - Нова версія застосунку була знайдена. Чи бажаєте продовжити та перейти на сторінку релізу? @@ -78,13 +72,6 @@ з «api.github.com» кожен раз, коли застосунок запускається. Хочете продовжити та увімкнути «Перевіряти на оновлення»? - - Знайдено оновлення тексту книги. - Оновлення необхідне для того, щоб забезпечити використання найновіших методів парсингу. - Це автономний процес і в більшості випадків пов\'язаний з оновленням парсеру текста. - Ваш прогрес не постраждає, якщо не відбудуться значні зміни. - Чи бажаєте ви продовжити оновлення? - @@ -155,8 +142,6 @@ Копіювати Перекласти Словник - Ще раз - Підтвердити Далі Так, перейти в Довідку Ні @@ -259,9 +244,6 @@ Бокові відступи лінії Товщина лінії - Перевіряти на оновлення тексту - Автоматично перевіряти чи є оновлення тексту - Показувати повідомлення \"текст актуальний\" Орієнтація екрана Користувацька яскравість Яскравість @@ -372,9 +354,6 @@ Елемент історії був успішно видалений. - Файл \"%1$s\" не знайдено. - Текст книги був успішно оновлений. - Текст актуальний. Перемістити @@ -491,15 +470,6 @@ або категорію Зовнішній Вигляд, щоб налаштувати параметри Кольорів. - Як мені оновити книгу? - Перейдіть в - Бібліотеку - - та натісніть на обкладинку книги, щоб побачити подробиці книги. - Потягніть екран вниз або натисніть на іконку оновлення у верхньому правому куті, щоб оновити книгу. - Якщо файл книги змінився, ви можете підтвердити і оновити книгу або скасувати оновлення. - - Як керувати історією? Перейдіть в Історію @@ -598,7 +568,6 @@ Вчора - Оновити книгу Продовжити читання Назад Обкладинка @@ -642,7 +611,6 @@ Чекпоінт назад Чекпоінт вперед Розділи - Оновити текст Більше \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d599d804..67ded1b5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -29,7 +29,6 @@ 关于 app 授予权限? 移动书? - 确认更新? 我们需要存储权限以扫描您的设备上的书。没有此权限,您将无法添加书。 所有已选择的书(%1$s)将会从数据库中删除,但不会从您的设备上删除。 这本书将会从数据库中删除,但不会从您的设备上删除。 @@ -57,8 +56,6 @@ 授予权限 返回 撤销 - 重试 - 确认 下一个 未知 干得好,你已经读完了整本书! @@ -88,7 +85,6 @@ 新更新 您可以挑选您想添加哪些书。您可以在之后编辑书的标题与封面图片。加载过程可能会花费数分钟。 选择你想将所选的书(%1$s)移动到的分类。所有被选择的书将会被移动到指定的分类。 - 更新这本书的文本及章节。除非段落顺序发生改变,否则进度将不会改变。 阅读速度 暗黑主题 绝对黑暗 @@ -97,8 +93,6 @@ 将填充应用于镂空区域 在屏幕顶端固定您的收藏目录 固定收藏目录 - 自动检查文本是否更新 - 显示“文本已更新”通知 网格大小 系统 正常 @@ -123,7 +117,6 @@ 向左或向右滑动顶栏以更改颜色预设 文本对齐 字母间距 - 检查文本更新 显示模式 感知扩展器行填充 应用主题 @@ -173,7 +166,6 @@ 火星 默认 - 更新书? 继续 屏幕方向 列表 @@ -192,7 +184,6 @@ 金星 天王星 再次点击返回退出 - 已发现文本更新。需要更新以确保最新的解析器方法被使用。这是个离线过程。触发发生重大改变否则您的进度将不会被影响。您想继续更新吗? 系统 字母顺序 竖屏 @@ -242,11 +233,9 @@ 点击检查更新 库中 文件路径 - 没有找到文件“%1$s”。 图标 浏览 荣耀属于乌克兰! - 已成功更新了书的文本。 文件最后打开 未知 内部存储 @@ -257,7 +246,6 @@ 详细 新内容 开源许可证 - 文本已是最新。 删除 保存 自定义亮度 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e7e1dbc..704e92ce 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,9 +32,7 @@ Delete book? Move book? Delete reading history? - Confirm update? Enable check for updates? - Update book? @@ -66,10 +64,6 @@ It will delete the whole history from the database. After deleting the whole history, the order of the books will be reset. - - Update this book\'s text and chapters. - The progress should remain unchanged unless the order of paragraphs was changed. - New app version was found. Do you want to proceed and go to the release page? @@ -80,13 +74,6 @@ when app starts. Do you want to proceed and enable «Check for updates»? - - Update of the text has been found. - Update is needed to ensure latest parser methods are used. - It is offline process. - Your progress will not be affected unless big changes occur. - Do you want to proceed with update? - @@ -156,8 +143,6 @@ Copy Translate Dictionary - Retry - Confirm Next Yes, go to Help No @@ -260,9 +245,6 @@ Line side margin Line thickness - Check for text update - Automatically check whether there is text update - Show \"text is up-to-date\" toast Screen orientation Custom brightness Brightness @@ -373,9 +355,6 @@ History element was successfully deleted. - File \"%1$s\" was not found. - Book\'s text was successfully updated. - Text is up-to-date. Move @@ -492,15 +471,6 @@ or Appearance category to customize Colors settings. - How do I update a book? - Go to the - Library - - and click the book\'s cover image to see book\'s details. - Pull down the screen or click the refresh icon in the upper right corner to update the book. - If book\'s file changed you may confirm and update the book or cancel update. - - How do I manage history? Go to the History @@ -598,7 +568,6 @@ Yesterday - Refresh book Continue reading Go back Cover image @@ -645,7 +614,6 @@ Checkpoint back Checkpoint forward Chapters - Update text More \ No newline at end of file