Glimpse: Order trashed album items by their expire time
Change-Id: I33b459f1b2cf6e4c5fc4bcd11be8003a9ef678a8
diff --git a/app/src/main/java/org/lineageos/glimpse/flow/MediaFlow.kt b/app/src/main/java/org/lineageos/glimpse/flow/MediaFlow.kt
index 9b09a79..605a1d0 100644
--- a/app/src/main/java/org/lineageos/glimpse/flow/MediaFlow.kt
+++ b/app/src/main/java/org/lineageos/glimpse/flow/MediaFlow.kt
@@ -12,8 +12,7 @@
import android.provider.MediaStore
import androidx.core.os.bundleOf
import kotlinx.coroutines.flow.Flow
-import org.lineageos.glimpse.ext.mapEachRow
-import org.lineageos.glimpse.ext.queryFlow
+import org.lineageos.glimpse.ext.*
import org.lineageos.glimpse.models.Media
import org.lineageos.glimpse.query.*
import org.lineageos.glimpse.utils.MediaStoreBuckets
@@ -39,7 +38,12 @@
val selectionArgs = bucketId.takeIf {
MediaStoreBuckets.values().none { bucket -> it == bucket.id }
}?.let { arrayOf(it.toString()) }
- val sortOrder = MediaStore.Files.FileColumns.DATE_ADDED + " DESC"
+ val sortOrder = when (bucketId) {
+ MediaStoreBuckets.MEDIA_STORE_BUCKET_TRASH.id ->
+ "${MediaStore.Files.FileColumns.DATE_EXPIRES} DESC"
+
+ else -> "${MediaStore.Files.FileColumns.DATE_ADDED} DESC"
+ }
val queryArgs = Bundle().apply {
putAll(
bundleOf(
diff --git a/app/src/main/java/org/lineageos/glimpse/fragments/AlbumFragment.kt b/app/src/main/java/org/lineageos/glimpse/fragments/AlbumFragment.kt
index 9a439f7..43ac351 100644
--- a/app/src/main/java/org/lineageos/glimpse/fragments/AlbumFragment.kt
+++ b/app/src/main/java/org/lineageos/glimpse/fragments/AlbumFragment.kt
@@ -29,11 +29,11 @@
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import org.lineageos.glimpse.R
-import org.lineageos.glimpse.ext.getParcelable
-import org.lineageos.glimpse.ext.getViewProperty
+import org.lineageos.glimpse.ext.*
import org.lineageos.glimpse.models.Album
import org.lineageos.glimpse.recyclerview.ThumbnailAdapter
import org.lineageos.glimpse.recyclerview.ThumbnailLayoutManager
+import org.lineageos.glimpse.utils.MediaStoreBuckets
import org.lineageos.glimpse.utils.PermissionsGatedCallback
import org.lineageos.glimpse.viewmodels.MediaViewModel
import org.lineageos.glimpse.viewmodels.QueryResult.Data
@@ -71,7 +71,7 @@
// MediaStore
private val thumbnailAdapter by lazy {
- ThumbnailAdapter { media ->
+ ThumbnailAdapter(album.id != MediaStoreBuckets.MEDIA_STORE_BUCKET_TRASH.id) { media ->
findNavController().navigate(
R.id.action_albumFragment_to_mediaViewerFragment,
MediaViewerFragment.createBundle(media, album.id)
diff --git a/app/src/main/java/org/lineageos/glimpse/recyclerview/ThumbnailAdapter.kt b/app/src/main/java/org/lineageos/glimpse/recyclerview/ThumbnailAdapter.kt
index a9fc7ee..90b7122 100644
--- a/app/src/main/java/org/lineageos/glimpse/recyclerview/ThumbnailAdapter.kt
+++ b/app/src/main/java/org/lineageos/glimpse/recyclerview/ThumbnailAdapter.kt
@@ -22,6 +22,7 @@
import java.util.Date
class ThumbnailAdapter(
+ private val allowHeaders: Boolean = true,
private val onItemSelected: (media: Media) -> Unit,
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val headersPositions = sortedSetOf<Int>()
@@ -43,8 +44,21 @@
setHasStableIds(true)
}
- override fun getItemCount() = data.size.takeIf { it > 0 }
- ?.let { it + (headersPositions.size.takeIf { headerCount -> headerCount > 0 } ?: 1) } ?: 0
+ override fun getItemCount() = when {
+ // If there isn't media to show there won't be headers.
+ data.isEmpty() -> 0
+
+ // If we're not requesting headers there will only be data.
+ !allowHeaders -> data.size
+
+ // If there's some data there will always be at least an header in the future.
+ data.isNotEmpty() && headersPositions.size == 0 -> data.size + 1
+
+ // If there's some data and some headers the item count is their sum.
+ data.isNotEmpty() && headersPositions.isNotEmpty() -> data.size + headersPositions.size
+
+ else -> throw Exception("`when` not covering all possible values")
+ }
override fun getItemId(position: Int) = if (headersPositions.contains(position)) {
position.toLong()
@@ -84,6 +98,10 @@
}
override fun getItemViewType(position: Int): Int {
+ if (!allowHeaders) {
+ return ViewTypes.ITEM.ordinal
+ }
+
if (headersPositions.contains(position)) {
return ViewTypes.HEADER.ordinal
}