diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
index 229e66d..0927a98 100644
--- a/.idea/deploymentTargetDropDown.xml
+++ b/.idea/deploymentTargetDropDown.xml
@@ -13,12 +13,12 @@
-
+
-
+
diff --git a/app/src/main/java/org/xtimms/tokusho/core/database/DatabasePrePopulateCallback.kt b/app/src/main/java/org/xtimms/tokusho/core/database/DatabasePrePopulateCallback.kt
index 134c987..290d964 100644
--- a/app/src/main/java/org/xtimms/tokusho/core/database/DatabasePrePopulateCallback.kt
+++ b/app/src/main/java/org/xtimms/tokusho/core/database/DatabasePrePopulateCallback.kt
@@ -21,124 +21,5 @@ class DatabasePrePopulateCallback(private val resources: Resources) : RoomDataba
0L,
)
)
- db.execSQL(
- "INSERT INTO favourite_categories (created_at, sort_key, title, `order`, track, show_in_lib, `deleted_at`) VALUES (?,?,?,?,?,?,?)",
- arrayOf(
- System.currentTimeMillis(),
- 1,
- resources.getString(R.string.reading),
- SortOrder.NEWEST.name,
- 1,
- 1,
- 0L,
- )
- )
- db.execSQL(
- "INSERT INTO favourite_categories (created_at, sort_key, title, `order`, track, show_in_lib, `deleted_at`) VALUES (?,?,?,?,?,?,?)",
- arrayOf(
- System.currentTimeMillis(),
- 1,
- resources.getString(R.string.completed),
- SortOrder.NEWEST.name,
- 1,
- 1,
- 0L,
- )
- )
- db.execSQL(
- "INSERT INTO favourite_categories (created_at, sort_key, title, `order`, track, show_in_lib, `deleted_at`) VALUES (?,?,?,?,?,?,?)",
- arrayOf(
- System.currentTimeMillis(),
- 1,
- resources.getString(R.string.dropped),
- SortOrder.NEWEST.name,
- 1,
- 1,
- 0L,
- )
- )
- db.execSQL(
- "INSERT INTO sources (source, enabled, sort_key) VALUES (?,?,?)",
- arrayOf(
- "MANGADEX",
- 1,
- 1,
- )
- )
- db.execSQL(
- "INSERT INTO sources (source, enabled, sort_key) VALUES (?,?,?)",
- arrayOf(
- "DESUME",
- 1,
- 1,
- )
- )
- db.execSQL(
- "INSERT INTO manga (manga_id, title, alt_title, url, public_url, rating, nsfw, cover_url, large_cover_url, state, author, source) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",
- arrayOf(
- 4427365311541330000,
- "Seitokai ni mo Ana wa Aru!",
- "",
- "822c9883-385c-4fd0-9523-16e7789cbeae",
- "https://mangadex.org/title/822c9883-385c-4fd0-9523-16e7789cbeae",
- -1.0,
- 0,
- "https://mangadex.org/covers/822c9883-385c-4fd0-9523-16e7789cbeae/f886822a-80c3-484c-ad75-9aa32abedc18.jpg.256.jpg",
- "https://mangadex.org/covers/822c9883-385c-4fd0-9523-16e7789cbeae/f886822a-80c3-484c-ad75-9aa32abedc18.jpg",
- "FINISHED",
- "Muchi Maro",
- "MANGADEX",
- )
- )
- db.execSQL(
- "INSERT INTO manga (manga_id, title, alt_title, url, public_url, rating, nsfw, cover_url, large_cover_url, state, author, source) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",
- arrayOf(
- -5513532524243987690,
- "Тотальный гарем",
- "Shuumatsu no Harem",
- "/manga/api/694",
- "https://desu.me/manga/z-shuumatsu-no-harem.694/",
- 1.0,
- 1,
- "https://desu.me/data/manga/covers/preview/694.jpg",
- "https://desu.me/data/manga/covers/original/694.jpg",
- "ONGOING",
- "",
- "DESUME",
- )
- )
- db.execSQL(
- "INSERT INTO favourites (manga_id, category_id, sort_key, created_at, deleted_at) VALUES (?,?,?,?,?)",
- arrayOf(
- 4427365311541330000,
- 1,
- 0,
- 1705944302882,
- 0,
- )
- )
- db.execSQL(
- "INSERT INTO favourites (manga_id, category_id, sort_key, created_at, deleted_at) VALUES (?,?,?,?,?)",
- arrayOf(
- -5513532524243987690,
- 1,
- 0,
- 1705944302882,
- 0,
- )
- )
- db.execSQL(
- "INSERT into history (manga_id, created_at, updated_at, chapter_id, page, scroll, percent, deleted_at) VALUES (?,?,?,?,?,?,?,?)",
- arrayOf(
- -5513532524243987690,
- 1710617414,
- 1710617414,
- 1,
- 3,
- 0.3,
- 0.4,
- 0
- )
- )
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/xtimms/tokusho/core/screens/LoadingScreen.kt b/app/src/main/java/org/xtimms/tokusho/core/screens/LoadingScreen.kt
new file mode 100644
index 0000000..361360f
--- /dev/null
+++ b/app/src/main/java/org/xtimms/tokusho/core/screens/LoadingScreen.kt
@@ -0,0 +1,18 @@
+package org.xtimms.tokusho.core.screens
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.CircularProgressIndicator
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+
+@Composable
+fun LoadingScreen(modifier: Modifier = Modifier) {
+ Box(
+ modifier = modifier.fillMaxSize(),
+ contentAlignment = Alignment.Center,
+ ) {
+ CircularProgressIndicator()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/xtimms/tokusho/sections/details/DetailsInfoHeader.kt b/app/src/main/java/org/xtimms/tokusho/sections/details/DetailsInfoHeader.kt
index 32c70a6..112984e 100644
--- a/app/src/main/java/org/xtimms/tokusho/sections/details/DetailsInfoHeader.kt
+++ b/app/src/main/java/org/xtimms/tokusho/sections/details/DetailsInfoHeader.kt
@@ -34,7 +34,6 @@ import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.selection.SelectionContainer
-import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.MenuBook
import androidx.compose.material.icons.outlined.Block
diff --git a/app/src/main/java/org/xtimms/tokusho/sections/details/DetailsView.kt b/app/src/main/java/org/xtimms/tokusho/sections/details/DetailsView.kt
index 80ce9e5..a4dfa69 100644
--- a/app/src/main/java/org/xtimms/tokusho/sections/details/DetailsView.kt
+++ b/app/src/main/java/org/xtimms/tokusho/sections/details/DetailsView.kt
@@ -251,7 +251,7 @@ fun DetailsView(
title = it.chapter.name,
date = it.chapter.uploadDate,
scanlator = it.chapter.scanlator,
- read = it.isUnread,
+ read = !it.isUnread,
bookmark = false,
selected = false,
onLongClick = { /*TODO*/ },
diff --git a/app/src/main/java/org/xtimms/tokusho/sections/history/HistoryView.kt b/app/src/main/java/org/xtimms/tokusho/sections/history/HistoryView.kt
index bd7399f..a27d12f 100644
--- a/app/src/main/java/org/xtimms/tokusho/sections/history/HistoryView.kt
+++ b/app/src/main/java/org/xtimms/tokusho/sections/history/HistoryView.kt
@@ -48,6 +48,7 @@ import org.xtimms.tokusho.core.components.effects.updateAnimatedItemsState
import org.xtimms.tokusho.core.prefs.AppSettings
import org.xtimms.tokusho.core.prefs.SWIPE_TUTORIAL
import org.xtimms.tokusho.core.screens.EmptyScreen
+import org.xtimms.tokusho.core.screens.LoadingScreen
import org.xtimms.tokusho.utils.lang.calculateTimeAgo
import org.xtimms.tokusho.utils.lang.isSameDay
import java.time.Instant
@@ -70,11 +71,11 @@ fun HistoryView(
val scrollState = rememberScrollState()
var isUserTrySwipe by remember { mutableStateOf(false) }
- val history by viewModel.content.collectAsStateWithLifecycle(emptyList())
+ val history by viewModel.content.collectAsStateWithLifecycle(null)
DisposableEffect(Unit) {
onDispose {
- if (history.isNotEmpty() && isUserTrySwipe) {
+ if (history?.isNotEmpty() == true && isUserTrySwipe) {
AppSettings.updateValue(SWIPE_TUTORIAL, isUserTrySwipe)
}
}
@@ -83,7 +84,7 @@ fun HistoryView(
val animatedList = run {
val list = emptyList().toMutableList()
var readDate: Instant? = null
- history.forEach { item ->
+ history?.forEach { item ->
if (readDate === null || !isSameDay(
item.history.updatedAt.toEpochMilli(),
@@ -116,114 +117,127 @@ fun HistoryView(
Box(
Modifier.fillMaxSize()
) {
- Column(Modifier.fillMaxSize()) {
- LazyColumn(
- modifier = Modifier
- .collapsable(
- state = scrollState,
- topBarHeightPx = topBarHeightPx,
- topBarOffsetY = topBarOffsetY
- )
- .padding(padding)
- ) {
- animatedItemsIndexed(
- state = animatedList.value,
- key = { rowItem -> rowItem.key },
- ) { index, item ->
- when (item.type) {
- RowEntityType.Header -> ListGroupHeader(
- calculateTimeAgo(item.day).format(
- LocalContext.current.resources
+ history.let {
+ if (it == null) {
+ LoadingScreen(Modifier.padding(padding))
+ } else if (it.isEmpty()) {
+ EmptyScreen(
+ icon = Icons.Outlined.History,
+ title = R.string.empty_history_title,
+ description = R.string.empty_history_description
+ )
+ } else {
+ Column(Modifier.fillMaxSize()) {
+ LazyColumn(
+ modifier = Modifier
+ .collapsable(
+ state = scrollState,
+ topBarHeightPx = topBarHeightPx,
+ topBarOffsetY = topBarOffsetY
)
- )
- RowEntityType.Item -> SwipeActions(
- startActionsConfig = SwipeActionsConfig(
- threshold = 0.33f,
- background = MaterialTheme.colorScheme.errorContainer,
- backgroundActive = MaterialTheme.colorScheme.error,
- iconTint = MaterialTheme.colorScheme.onError,
- icon = Icons.Outlined.DeleteForever,
- stayDismissed = true,
- onDismiss = {
- viewModel.removeFromHistory(item.historyItemModel!!)
- }
- ),
- endActionsConfig = SwipeActionsConfig(
- threshold = 0.33f,
- background = MaterialTheme.colorScheme.tertiaryContainer,
- backgroundActive = MaterialTheme.colorScheme.tertiary,
- iconTint = MaterialTheme.colorScheme.onTertiary,
- icon = Icons.Outlined.PlayArrow,
- stayDismissed = false,
- onDismiss = {
- navigateToReader()
- }
- ),
- onTried = { isUserTrySwipe = true },
- showTutorial = false,
- ) { state ->
- val size = with(LocalDensity.current) {
- java.lang.Float.max(
- java.lang.Float.min(
- 16.dp.toPx(),
- abs(state.offset.value)
- ), 0f
- ).toDp()
- }
+ .padding(padding)
+ ) {
+ animatedItemsIndexed(
+ state = animatedList.value,
+ key = { rowItem -> rowItem.key },
+ ) { index, item ->
+ when (item.type) {
+ RowEntityType.Header -> ListGroupHeader(
+ calculateTimeAgo(item.day).format(
+ LocalContext.current.resources
+ )
+ )
- val animateCorners by remember {
- derivedStateOf {
- state.offset.value.absoluteValue > 30
- }
- }
- val startCorners by animateDpAsState(
- targetValue = when {
- state.dismissDirection == DismissDirection.StartToEnd &&
- animateCorners -> 8.dp
+ RowEntityType.Item -> SwipeActions(
+ startActionsConfig = SwipeActionsConfig(
+ threshold = 0.33f,
+ background = MaterialTheme.colorScheme.errorContainer,
+ backgroundActive = MaterialTheme.colorScheme.error,
+ iconTint = MaterialTheme.colorScheme.onError,
+ icon = Icons.Outlined.DeleteForever,
+ stayDismissed = true,
+ onDismiss = {
+ viewModel.removeFromHistory(item.historyItemModel!!)
+ }
+ ),
+ endActionsConfig = SwipeActionsConfig(
+ threshold = 0.33f,
+ background = MaterialTheme.colorScheme.tertiaryContainer,
+ backgroundActive = MaterialTheme.colorScheme.tertiary,
+ iconTint = MaterialTheme.colorScheme.onTertiary,
+ icon = Icons.Outlined.PlayArrow,
+ stayDismissed = false,
+ onDismiss = {
+ navigateToReader()
+ }
+ ),
+ onTried = { isUserTrySwipe = true },
+ showTutorial = false,
+ ) { state ->
+ val size = with(LocalDensity.current) {
+ java.lang.Float.max(
+ java.lang.Float.min(
+ 16.dp.toPx(),
+ abs(state.offset.value)
+ ), 0f
+ ).toDp()
+ }
- else -> 0.dp
- }, label = "startCorners"
- )
- val endCorners by animateDpAsState(
- targetValue = when {
- state.dismissDirection == DismissDirection.EndToStart &&
- animateCorners -> 8.dp
+ val animateCorners by remember {
+ derivedStateOf {
+ state.offset.value.absoluteValue > 30
+ }
+ }
+ val startCorners by animateDpAsState(
+ targetValue = when {
+ state.dismissDirection == DismissDirection.StartToEnd &&
+ animateCorners -> 8.dp
- else -> 0.dp
- }, label = "endCorners"
- )
+ else -> 0.dp
+ }, label = "startCorners"
+ )
+ val endCorners by animateDpAsState(
+ targetValue = when {
+ state.dismissDirection == DismissDirection.EndToStart &&
+ animateCorners -> 8.dp
- Box(
- modifier = Modifier.height(IntrinsicSize.Min)
- ) {
- Surface(
- modifier = Modifier
- .fillMaxSize()
- .padding(
- vertical = min(
- size / 4f,
- 4.dp
- )
- )
- .clip(RoundedCornerShape(size)),
- color = MaterialTheme.colorScheme.surface,
- shape = RoundedCornerShape(
- topStart = startCorners,
- bottomStart = startCorners,
- topEnd = endCorners,
- bottomEnd = endCorners,
- ),
- ) {
- // nothing
- }
- Box(
- modifier = Modifier.padding(vertical = 4.dp)
- ) {
- HistoryItem(
- coil = coil,
- history = item.historyItemModel!!,
- onClick = { navigateToDetails(item.historyItemModel!!.manga.id) },
+ else -> 0.dp
+ }, label = "endCorners"
)
+
+ Box(
+ modifier = Modifier.height(IntrinsicSize.Min)
+ ) {
+ Surface(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(
+ vertical = min(
+ size / 4f,
+ 4.dp
+ )
+ )
+ .clip(RoundedCornerShape(size)),
+ color = MaterialTheme.colorScheme.surface,
+ shape = RoundedCornerShape(
+ topStart = startCorners,
+ bottomStart = startCorners,
+ topEnd = endCorners,
+ bottomEnd = endCorners,
+ ),
+ ) {
+ // nothing
+ }
+ Box(
+ modifier = Modifier.padding(vertical = 4.dp)
+ ) {
+ HistoryItem(
+ coil = coil,
+ history = item.historyItemModel!!,
+ onClick = { navigateToDetails(item.historyItemModel!!.manga.id) },
+ )
+ }
+ }
}
}
}
@@ -231,12 +245,5 @@ fun HistoryView(
}
}
}
- if (history.isEmpty()) {
- EmptyScreen(
- icon = Icons.Outlined.History,
- title = R.string.empty_history_title,
- description = R.string.empty_history_description
- )
- }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/BackupRestoreView.kt b/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/BackupRestoreView.kt
index 6c4a3b2..f0c59b5 100644
--- a/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/BackupRestoreView.kt
+++ b/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/BackupRestoreView.kt
@@ -108,7 +108,7 @@ fun BackupRestoreView(
return@rememberLauncherForActivityResult
}
- navigateToRestoreScreen(uri.toString())
+ restoreViewModel.restore(uri)
}
val showDirectoryAlert =
diff --git a/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/RestoreItemsView.kt b/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/RestoreItemsView.kt
index 6fc6749..690e15f 100644
--- a/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/RestoreItemsView.kt
+++ b/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/RestoreItemsView.kt
@@ -9,10 +9,12 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.AccessTime
import androidx.compose.material.icons.outlined.Restore
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -28,7 +30,7 @@ import org.xtimms.tokusho.core.components.ScaffoldWithTopAppBar
import org.xtimms.tokusho.sections.settings.about.ProgressIndicatorButton
import org.xtimms.tokusho.utils.DeviceUtil
-const val RESTORE_ARGUMENT = "{source}"
+const val RESTORE_ARGUMENT = "{file}"
const val RESTORE_DESTINATION = "restore/?file=${RESTORE_ARGUMENT}"
@Composable
@@ -38,7 +40,8 @@ fun RestoreItemsView(
navigateBack: () -> Unit,
) {
- val items = restoreViewModel.availableEntries.collectAsStateWithLifecycle()
+ val items by restoreViewModel.availableEntries.collectAsStateWithLifecycle(emptyList())
+ val backupDate by restoreViewModel.backupDate.collectAsStateWithLifecycle(null)
ScaffoldWithTopAppBar(
title = stringResource(R.string.restore_from_backup),
@@ -61,16 +64,16 @@ fun RestoreItemsView(
item {
PreferencesHintCard(
title = stringResource(id = R.string.backup_creation_date),
- description = restoreViewModel.backupDate.value.toString(),
+ description = backupDate.toString(),
icon = Icons.Outlined.AccessTime
)
}
- items(
- count = 5
- ) {
- BackupItem(
- title = it.toString()
- )
+ for (item in items) {
+ item {
+ BackupItem(
+ title = item.name.name
+ )
+ }
}
item {
var isLoading by remember { mutableStateOf(false) }
@@ -89,7 +92,7 @@ fun RestoreItemsView(
icon = Icons.Outlined.Restore,
isLoading = isLoading
) {
- restoreViewModel.restore()
+ // restoreViewModel.restore()
}
}
}
diff --git a/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/RestoreViewModel.kt b/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/RestoreViewModel.kt
index 6dc9b10..149c7e5 100644
--- a/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/RestoreViewModel.kt
+++ b/app/src/main/java/org/xtimms/tokusho/sections/settings/backup/RestoreViewModel.kt
@@ -1,6 +1,7 @@
package org.xtimms.tokusho.sections.settings.backup
import android.content.Context
+import android.net.Uri
import androidx.lifecycle.SavedStateHandle
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
@@ -25,13 +26,14 @@ import javax.inject.Inject
@HiltViewModel
class RestoreViewModel @Inject constructor(
- savedStateHandle: SavedStateHandle,
+ private val savedStateHandle: SavedStateHandle,
private val repository: BackupRepository,
- @ApplicationContext context: Context,
+ @ApplicationContext val context: Context,
) : KotatsuBaseViewModel() {
private val backupInput = SuspendLazy {
- val uri = savedStateHandle.get(RESTORE_ARGUMENT)?.toUriOrNull() ?: throw FileNotFoundException()
+ val uri = savedStateHandle.get(RESTORE_ARGUMENT)?.toUriOrNull()
+ ?: throw FileNotFoundException()
val contentResolver = context.contentResolver
runInterruptible(Dispatchers.IO) {
val tempFile = File.createTempFile("backup_", ".tmp")
@@ -74,57 +76,68 @@ class RestoreViewModel @Inject constructor(
}
fun onItemClick(item: BackupEntryModel) {
- val map = availableEntries.value.associateByTo(EnumMap(BackupEntry.Name::class.java)) { it.name }
+ val map =
+ availableEntries.value.associateByTo(EnumMap(BackupEntry.Name::class.java)) { it.name }
map[item.name] = item.copy(isChecked = !item.isChecked)
map.validate()
availableEntries.value = map.values.sortedBy { it.name.ordinal }
}
- fun restore() {
+ fun restore(uri: Uri) {
launchLoadingJob {
- val backup = backupInput.get()
- val checkedItems = availableEntries.value.mapNotNullTo(EnumSet.noneOf(BackupEntry.Name::class.java)) {
- if (it.isChecked) it.name else null
- }
+ val contentResolver = context.contentResolver
+ val tempFile = File.createTempFile("backup_", ".tmp")
+ (contentResolver.openInputStream(uri) ?: throw FileNotFoundException()).use { input ->
+ tempFile.outputStream().use { output ->
+ input.copyTo(output)
+ }
+ }
+ val backupInput = BackupZipInput(tempFile)
+ val backup: BackupZipInput = backupInput
+ val checkedItems =
+ availableEntries.value.mapNotNullTo(EnumSet.noneOf(BackupEntry.Name::class.java)) {
+ if (it.isChecked) it.name else null
+ }
val result = CompositeResult()
val step = 1f / 5f
progress.value = 0f
- if (BackupEntry.Name.HISTORY in checkedItems) {
- backup.getEntry(BackupEntry.Name.HISTORY)?.let {
- result += repository.restoreHistory(it)
- }
+ //if (BackupEntry.Name.HISTORY in checkedItems) {
+ backup.getEntry(BackupEntry.Name.HISTORY)?.let {
+ result += repository.restoreHistory(it)
}
+ //}
progress.value += step
- if (BackupEntry.Name.CATEGORIES in checkedItems) {
- backup.getEntry(BackupEntry.Name.CATEGORIES)?.let {
- result += repository.restoreCategories(it)
- }
+ //if (BackupEntry.Name.CATEGORIES in checkedItems) {
+ backup.getEntry(BackupEntry.Name.CATEGORIES)?.let {
+ result += repository.restoreCategories(it)
}
+ //}
progress.value += step
- if (BackupEntry.Name.FAVOURITES in checkedItems) {
- backup.getEntry(BackupEntry.Name.FAVOURITES)?.let {
- result += repository.restoreFavourites(it)
- }
+ //if (BackupEntry.Name.FAVOURITES in checkedItems) {
+ backup.getEntry(BackupEntry.Name.FAVOURITES)?.let {
+ result += repository.restoreFavourites(it)
}
+ //}
progress.value += step
- if (BackupEntry.Name.BOOKMARKS in checkedItems) {
- backup.getEntry(BackupEntry.Name.BOOKMARKS)?.let {
- result += repository.restoreBookmarks(it)
- }
+ //if (BackupEntry.Name.BOOKMARKS in checkedItems) {
+ backup.getEntry(BackupEntry.Name.BOOKMARKS)?.let {
+ result += repository.restoreBookmarks(it)
}
+ //}
progress.value += step
- if (BackupEntry.Name.SOURCES in checkedItems) {
- backup.getEntry(BackupEntry.Name.SOURCES)?.let {
- result += repository.restoreSources(it)
- }
+ //if (BackupEntry.Name.SOURCES in checkedItems) {
+ backup.getEntry(BackupEntry.Name.SOURCES)?.let {
+ result += repository.restoreSources(it)
}
+ //}
progress.value = 1f
+ backup.cleanupAsync()
onRestoreDone.call(result)
}
}
@@ -142,7 +155,8 @@ class RestoreViewModel @Inject constructor(
}
} else {
if (favorites.isEnabled) {
- this[BackupEntry.Name.FAVOURITES] = favorites.copy(isEnabled = false, isChecked = false)
+ this[BackupEntry.Name.FAVOURITES] =
+ favorites.copy(isEnabled = false, isChecked = false)
}
}
}
diff --git a/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfPager.kt b/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfPager.kt
index 5b5684a..eb4bef8 100644
--- a/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfPager.kt
+++ b/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfPager.kt
@@ -25,7 +25,6 @@ fun ShelfPager(
coil: ImageLoader,
state: PagerState,
contentPadding: PaddingValues,
- searchQuery: String?,
getShelfForPage: (Int) -> List,
navigateToDetails: (ShelfManga) -> Unit,
) {
@@ -41,7 +40,6 @@ fun ShelfPager(
val library = getShelfForPage(page)
if (library.isEmpty()) {
ShelfPagerEmptyScreen(
- searchQuery = searchQuery,
contentPadding = contentPadding,
)
return@HorizontalPager
@@ -61,14 +59,8 @@ fun ShelfPager(
@Composable
private fun ShelfPagerEmptyScreen(
- searchQuery: String?,
contentPadding: PaddingValues,
) {
- val msg = when {
- !searchQuery.isNullOrEmpty() -> R.string.no_results_found
- else -> R.string.information_no_manga_category
- }
-
Column(
modifier = Modifier
.padding(contentPadding + PaddingValues(8.dp))
@@ -78,7 +70,7 @@ private fun ShelfPagerEmptyScreen(
EmptyScreen(
icon = Icons.Outlined.Close,
title = R.string.empty_here,
- description = msg,
+ description = R.string.information_no_manga_category,
modifier = Modifier.weight(1f),
)
}
diff --git a/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfView.kt b/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfView.kt
index b1af137..d195c03 100644
--- a/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfView.kt
+++ b/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfView.kt
@@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -110,7 +109,6 @@ fun ShelfViewContent(
coil = coil,
state = pagerState,
contentPadding = PaddingValues(bottom = padding.calculateBottomPadding()),
- searchQuery = "",
getShelfForPage = { mangas },
navigateToDetails = onClickManga
)
diff --git a/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfViewModel.kt b/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfViewModel.kt
index 1e37a65..274fdfb 100644
--- a/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfViewModel.kt
+++ b/app/src/main/java/org/xtimms/tokusho/sections/shelf/ShelfViewModel.kt
@@ -3,18 +3,12 @@ package org.xtimms.tokusho.sections.shelf
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.collectLatest
-import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
-import kotlinx.coroutines.flow.update
-import kotlinx.coroutines.launch
import kotlinx.coroutines.plus
-import org.xtimms.tokusho.core.base.viewmodel.BaseViewModel
import org.xtimms.tokusho.core.base.viewmodel.KotatsuBaseViewModel
import org.xtimms.tokusho.data.repository.FavouritesRepository
import org.xtimms.tokusho.utils.lang.mapItems
@@ -28,11 +22,10 @@ class ShelfViewModel @Inject constructor(
private val mangasStateFlow = favouritesRepository.observeAll(1)
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, null)
-
private val categoriesStateFlow = favouritesRepository.observeCategoriesForLibrary()
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, null)
- val mangaCount = favouritesRepository.observeMangaCount()
+ val mangaCount = favouritesRepository.observeMangaCountInCategory(1)
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, null)
val categories = categoriesStateFlow