diff --git a/app/src/main/java/com/hippo/app/HapticSlider.kt b/app/src/main/java/com/hippo/app/HapticSlider.kt deleted file mode 100644 index 73d7424b6..000000000 --- a/app/src/main/java/com/hippo/app/HapticSlider.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.hippo.app - -import android.content.Context -import android.util.AttributeSet -import android.view.HapticFeedbackConstants -import com.google.android.material.slider.Slider - -class HapticSlider @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, -) : Slider(context, attrs) { - init { - addOnChangeListener { _, _, _ -> performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK) } - } -} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.kt index c3be3504b..b9ce0272d 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.kt @@ -20,12 +20,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width @@ -76,8 +71,7 @@ import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.data.GalleryDetail import com.hippo.ehviewer.client.data.GalleryPreview import com.hippo.ehviewer.coil.imageRequest -import com.hippo.ehviewer.ui.widget.CrystalCard -import com.hippo.ehviewer.ui.widget.EhAsyncPreview +import com.hippo.ehviewer.ui.widget.EhPreviewItem import com.hippo.ehviewer.ui.widget.rememberDialogState import com.hippo.ehviewer.ui.widget.setMD3Content import com.hippo.util.getParcelableCompat @@ -130,25 +124,24 @@ class GalleryPreviewsScene : BaseScene() { } // No Refresh support - val source = remember { - object : PagingSource() { - override fun getRefreshKey(state: PagingState) = null - override suspend fun load(params: LoadParams): LoadResult { - val key = params.key - if (key == null) { - return LoadResult.Page(galleryDetail.previewList, null, if (galleryDetail.previewPages == 1) null else pgSize, 0, pages - pgSize) - } else { - val page = key / pgSize - val result = runSuspendCatching { withIOContext { getPreviewListByPage(galleryDetail, page) } }.onFailure { return LoadResult.Error(it) }.getOrThrow() - val more = pages - result.size - key - return LoadResult.Page(result, key - 1, if (more == 0) null else key + result.size, 0, more) - } + fun pageSource() = object : PagingSource() { + override fun getRefreshKey(state: PagingState) = null + override suspend fun load(params: LoadParams): LoadResult { + val key = params.key + if (key == null) { + return LoadResult.Page(galleryDetail.previewList, null, if (galleryDetail.previewPages == 1) null else pgSize, 0, pages - pgSize) + } else { + val page = key / pgSize + val result = runSuspendCatching { withIOContext { getPreviewListByPage(galleryDetail, page) } }.onFailure { return LoadResult.Error(it) }.getOrThrow() + val more = pages - result.size - key + return LoadResult.Page(result, key - 1, if (more == 0) null else key + result.size, 0, more) } - override val jumpingSupported = true } + override val jumpingSupported = true + override val keyReuseSupported = true } - val data = remember { Pager(PagingConfig(pgSize)) { source }.flow.cachedIn(lifecycleScope) }.collectAsLazyPagingItems() + val data = remember { Pager(PagingConfig(pgSize, jumpThreshold = 3 * pgSize)) { pageSource() }.flow.cachedIn(lifecycleScope) }.collectAsLazyPagingItems() Scaffold( topBar = { TopAppBar( @@ -187,23 +180,9 @@ class GalleryPreviewsScene : BaseScene() { count = data.itemCount, key = data.itemKey { item -> item.position }, contentType = data.itemContentType(), - ) { - data[it]?.run { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Box(contentAlignment = Alignment.Center) { - CrystalCard( - onClick = ::onPreviewCLick.partially1(position), - modifier = Modifier.fillMaxWidth().aspectRatio(0.6666667F), - ) { - EhAsyncPreview( - model = this@run, - modifier = Modifier.fillMaxSize(), - ) - } - } - Text((position + 1).toString()) - } - } + ) { index -> + val item = data[index] + item?.position?.let { ::onPreviewCLick.partially1(it) }?.let { EhPreviewItem(item, it) } } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/widget/EhAsyncThumb.kt b/app/src/main/java/com/hippo/ehviewer/ui/widget/EhAsyncThumb.kt index 6e9cc0344..d362a0ca8 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/widget/EhAsyncThumb.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/widget/EhAsyncThumb.kt @@ -1,12 +1,19 @@ package com.hippo.ehviewer.ui.widget import android.graphics.drawable.BitmapDrawable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter @@ -93,3 +100,19 @@ fun EhAsyncPreview( contentScale = contentScale, ) } + +@Composable +fun EhPreviewItem( + galleryPreview: GalleryPreview, + onClick: (() -> Unit), +) = Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box(contentAlignment = Alignment.Center) { + CrystalCard( + onClick = onClick, + modifier = Modifier.fillMaxWidth().aspectRatio(0.6666667F), + ) { + EhAsyncPreview(model = galleryPreview, modifier = Modifier.fillMaxSize()) + } + } + Text((galleryPreview.position + 1).toString()) +} diff --git a/app/src/main/res/menu/scene_gallery_previews.xml b/app/src/main/res/menu/scene_gallery_previews.xml deleted file mode 100644 index de7327b3c..000000000 --- a/app/src/main/res/menu/scene_gallery_previews.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -