Skip to content

Commit

Permalink
fix: better audio loading
Browse files Browse the repository at this point in the history
  • Loading branch information
CraZyLegenD committed Dec 21, 2020
1 parent 41bc6ee commit e9a3b04
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.crazylegend.audiopicker.adapters.single

import com.bumptech.glide.Glide
import com.crazylegend.audiopicker.audios.AudioModel
import com.crazylegend.audiopicker.databinding.ItemviewAudioBinding
import com.crazylegend.core.adapters.BaseViewHolder
Expand All @@ -23,7 +24,10 @@ internal class AudioSingleViewHolder(private val binding: ItemviewAudioBinding,
if (item.thumbnail == null) {
loadPlaceHolders(viewHolderPlaceholderModifier, binding.image)
} else {
binding.image.setImageBitmap(item.thumbnail)
Glide
.with(binding.image)
.load(item.thumbnail)
.into(binding.image)
}
viewHolderTitleTextModifier?.apply {
applyTextParamsConstraint(binding.bottomText)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.core.database.getLongOrNull
import androidx.core.database.getStringOrNull
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.crazylegend.audiopicker.listeners.onShouldRecycleBitmaps
import com.crazylegend.core.abstracts.AbstractAVM
Expand All @@ -22,7 +23,8 @@ import kotlinx.coroutines.withContext
/**
* Created by crazy on 5/8/20 to long live and prosper !
*/
internal class AudiosVM(application: Application) : AbstractAVM(application) {
internal class AudiosVM(application: Application,
stateHandle: SavedStateHandle) : AbstractAVM(application, stateHandle) {

private val audioData = MutableLiveData<List<AudioModel>>()
val audio: LiveData<List<AudioModel>> = audioData
Expand All @@ -46,7 +48,8 @@ internal class AudiosVM(application: Application) : AbstractAVM(application) {
private fun initializeContentObserver(sortOrder: SortOrder) {
if (contentObserver == null) {
contentObserver = contentResolver.registerObserver(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI) {
canLoad = true
setCanLoad()

loadAudios(sortOrder)
}
}
Expand Down Expand Up @@ -132,7 +135,8 @@ internal class AudiosVM(application: Application) : AbstractAVM(application) {
}
}
}
canLoad = false

setCanNotLoad()
loadingIndicatorData.value = false
return audio
}
Expand Down
17 changes: 17 additions & 0 deletions core/src/main/java/com/crazylegend/core/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,23 @@ internal inline fun AppCompatImageView.loadImage(uri: Uri, crossinline onLoadFai
.into(this)
}

internal inline fun AppCompatImageView.loadWholeImage(uri: Uri, crossinline onLoadFailed: () -> Unit = {}) {
Glide.with(this)
.load(uri)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
onLoadFailed()
return true
}

override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
return false
}
})
.centerCrop()
.into(this)
}

inline fun setupModifier(modifier: BaseMultiPickerModifier.() -> Unit) = BaseMultiPickerModifier().also(modifier)


Expand Down
17 changes: 15 additions & 2 deletions core/src/main/java/com/crazylegend/core/abstracts/AbstractAVM.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,19 @@ import android.util.Size
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import com.crazylegend.core.context


/**
* Created by crazy on 5/14/20 to long live and prosper !
*/
abstract class AbstractAVM(application: Application) : AndroidViewModel(application) {
abstract class AbstractAVM(application: Application,
private val stateHandle: SavedStateHandle) : AndroidViewModel(application) {

companion object {
private const val CAN_LOAD_KEY = "canLoad"
}

protected val contentResolver get() = context.contentResolver
protected var contentObserver: ContentObserver? = null
Expand All @@ -29,8 +35,15 @@ abstract class AbstractAVM(application: Application) : AndroidViewModel(applicat
/**
* Using this instead of event since it serves the same purpose thus it's needed here
*/
protected var canLoad = true
protected val canLoad get() = stateHandle[CAN_LOAD_KEY] ?: true

protected fun setCanLoad() {
stateHandle[CAN_LOAD_KEY] = true
}

protected fun setCanNotLoad() {
stateHandle[CAN_LOAD_KEY] = false
}

override fun onCleared() {
super.onCleared()
Expand Down
38 changes: 38 additions & 0 deletions core/src/main/java/com/crazylegend/core/adapters/BaseViewHolder.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package com.crazylegend.core.adapters

import android.content.ContentResolver
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import android.provider.MediaStore
import android.util.Size
import androidx.appcompat.widget.AppCompatImageView
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
Expand All @@ -23,6 +29,38 @@ open class BaseViewHolder(binding: ViewBinding) : RecyclerView.ViewHolder(bindin
}
}

/**
* Or just use Glide with the contentUri
* @param contentResolver ContentResolver
* @param customSize Size
* @param options Options?
* @return Bitmap?
*/
@Suppress("DEPRECATION")
fun loadThumbnail(contentResolver: ContentResolver,
contentUri: Uri,
id: Long,
customSize: Size = Size(350, 350),
legacyKind: Int = MediaStore.Video.Thumbnails.MICRO_KIND,
options: BitmapFactory.Options? = null): Bitmap? {
return tryOrNull {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
contentResolver.loadThumbnail(contentUri, customSize, null)
} else {
MediaStore.Video.Thumbnails.getThumbnail(contentResolver, id, legacyKind,
options ?: BitmapFactory.Options())
}
}
}

private fun tryOrNull(function: () -> Bitmap): Bitmap? {
return try {
function()
} catch (e: Exception) {
null
}
}

fun loadPlaceHolders(viewHolderPlaceholderModifier: ImageModifier?, image: AppCompatImageView) {
if (viewHolderPlaceholderModifier != null) {
viewHolderPlaceholderModifier.resID = viewHolderPlaceholderModifier.resID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.core.database.getLongOrNull
import androidx.core.database.getStringOrNull
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.crazylegend.core.abstracts.AbstractAVM
import com.crazylegend.core.sorting.SortOrder
Expand All @@ -21,7 +22,7 @@ import kotlinx.coroutines.withContext
/**
* Created by crazy on 5/8/20 to long live and prosper !
*/
internal class ImagesVM(application: Application) : AbstractAVM(application) {
internal class ImagesVM(application: Application, stateHandle: SavedStateHandle) : AbstractAVM(application, stateHandle) {

private val imagesData = MutableLiveData<List<ImageModel>>()
val images: LiveData<List<ImageModel>> = imagesData
Expand All @@ -39,7 +40,7 @@ internal class ImagesVM(application: Application) : AbstractAVM(application) {
private fun initializeContentObserver(sortOrder: SortOrder) {
if (contentObserver == null) {
contentObserver = contentResolver.registerObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI) {
canLoad = true
setCanLoad()
loadImages(sortOrder)
}
}
Expand Down Expand Up @@ -108,7 +109,7 @@ internal class ImagesVM(application: Application) : AbstractAVM(application) {
}
}
}
canLoad = false
setCanNotLoad()
loadingIndicatorData.value = false
return images
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.core.database.getLongOrNull
import androidx.core.database.getStringOrNull
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.crazylegend.core.abstracts.AbstractAVM
import com.crazylegend.core.sorting.SortOrder
Expand All @@ -21,7 +22,7 @@ import kotlinx.coroutines.withContext
/**
* Created by crazy on 5/8/20 to long live and prosper !
*/
internal class VideosVM(application: Application) : AbstractAVM(application) {
internal class VideosVM(application: Application, stateHandle: SavedStateHandle) : AbstractAVM(application, stateHandle) {

private val videoData = MutableLiveData<List<VideoModel>>()
val videos: LiveData<List<VideoModel>> = videoData
Expand All @@ -39,7 +40,7 @@ internal class VideosVM(application: Application) : AbstractAVM(application) {
private fun initializeContentObserver(sortOrder: SortOrder) {
if (contentObserver == null) {
contentObserver = contentResolver.registerObserver(MediaStore.Video.Media.EXTERNAL_CONTENT_URI) {
canLoad = true
setCanLoad()
loadVideos(sortOrder)
}
}
Expand Down Expand Up @@ -115,7 +116,7 @@ internal class VideosVM(application: Application) : AbstractAVM(application) {
}
}
}
canLoad = false
setCanNotLoad()
loadingIndicatorData.value = false
return video
}
Expand Down

0 comments on commit e9a3b04

Please sign in to comment.