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
         }