Milan Jurkulak пре 3 година
родитељ
комит
8c3dfad7c4

+ 35 - 16
app/src/main/kotlin/org/mjdev/tvapp/base/helpers/cursor/Cursor.kt

@@ -16,6 +16,11 @@ import android.content.Context
 import android.database.Cursor
 import android.net.Uri
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.platform.LocalContext
 import org.mjdev.tvapp.base.extensions.CursorExt.isNotEmpty
 import timber.log.Timber
@@ -31,17 +36,29 @@ fun rememberCursor(
     prefetchItems: Int = 8,
     transform: (Cursor) -> Any?,
 ): PrefetchCursor? {
-    return if (uri == null) null
-    else PrefetchCursor(
-        LocalContext.current,
-        uri,
-        projection,
-        selection,
-        selectionArgs,
-        sortOrder,
-        prefetchItems,
-        transform,
-    )
+    if (uri == null) return null
+    else {
+        val context = LocalContext.current
+        var cursor by remember {
+            mutableStateOf<PrefetchCursor?>(null)
+        }
+        DisposableEffect(uri) {
+            cursor = PrefetchCursor(
+                context,
+                uri,
+                projection,
+                selection,
+                selectionArgs,
+                sortOrder,
+                prefetchItems,
+                transform,
+            )
+            onDispose {
+                cursor?.close()
+            }
+        }
+        return cursor
+    }
 }
 
 // todo prefetching & cache
@@ -81,11 +98,9 @@ class PrefetchCursor(
     fun get(idx: Int): Any? {
         var result: Any? = null
         try {
-            if (count > idx) {
-                cursor?.move(idx)
-                result = cursor?.let { c ->
-                    transform(c)
-                }
+            if (count >= idx) {
+                cursor?.moveToPosition(idx)
+                result = cursor?.let { c -> transform(c) }
             }
         } catch (e: Exception) {
             Timber.e(e)
@@ -93,4 +108,8 @@ class PrefetchCursor(
         return result
     }
 
+    fun close() {
+        cursor?.close()
+    }
+
 }

+ 5 - 3
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/tv/AppsRow.kt

@@ -20,6 +20,7 @@ import androidx.tv.foundation.lazy.list.rememberTvLazyListState
 import androidx.tv.material3.ExperimentalTvMaterial3Api
 import org.mjdev.tvapp.R
 import org.mjdev.tvapp.base.annotations.TvPreview
+import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardWidth
 import org.mjdev.tvapp.base.helpers.apps.App
 import org.mjdev.tvapp.base.helpers.apps.rememberAppsManager
 import org.mjdev.tvapp.base.ui.components.card.ItemCard
@@ -30,7 +31,7 @@ import org.mjdev.tvapp.base.ui.components.card.ItemCard
 fun AppsRow(
     title: Any? = R.string.title_apps,
     rowState: TvLazyListState = rememberTvLazyListState(),
-    padding: Dp = 16.dp,
+    padding: Dp = 8.dp,
     backgroundColor: Color = Color.DarkGray,
     startApp: Context.(app: App?) -> Unit = { app ->
         startActivity(app?.intent)
@@ -38,13 +39,14 @@ fun AppsRow(
 ) {
     val context: Context = LocalContext.current
     val apps = rememberAppsManager()
+    val cardWidth = computeCardWidth(3f)
     if (apps.isNotEmpty()) {
         CategoryRow(
             title = title,
             items = apps,
             rowState = rowState,
             padding = padding,
-            cardHeight = 80.dp,
+            cardWidth = cardWidth,
             contentScale = ContentScale.Fit,
             backgroundColor = backgroundColor,
             onItemClick = { app ->
@@ -54,7 +56,7 @@ fun AppsRow(
                 ItemCard(
                     item = item,
                     contentScale = ContentScale.Fit,
-                    cardHeight = 80.dp,
+                    cardWidth = cardWidth,
                     onClick = { app ->
                         startApp(context, app as? App)
                     },

+ 4 - 4
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/tv/CategoryRow.kt

@@ -31,7 +31,7 @@ import androidx.compose.ui.unit.dp
 import androidx.tv.foundation.lazy.list.TvLazyListState
 import androidx.tv.foundation.lazy.list.rememberTvLazyListState
 import androidx.tv.material3.ExperimentalTvMaterial3Api
-import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardHeight
+import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardWidth
 import org.mjdev.tvapp.base.extensions.ModifierExt.recomposeHighlighter
 import org.mjdev.tvapp.base.ui.components.card.PhotoCard
 import org.mjdev.tvapp.base.ui.components.text.TextAny
@@ -44,8 +44,8 @@ fun CategoryRow(
     title: Any? = "category 1",
     items: List<Any?> = listOf(Unit, Unit, Unit),
     rowState: TvLazyListState = rememberTvLazyListState(),
-    padding: Dp = 16.dp,
-    cardHeight: Dp = computeCardHeight(),
+    padding: Dp = 8.dp,
+    cardWidth: Dp = computeCardWidth(),
     contentScale: ContentScale = ContentScale.Crop,
     backgroundColor: Color = Color.DarkGray,
     onItemClick: (item: Any?) -> Unit = {},
@@ -53,7 +53,7 @@ fun CategoryRow(
         PhotoCard(
             item = item,
             contentScale = contentScale,
-            cardHeight = cardHeight,
+            cardWidth = cardWidth,
             onClick = onItemClick,
         )
     },

+ 7 - 7
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/tv/CursorRow.kt

@@ -35,7 +35,7 @@ import androidx.tv.foundation.lazy.list.TvLazyListState
 import androidx.tv.foundation.lazy.list.rememberTvLazyListState
 import androidx.tv.material3.ExperimentalTvMaterial3Api
 import org.mjdev.tvapp.base.annotations.TvPreview
-import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardHeight
+import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardWidth
 import org.mjdev.tvapp.base.extensions.ModifierExt.recomposeHighlighter
 import org.mjdev.tvapp.base.helpers.cursor.rememberCursor
 import org.mjdev.tvapp.base.ui.components.card.PhotoCard
@@ -50,7 +50,7 @@ fun CursorRow(
     rowState: TvLazyListState = rememberTvLazyListState(),
     padding: Dp = 16.dp,
     backgroundColor: Color = Color.DarkGray,
-    cardHeight: Dp = computeCardHeight(),
+    cardWidth: Dp = computeCardWidth(),
     contentScale: ContentScale = ContentScale.Crop,
     uri: Uri? = null,
     projection: Array<String> = emptyArray(),
@@ -103,14 +103,14 @@ fun CursorRow(
             ) {
                 items(
                     count = cursor.count,
+                    key = { idx -> idx }
                 ) { idx ->
-                    val item = cursor.get(idx)
                     PhotoCard(
-                        item = item,
+                        item = cursor.get(idx),
                         contentScale = contentScale,
-                        cardHeight = cardHeight,
-                        onClick = {
-                            openItem(context, item)
+                        cardWidth = cardWidth,
+                        onClick = { i ->
+                            openItem(context, i)
                         },
                     )
                 }

+ 4 - 4
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/tv/LocalAudioRow.kt

@@ -18,7 +18,7 @@ import androidx.tv.foundation.lazy.list.TvLazyListState
 import androidx.tv.foundation.lazy.list.rememberTvLazyListState
 import org.mjdev.tvapp.R
 import org.mjdev.tvapp.base.annotations.TvPreview
-import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardHeight
+import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardWidth
 import org.mjdev.tvapp.base.extensions.ComposeExt.rememberContentResolver
 import org.mjdev.tvapp.base.helpers.cursor.AudioItem
 
@@ -27,12 +27,12 @@ import org.mjdev.tvapp.base.helpers.cursor.AudioItem
 fun LocalAudioRow(
     title: Any? = R.string.title_audio_local,
     rowState: TvLazyListState = rememberTvLazyListState(),
-    padding: Dp = 16.dp,
+    padding: Dp = 8.dp,
     backgroundColor: Color = Color.DarkGray,
     selection: String? = null,
     selectionArgs: Array<String>? = null,
     sortOrder: String? = null,
-    cardHeight: Dp = computeCardHeight(),
+    cardWidth: Dp = computeCardWidth(),
     contentScale: ContentScale = ContentScale.Crop,
     openItem: Context.(item: Any?) -> Unit = {},
 ) {
@@ -42,7 +42,7 @@ fun LocalAudioRow(
         rowState = rowState,
         padding = padding,
         backgroundColor = backgroundColor,
-        cardHeight = cardHeight,
+        cardWidth = cardWidth,
         contentScale = contentScale,
         uri = AudioItem.URI,
         projection = AudioItem.MEDIA_PROJECTION,

+ 4 - 4
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/tv/LocalPhotosRow.kt

@@ -18,7 +18,7 @@ import androidx.tv.foundation.lazy.list.TvLazyListState
 import androidx.tv.foundation.lazy.list.rememberTvLazyListState
 import org.mjdev.tvapp.R
 import org.mjdev.tvapp.base.annotations.TvPreview
-import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardHeight
+import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardWidth
 import org.mjdev.tvapp.base.helpers.cursor.PhotoItem
 
 @TvPreview
@@ -26,12 +26,12 @@ import org.mjdev.tvapp.base.helpers.cursor.PhotoItem
 fun LocalPhotosRow(
     title: Any? = R.string.title_photo_local,
     rowState: TvLazyListState = rememberTvLazyListState(),
-    padding: Dp = 16.dp,
+    padding: Dp = 8.dp,
     backgroundColor: Color = Color.DarkGray,
     selection: String? = null,
     selectionArgs: Array<String>? = null,
     sortOrder: String? = null,
-    cardHeight: Dp = computeCardHeight(),
+    cardWidth: Dp = computeCardWidth(),
     contentScale: ContentScale = ContentScale.Crop,
     openItem: Context.(item: Any?) -> Unit = {},
 ) = CursorRow(
@@ -39,7 +39,7 @@ fun LocalPhotosRow(
     rowState = rowState,
     padding = padding,
     backgroundColor = backgroundColor,
-    cardHeight = cardHeight,
+    cardWidth = cardWidth,
     contentScale = contentScale,
     uri = PhotoItem.URI,
     projection = PhotoItem.MEDIA_PROJECTION,

+ 4 - 4
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/tv/LocalVideoRow.kt

@@ -18,7 +18,7 @@ import androidx.tv.foundation.lazy.list.TvLazyListState
 import androidx.tv.foundation.lazy.list.rememberTvLazyListState
 import org.mjdev.tvapp.R
 import org.mjdev.tvapp.base.annotations.TvPreview
-import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardHeight
+import org.mjdev.tvapp.base.extensions.ComposeExt.computeCardWidth
 import org.mjdev.tvapp.base.extensions.ComposeExt.rememberContentResolver
 import org.mjdev.tvapp.base.helpers.cursor.VideoItem
 
@@ -27,12 +27,12 @@ import org.mjdev.tvapp.base.helpers.cursor.VideoItem
 fun LocalVideoRow(
     title: Any? = R.string.title_video_local,
     rowState: TvLazyListState = rememberTvLazyListState(),
-    padding: Dp = 16.dp,
+    padding: Dp = 8.dp,
     backgroundColor: Color = Color.DarkGray,
     selection: String? = null,
     selectionArgs: Array<String>? = null,
     sortOrder: String? = null,
-    cardHeight: Dp = computeCardHeight(),
+    cardWidth: Dp = computeCardWidth(),
     contentScale: ContentScale = ContentScale.Crop,
     openItem: Context.(item: Any?) -> Unit = {},
 ) {
@@ -42,7 +42,7 @@ fun LocalVideoRow(
         rowState = rowState,
         padding = padding,
         backgroundColor = backgroundColor,
-        cardHeight = cardHeight,
+        cardWidth = cardWidth,
         contentScale = contentScale,
         uri = VideoItem.URI,
         projection = VideoItem.MEDIA_PROJECTION,