-
Notifications
You must be signed in to change notification settings - Fork 0
/
EffectsAdapter.kt
117 lines (97 loc) · 4.44 KB
/
EffectsAdapter.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package com.banuba.sdk.example.effect_player_arcloud_example.arcloud
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.webkit.URLUtil
import android.widget.ImageView
import androidx.core.net.toUri
import androidx.core.view.isVisible
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.airbnb.lottie.LottieAnimationView
import com.banuba.sdk.example.effect_player_arcloud_example.R
import com.bumptech.glide.RequestManager
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.bumptech.glide.request.RequestOptions
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.view_effect.*
import java.io.File
class EffectsAdapter(
private val glideRequestManager: RequestManager
) : ListAdapter<EffectWrapper, EffectsAdapter.EffectViewHolder>(DIFF_CALLBACK) {
interface ActionCallback {
fun onEffectSelected(checkableEffect: EffectWrapper, position: Int)
fun onEffectStartDownloading(checkableEffect: EffectWrapper, position: Int)
}
var actionCallback: ActionCallback? = null
init {
setHasStableIds(true)
}
override fun getItemId(position: Int) = getItem(position).hashCode().toLong()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EffectViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.view_effect, parent, false)
return EffectViewHolder(view)
}
override fun onBindViewHolder(holder: EffectViewHolder, position: Int) {
holder.bind(getItem(position))
}
inner class EffectViewHolder(override val containerView: View) :
RecyclerView.ViewHolder(containerView), LayoutContainer {
fun bind(effectWrapper: EffectWrapper) {
containerView.setOnClickListener {
if (URLUtil.isNetworkUrl(effectWrapper.effect.uri)) {
actionCallback?.onEffectStartDownloading(effectWrapper, adapterPosition)
} else {
actionCallback?.onEffectSelected(effectWrapper, adapterPosition)
}
}
handleEffectPreview(effectImageView, effectWrapper)
handleDownloadingAnimation(downloadingAnimationView, effectDownloadBtn, effectWrapper)
}
private fun handleEffectPreview(imageView: ImageView, effectWrapper: EffectWrapper) {
val previewUri = if (URLUtil.isNetworkUrl(effectWrapper.effect.preview)) {
effectWrapper.effect.preview?.toUri()
} else {
effectWrapper.effect.preview?.let {
File(it).toUri()
}
} ?: Uri.EMPTY
if (previewUri == Uri.EMPTY) {
effectImageView.setImageResource(R.drawable.bg_effect_normal)
} else {
val requestOptions = RequestOptions().apply {
transform(CenterCrop(), CircleCrop())
error(R.drawable.bg_effect_error)
}
glideRequestManager.load(previewUri).apply(requestOptions).into(imageView)
}
}
private fun handleDownloadingAnimation(downloadingView: LottieAnimationView, downloadBtn: View, effectWrapper: EffectWrapper) {
if (URLUtil.isNetworkUrl(effectWrapper.effect.uri)) {
downloadingView.isVisible = effectWrapper.isDownloading
if (effectWrapper.isDownloading) {
downloadingView.playAnimation()
downloadBtn.visibility = View.GONE
} else {
downloadingView.cancelAnimation()
downloadBtn.visibility = View.VISIBLE
}
} else {
downloadBtn.visibility = View.GONE
downloadingView.visibility = View.GONE
downloadingView.cancelAnimation()
}
}
}
}
private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<EffectWrapper>() {
override fun areItemsTheSame(oldItem: EffectWrapper, newItem: EffectWrapper): Boolean {
return oldItem.effect.name == newItem.effect.name && oldItem.effect.id == newItem.effect.id
}
override fun areContentsTheSame(oldItem: EffectWrapper, newItem: EffectWrapper): Boolean {
return oldItem == newItem
}
}