Эх сурвалжийг харах

Use Compose fast* functions in more places

arkon 2 жил өмнө
parent
commit
86c3d8c064

+ 3 - 2
app/src/main/java/eu/kanade/presentation/components/EmptyScreen.kt

@@ -29,6 +29,7 @@ import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirstOrNull
 import eu.kanade.presentation.theme.TachiyomiTheme
 import eu.kanade.presentation.util.secondaryItemAlpha
 import eu.kanade.tachiyomi.R
@@ -100,9 +101,9 @@ fun EmptyScreen(
         modifier = modifier.fillMaxSize(),
     ) { measurables, constraints ->
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
-        val facePlaceable = measurables.first { it.layoutId == "face" }
+        val facePlaceable = measurables.fastFirstOrNull { it.layoutId == "face" }!!
             .measure(looseConstraints)
-        val actionsPlaceable = measurables.firstOrNull { it.layoutId == "actions" }
+        val actionsPlaceable = measurables.fastFirstOrNull { it.layoutId == "actions" }
             ?.measure(looseConstraints)
 
         layout(constraints.maxWidth, constraints.maxHeight) {

+ 2 - 1
app/src/main/java/eu/kanade/presentation/library/LibraryScreen.kt

@@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalUriHandler
+import androidx.compose.ui.util.fastAll
 import eu.kanade.domain.category.model.Category
 import eu.kanade.domain.library.model.display
 import eu.kanade.domain.manga.model.isLocal
@@ -62,7 +63,7 @@ fun LibraryScreen(
                 onChangeCategoryClicked = onChangeCategoryClicked,
                 onMarkAsReadClicked = onMarkAsReadClicked,
                 onMarkAsUnreadClicked = onMarkAsUnreadClicked,
-                onDownloadClicked = onDownloadClicked.takeIf { presenter.selection.none { it.manga.isLocal() } },
+                onDownloadClicked = onDownloadClicked.takeIf { presenter.selection.fastAll { !it.manga.isLocal() } },
                 onDeleteClicked = onDeleteClicked,
             )
         },

+ 24 - 21
app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt

@@ -43,6 +43,9 @@ import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalHapticFeedback
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.util.fastAll
+import androidx.compose.ui.util.fastAny
+import androidx.compose.ui.util.fastMap
 import eu.kanade.domain.chapter.model.Chapter
 import eu.kanade.presentation.components.ChapterDownloadAction
 import eu.kanade.presentation.components.ExtendedFloatingActionButton
@@ -204,7 +207,7 @@ private fun MangaScreenSmallImpl(
     val chapters = remember(state) { state.processedChapters.toList() }
 
     val internalOnBackPressed = {
-        if (chapters.any { it.selected }) {
+        if (chapters.fastAny { it.selected }) {
             onAllChapterSelected(false)
         } else {
             onBackClicked()
@@ -258,13 +261,13 @@ private fun MangaScreenSmallImpl(
         snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
         floatingActionButton = {
             AnimatedVisibility(
-                visible = chapters.any { !it.chapter.read } && chapters.none { it.selected },
+                visible = chapters.fastAny { !it.chapter.read } && chapters.fastAll { !it.selected },
                 enter = fadeIn(),
                 exit = fadeOut(),
             ) {
                 ExtendedFloatingActionButton(
                     text = {
-                        val id = if (chapters.any { it.chapter.read }) {
+                        val id = if (chapters.fastAny { it.chapter.read }) {
                             R.string.action_resume
                         } else {
                             R.string.action_start
@@ -283,7 +286,7 @@ private fun MangaScreenSmallImpl(
         SwipeRefresh(
             refreshing = state.isRefreshingData,
             onRefresh = onRefresh,
-            enabled = chapters.none { it.selected },
+            enabled = chapters.fastAll { !it.selected },
             indicatorPadding = contentPadding,
         ) {
             val layoutDirection = LocalLayoutDirection.current
@@ -414,7 +417,7 @@ fun MangaScreenLargeImpl(
     SwipeRefresh(
         refreshing = state.isRefreshingData,
         onRefresh = onRefresh,
-        enabled = chapters.none { it.selected },
+        enabled = chapters.fastAll { !it.selected },
         indicatorPadding = PaddingValues(
             start = insetPadding.calculateStartPadding(layoutDirection),
             top = with(density) { topBarHeight.toDp() },
@@ -424,7 +427,7 @@ fun MangaScreenLargeImpl(
         val chapterListState = rememberLazyListState()
 
         val internalOnBackPressed = {
-            if (chapters.any { it.selected }) {
+            if (chapters.fastAny { it.selected }) {
                 onAllChapterSelected(false)
             } else {
                 onBackClicked()
@@ -437,7 +440,7 @@ fun MangaScreenLargeImpl(
                 MangaToolbar(
                     modifier = Modifier.onSizeChanged { topBarHeight = it.height },
                     title = state.manga.title,
-                    titleAlphaProvider = { if (chapters.any { it.selected }) 1f else 0f },
+                    titleAlphaProvider = { if (chapters.fastAny { it.selected }) 1f else 0f },
                     backgroundAlphaProvider = { 1f },
                     hasFilters = state.manga.chaptersFiltered(),
                     incognitoMode = state.isIncognitoMode,
@@ -472,13 +475,13 @@ fun MangaScreenLargeImpl(
             snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
             floatingActionButton = {
                 AnimatedVisibility(
-                    visible = chapters.any { !it.chapter.read } && chapters.none { it.selected },
+                    visible = chapters.fastAny { !it.chapter.read } && chapters.fastAll { !it.selected },
                     enter = fadeIn(),
                     exit = fadeOut(),
                 ) {
                     ExtendedFloatingActionButton(
                         text = {
-                            val id = if (chapters.any { it.chapter.read }) {
+                            val id = if (chapters.fastAny { it.chapter.read }) {
                                 R.string.action_resume
                             } else {
                                 R.string.action_start
@@ -584,29 +587,29 @@ private fun SharedMangaBottomActionMenu(
         visible = selected.isNotEmpty(),
         modifier = modifier.fillMaxWidth(fillFraction),
         onBookmarkClicked = {
-            onMultiBookmarkClicked.invoke(selected.map { it.chapter }, true)
-        }.takeIf { selected.any { !it.chapter.bookmark } },
+            onMultiBookmarkClicked.invoke(selected.fastMap { it.chapter }, true)
+        }.takeIf { selected.fastAny { !it.chapter.bookmark } },
         onRemoveBookmarkClicked = {
-            onMultiBookmarkClicked.invoke(selected.map { it.chapter }, false)
-        }.takeIf { selected.all { it.chapter.bookmark } },
+            onMultiBookmarkClicked.invoke(selected.fastMap { it.chapter }, false)
+        }.takeIf { selected.fastAll { it.chapter.bookmark } },
         onMarkAsReadClicked = {
-            onMultiMarkAsReadClicked(selected.map { it.chapter }, true)
-        }.takeIf { selected.any { !it.chapter.read } },
+            onMultiMarkAsReadClicked(selected.fastMap { it.chapter }, true)
+        }.takeIf { selected.fastAny { !it.chapter.read } },
         onMarkAsUnreadClicked = {
-            onMultiMarkAsReadClicked(selected.map { it.chapter }, false)
-        }.takeIf { selected.any { it.chapter.read || it.chapter.lastPageRead > 0L } },
+            onMultiMarkAsReadClicked(selected.fastMap { it.chapter }, false)
+        }.takeIf { selected.fastAny { it.chapter.read || it.chapter.lastPageRead > 0L } },
         onMarkPreviousAsReadClicked = {
             onMarkPreviousAsReadClicked(selected[0].chapter)
         }.takeIf { selected.size == 1 },
         onDownloadClicked = {
             onDownloadChapter!!(selected.toList(), ChapterDownloadAction.START)
         }.takeIf {
-            onDownloadChapter != null && selected.any { it.downloadState != Download.State.DOWNLOADED }
+            onDownloadChapter != null && selected.fastAny { it.downloadState != Download.State.DOWNLOADED }
         },
         onDeleteClicked = {
-            onMultiDeleteClicked(selected.map { it.chapter })
+            onMultiDeleteClicked(selected.fastMap { it.chapter })
         }.takeIf {
-            onDownloadChapter != null && selected.any { it.downloadState == Download.State.DOWNLOADED }
+            onDownloadChapter != null && selected.fastAny { it.downloadState == Download.State.DOWNLOADED }
         },
     )
 }
@@ -662,7 +665,7 @@ private fun onChapterItemClick(
 ) {
     when {
         chapterItem.selected -> onToggleSelection(false)
-        chapters.any { it.selected } -> onToggleSelection(true)
+        chapters.fastAny { it.selected } -> onToggleSelection(true)
         else -> onChapterClicked(chapterItem.chapter)
     }
 }

+ 3 - 2
app/src/main/java/eu/kanade/presentation/more/settings/screen/ClearDatabaseScreen.kt

@@ -25,6 +25,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastMap
 import cafe.adriel.voyager.core.model.StateScreenModel
 import cafe.adriel.voyager.core.model.coroutineScope
 import cafe.adriel.voyager.core.model.rememberScreenModel
@@ -240,14 +241,14 @@ private class ClearDatabaseScreenModel : StateScreenModel<ClearDatabaseScreenMod
 
     fun selectAll() = mutableState.update { state ->
         if (state !is State.Ready) return@update state
-        state.copy(selection = state.items.map { it.id })
+        state.copy(selection = state.items.fastMap { it.id })
     }
 
     fun invertSelection() = mutableState.update { state ->
         if (state !is State.Ready) return@update state
         state.copy(
             selection = state.items
-                .map { it.id }
+                .fastMap { it.id }
                 .filterNot { it in state.selection },
         )
     }

+ 3 - 2
app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt

@@ -16,6 +16,7 @@ import androidx.compose.runtime.setValue
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.pluralStringResource
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.util.fastMap
 import androidx.core.net.toUri
 import com.hippo.unifile.UniFile
 import eu.kanade.domain.category.interactor.GetCategories
@@ -204,8 +205,8 @@ class SettingsDownloadScreen : SearchableSettings {
                 itemLabel = { it.visualName },
                 onDismissRequest = { showDialog = false },
                 onValueChanged = { newIncluded, newExcluded ->
-                    downloadNewChapterCategoriesPref.set(newIncluded.map { it.id.toString() }.toSet())
-                    downloadNewChapterCategoriesExcludePref.set(newExcluded.map { it.id.toString() }.toSet())
+                    downloadNewChapterCategoriesPref.set(newIncluded.fastMap { it.id.toString() }.toSet())
+                    downloadNewChapterCategoriesExcludePref.set(newExcluded.fastMap { it.id.toString() }.toSet())
                     showDialog = false
                 },
             )

+ 3 - 2
app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt

@@ -25,6 +25,7 @@ import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.pluralStringResource
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.util.fastMap
 import androidx.core.content.ContextCompat
 import cafe.adriel.voyager.navigator.currentOrThrow
 import com.bluelinelabs.conductor.Router
@@ -124,9 +125,9 @@ class SettingsLibraryScreen : SearchableSettings {
 
         // For default category
         val ids = listOf(libraryPreferences.defaultCategory().defaultValue()) +
-            allCategories.map { it.id.toInt() }
+            allCategories.fastMap { it.id.toInt() }
         val labels = listOf(stringResource(R.string.default_category_summary)) +
-            allCategories.map { it.visualName(context) }
+            allCategories.fastMap { it.visualName(context) }
 
         return Preference.PreferenceGroup(
             title = stringResource(R.string.categories),

+ 8 - 6
app/src/main/java/eu/kanade/presentation/updates/UpdatesScreen.kt

@@ -21,6 +21,8 @@ import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.util.fastAll
+import androidx.compose.ui.util.fastAny
 import eu.kanade.presentation.components.AppBar
 import eu.kanade.presentation.components.ChapterDownloadAction
 import eu.kanade.presentation.components.EmptyScreen
@@ -241,24 +243,24 @@ private fun UpdatesBottomBar(
         modifier = Modifier.fillMaxWidth(),
         onBookmarkClicked = {
             onMultiBookmarkClicked.invoke(selected, true)
-        }.takeIf { selected.any { !it.update.bookmark } },
+        }.takeIf { selected.fastAny { !it.update.bookmark } },
         onRemoveBookmarkClicked = {
             onMultiBookmarkClicked.invoke(selected, false)
-        }.takeIf { selected.all { it.update.bookmark } },
+        }.takeIf { selected.fastAll { it.update.bookmark } },
         onMarkAsReadClicked = {
             onMultiMarkAsReadClicked(selected, true)
-        }.takeIf { selected.any { !it.update.read } },
+        }.takeIf { selected.fastAny { !it.update.read } },
         onMarkAsUnreadClicked = {
             onMultiMarkAsReadClicked(selected, false)
-        }.takeIf { selected.any { it.update.read } },
+        }.takeIf { selected.fastAny { it.update.read } },
         onDownloadClicked = {
             onDownloadChapter(selected, ChapterDownloadAction.START)
         }.takeIf {
-            selected.any { it.downloadStateProvider() != Download.State.DOWNLOADED }
+            selected.fastAny { it.downloadStateProvider() != Download.State.DOWNLOADED }
         },
         onDeleteClicked = {
             onMultiDeleteClicked(selected)
-        }.takeIf { selected.any { it.downloadStateProvider() == Download.State.DOWNLOADED } },
+        }.takeIf { selected.fastAny { it.downloadStateProvider() == Download.State.DOWNLOADED } },
     )
 }