Skip to content

Commit

Permalink
Album wrapper crash (#78)
Browse files Browse the repository at this point in the history
* Update to app compat Spinner

* Remove existing cursor adapter or wrapper

* Replace with MediaGalleryHandler.BUCKET_DISPLAY_NAME

* Use MediaGalleryAlbumSpinnerAdapter instead

* Add MediaGalleryAlbum

* Add fetchAlbums to view model

* Fix lint

* Use separate dropdown view

* Handle -1 column index
  • Loading branch information
kinnerapriyap committed Sep 25, 2020
1 parent 51c62f2 commit 43123cf
Show file tree
Hide file tree
Showing 10 changed files with 108 additions and 203 deletions.
22 changes: 9 additions & 13 deletions sher-gil/src/main/java/com/kinnerapriyap/sugar/ShergilActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.database.Cursor
import android.os.Build
import android.os.Bundle
import android.view.View
Expand All @@ -19,7 +18,8 @@ import androidx.core.view.isVisible
import androidx.lifecycle.Observer
import androidx.navigation.findNavController
import com.kinnerapriyap.sugar.databinding.ActivityShergilBinding
import com.kinnerapriyap.sugar.mediagallery.album.MediaGalleryAlbumCursorAdapter
import com.kinnerapriyap.sugar.mediagallery.album.MediaGalleryAlbumSpinnerAdapter
import com.kinnerapriyap.sugar.mediagallery.album.toBucketDisplayName
import com.kinnerapriyap.sugar.resultlauncher.ResultLauncherHandler
import java.util.ArrayList

Expand All @@ -32,7 +32,7 @@ internal class ShergilActivity :

private val viewModel: ShergilViewModel by viewModels()

private lateinit var mediaGalleryAlbumCursorAdapter: MediaGalleryAlbumCursorAdapter
private lateinit var mediaGalleryAlbumSpinnerAdapter: MediaGalleryAlbumSpinnerAdapter

private lateinit var binding: ActivityShergilBinding

Expand Down Expand Up @@ -155,12 +155,9 @@ internal class ShergilActivity :
}

private fun setToolbarSpinner() {
mediaGalleryAlbumCursorAdapter =
MediaGalleryAlbumCursorAdapter(this, viewModel.fetchAlbumCursor())
.also { adapter ->
adapter.setDropDownViewResource(R.layout.album_spinner_dropdown_item)
}
binding.albumSpinner.adapter = mediaGalleryAlbumCursorAdapter
mediaGalleryAlbumSpinnerAdapter =
MediaGalleryAlbumSpinnerAdapter(this, viewModel.fetchAlbums())
binding.albumSpinner.adapter = mediaGalleryAlbumSpinnerAdapter
binding.albumSpinner.onItemSelectedListener = this
binding.albumSpinner.setSelection(0)
}
Expand Down Expand Up @@ -203,10 +200,9 @@ internal class ShergilActivity :
}

override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
val cursor = mediaGalleryAlbumCursorAdapter.getItem(position) as? Cursor
val bucketDisplayName =
mediaGalleryAlbumCursorAdapter.convertToString(cursor).toString()
viewModel.setSelectedAlbumSpinnerName(bucketDisplayName)
viewModel.setSelectedAlbumSpinnerName(
mediaGalleryAlbumSpinnerAdapter.getItem(position)?.toBucketDisplayName()
)
}

override fun onDestroy() {
Expand Down
29 changes: 24 additions & 5 deletions sher-gil/src/main/java/com/kinnerapriyap/sugar/ShergilViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Transformations
import com.kinnerapriyap.sugar.choice.ChoiceSpec
import com.kinnerapriyap.sugar.mediagallery.MediaGalleryHandler
import com.kinnerapriyap.sugar.mediagallery.MediaGalleryHandler.Companion.ALL_ALBUM_BUCKET_DISPLAY_NAME
import com.kinnerapriyap.sugar.mediagallery.album.MediaGalleryAlbum
import com.kinnerapriyap.sugar.mediagallery.cell.MediaCellDisplayModel
import com.kinnerapriyap.sugar.mediagallery.cell.MediaCellUpdateModel
import com.kinnerapriyap.sugar.mediagallery.media.MediaGalleryCursorWrapper
Expand Down Expand Up @@ -116,11 +118,28 @@ class ShergilViewModel(application: Application) : AndroidViewModel(application)
fun getCurrentMediaCursor(bucketDisplayName: String? = null): Cursor? =
MediaGalleryCursorWrapper(cursor.value, bucketDisplayName)

fun fetchAlbumCursor(): Cursor? =
mediaGalleryHandler.fetchAlbum(cursor.value, choiceSpec.allowCamera)

fun closeCursor() {
cursor.value?.close()
fun fetchAlbums(): List<MediaGalleryAlbum> {
val addedNamesCount: MutableMap<String, Int> = mutableMapOf()
val cursor = cursor.value ?: return emptyList()
cursor.moveToFirst()
while (!cursor.isAfterLast) {
val bucketColumnIndex = cursor.getColumnIndex(MediaGalleryHandler.BUCKET_DISPLAY_NAME)
if (bucketColumnIndex == -1) break
val name = cursor.getString(bucketColumnIndex)
if (!addedNamesCount.contains(name)) {
addedNamesCount[name] = 1
} else {
addedNamesCount[name] = (addedNamesCount[name] ?: 0) + 1
}
cursor.moveToNext()
}
addedNamesCount[ALL_ALBUM_BUCKET_DISPLAY_NAME] = cursor.count
if (choiceSpec.allowCamera) {
addedNamesCount[ALL_ALBUM_BUCKET_DISPLAY_NAME] =
addedNamesCount[ALL_ALBUM_BUCKET_DISPLAY_NAME]?.minus(1) ?: 0
}
cursor.moveToFirst()
return addedNamesCount.map { MediaGalleryAlbum(it.key, it.value) }
}

fun getSelectedAlbumSpinnerName(): LiveData<String?> =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,25 @@ import android.content.ContentResolver
import android.database.Cursor
import android.database.MatrixCursor
import android.database.MergeCursor
import android.os.Build
import android.provider.MediaStore
import com.kinnerapriyap.sugar.choice.MimeType
import com.kinnerapriyap.sugar.mediagallery.album.MediaGalleryAlbumCursorWrapper

class MediaGalleryHandler(private val contentResolver: ContentResolver) {

/**
* In API 29, BUCKET_DISPLAY_NAME was moved to MediaStore.MediaColumns
* from MediaStore.Images.ImageColumns (which implements the former)
* However, the actual value of BUCKET_DISPLAY_NAME remains the same
*/

companion object {
const val ALL_ALBUM_BUCKET_DISPLAY_NAME = "All"
const val CAMERA_CAPTURE_ID: Long = -3

const val ALBUM_MEDIA_COUNT = "album_media_count"
/**
* In API 29, BUCKET_DISPLAY_NAME was moved to MediaStore.MediaColumns
* from MediaStore.Images.ImageColumns (which implements the former)
* However, the actual value of BUCKET_DISPLAY_NAME remains the same
*/
val BUCKET_DISPLAY_NAME =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
MediaStore.MediaColumns.BUCKET_DISPLAY_NAME
} else "bucket_display_name"

/**
* Retrieve Data._ID to use while binding the result Cursor
Expand All @@ -29,7 +31,7 @@ class MediaGalleryHandler(private val contentResolver: ContentResolver) {
private val PROJECTION: Array<String> = arrayOf(
MediaStore.MediaColumns._ID,
MediaStore.MediaColumns.MIME_TYPE,
MediaStore.MediaColumns.BUCKET_DISPLAY_NAME
BUCKET_DISPLAY_NAME
)

private const val SELECTION =
Expand All @@ -39,17 +41,6 @@ class MediaGalleryHandler(private val contentResolver: ContentResolver) {
"${MediaStore.MediaColumns.DATE_MODIFIED} DESC"
}

fun fetchAlbum(
cursor: Cursor?,
allowCamera: Boolean
): Cursor? {
val extras = MatrixCursor(PROJECTION)
extras.addRow(arrayOf("-1", MimeType.IMAGES, ALL_ALBUM_BUCKET_DISPLAY_NAME))
val cursors =
arrayOf(extras, cursor)
return MediaGalleryAlbumCursorWrapper(MergeCursor(cursors), allowCamera)
}

fun fetchMedia(
mimeTypes: List<MimeType>,
showDisallowedMimeTypes: Boolean,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.kinnerapriyap.sugar.mediagallery.album

import com.kinnerapriyap.sugar.mediagallery.MediaGalleryHandler.Companion.ALL_ALBUM_BUCKET_DISPLAY_NAME

data class MediaGalleryAlbum(
val albumName: String,
val mediaCount: Int
)

fun MediaGalleryAlbum.toBucketDisplayName() =
if (albumName != ALL_ALBUM_BUCKET_DISPLAY_NAME) albumName else ""

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.kinnerapriyap.sugar.mediagallery.album

import android.app.Activity
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.TextView
import com.kinnerapriyap.sugar.R

class MediaGalleryAlbumSpinnerAdapter(
private val activity: Activity,
private val albums: List<MediaGalleryAlbum>
) : ArrayAdapter<MediaGalleryAlbum>(activity, R.layout.album_spinner_item, albums) {

override fun getItem(position: Int): MediaGalleryAlbum? = albums[position]

override fun getView(position: Int, convertView: View?, parent: ViewGroup): View =
populateView(
position,
convertView ?: activity.layoutInflater.inflate(
R.layout.album_spinner_item,
null
)
)

override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View =
populateView(
position,
convertView ?: activity.layoutInflater.inflate(
R.layout.album_spinner_dropdown_item,
null
)
)

private fun populateView(position: Int, v: View): View {
v.findViewById<TextView>(R.id.albumName)?.text = getItem(position)?.albumName
v.findViewById<TextView>(R.id.mediaCount)?.text =
getItem(position)?.mediaCount.toString()
return v
}
}
Loading

0 comments on commit 43123cf

Please sign in to comment.