Support for changing image index in CreatorActivity.kt

This commit is contained in:
Oupson 2021-02-06 21:14:32 +01:00
parent c8efcc3079
commit e7b368a013
2 changed files with 32 additions and 17 deletions

View File

@ -12,6 +12,7 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -33,7 +34,6 @@ import java.io.OutputStream
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
class CreatorActivity : AppCompatActivity() { class CreatorActivity : AppCompatActivity() {
companion object { companion object {
private const val PICK_IMAGE = 1 private const val PICK_IMAGE = 1
@ -41,10 +41,12 @@ class CreatorActivity : AppCompatActivity() {
private const val TAG = "CreatorActivity" private const val TAG = "CreatorActivity"
} }
private var items: ArrayList<Pair<Uri, Int>> = ArrayList() private var items: ArrayList<Triple<Uri, Int, Long>> = ArrayList()
private var adapter: ImageAdapter? = null private var adapter: ImageAdapter? = null
private var firstFrameInAnim = true private var firstFrameInAnim = true
private var nextImageId : Long= 0
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -62,9 +64,15 @@ class CreatorActivity : AppCompatActivity() {
} }
adapter = ImageAdapter(this, items) adapter = ImageAdapter(this, items)
adapter?.setHasStableIds(true)
imageRecyclerView.layoutManager = LinearLayoutManager(this) imageRecyclerView.layoutManager = LinearLayoutManager(this)
imageRecyclerView.setHasFixedSize(true) imageRecyclerView.setHasFixedSize(true)
imageRecyclerView.itemAnimator = object : DefaultItemAnimator() {
override fun canReuseUpdatedViewHolder(viewHolder: RecyclerView.ViewHolder): Boolean {
return true
}
}
imageRecyclerView.setItemViewCacheSize(20) imageRecyclerView.setItemViewCacheSize(20)
if (adapter != null) if (adapter != null)
ItemTouchHelper(SwipeToDeleteCallback(adapter!!)).attachToRecyclerView(imageRecyclerView) ItemTouchHelper(SwipeToDeleteCallback(adapter!!)).attachToRecyclerView(imageRecyclerView)
@ -73,7 +81,7 @@ class CreatorActivity : AppCompatActivity() {
DelayInputDialog(object : DelayInputDialog.InputSenderDialogListener { DelayInputDialog(object : DelayInputDialog.InputSenderDialogListener {
override fun onOK(number: Int?) { override fun onOK(number: Int?) {
if (number != null) { if (number != null) {
items[position] = Pair(items[position].first, number) items[position] = Triple(items[position].first, number, items[position].third)
adapter?.notifyDataSetChanged() adapter?.notifyDataSetChanged()
} }
} }
@ -152,7 +160,7 @@ class CreatorActivity : AppCompatActivity() {
Intent.EXTRA_STREAM, uri Intent.EXTRA_STREAM, uri
) )
clipData = ClipData.newUri(contentResolver, "Generated APNG", uri) clipData = ClipData.newUri(contentResolver, getString(R.string.share), uri)
type = "image/png" type = "image/png"
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
} }
@ -190,7 +198,7 @@ class CreatorActivity : AppCompatActivity() {
override fun onOK(number: Int?) { override fun onOK(number: Int?) {
if (number != null) { if (number != null) {
for (i in 0 until items.size) { for (i in 0 until items.size) {
items[i] = Pair(items[i].first, number) items[i] = Triple(items[i].first, number, items[i].third)
} }
adapter?.notifyDataSetChanged() adapter?.notifyDataSetChanged()
} }
@ -292,11 +300,11 @@ class CreatorActivity : AppCompatActivity() {
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (data?.clipData != null) { if (data?.clipData != null) {
for (i in 0 until data.clipData!!.itemCount) { for (i in 0 until data.clipData!!.itemCount) {
items.add(Pair(data.clipData!!.getItemAt(i).uri, 1000)) items.add(Triple(data.clipData!!.getItemAt(i).uri, 1000, nextImageId++))
} }
adapter?.notifyDataSetChanged() adapter?.notifyDataSetChanged()
} else if (data?.data != null) { } else if (data?.data != null) {
items.add(Pair(data.data!!, 1000)) items.add(Triple(data.data!!, 1000, nextImageId++))
adapter?.notifyDataSetChanged() adapter?.notifyDataSetChanged()
} }
} }
@ -334,15 +342,22 @@ class CreatorActivity : AppCompatActivity() {
Log.v(TAG, "Deleted images dir : $deleteResult") Log.v(TAG, "Deleted images dir : $deleteResult")
} }
// TODO MOVE TOP AND BOTTOM
inner class SwipeToDeleteCallback(private val adapter: ImageAdapter) : inner class SwipeToDeleteCallback(private val adapter: ImageAdapter) :
ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) { ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
override fun onMove( override fun onMove(
recyclerView: RecyclerView, recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder, viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder target: RecyclerView.ViewHolder
): Boolean { ): Boolean {
return false val fromPos = viewHolder.adapterPosition
val toPos = target.adapterPosition
Collections.swap(items, fromPos, toPos)
adapter.notifyItemMoved(fromPos, toPos)
adapter.notifyItemChanged(fromPos)
adapter.notifyItemChanged(toPos)
return true
} }
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
@ -353,6 +368,4 @@ class CreatorActivity : AppCompatActivity() {
override fun isItemViewSwipeEnabled() = true override fun isItemViewSwipeEnabled() = true
} }
} }

View File

@ -16,7 +16,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import oupson.apngcreator.R import oupson.apngcreator.R
class ImageAdapter(private val context : Context, private val list : List<Pair<Uri, Int>>) : RecyclerView.Adapter<ImageAdapter.ImageHolder>() { class ImageAdapter(private val context : Context, private val list : List<Triple<Uri, Int, Long>>) : RecyclerView.Adapter<ImageAdapter.ImageHolder>() {
inner class ImageHolder(view : View) : RecyclerView.ViewHolder(view) { inner class ImageHolder(view : View) : RecyclerView.ViewHolder(view) {
val imageView : ImageView? = view.findViewById(R.id.listImageView) val imageView : ImageView? = view.findViewById(R.id.listImageView)
val textDelay : TextView? = view.findViewById(R.id.textDelay) val textDelay : TextView? = view.findViewById(R.id.textDelay)
@ -34,13 +34,14 @@ class ImageAdapter(private val context : Context, private val list : List<Pair<U
override fun onBindViewHolder(holder: ImageHolder, position: Int) { override fun onBindViewHolder(holder: ImageHolder, position: Int) {
holder.itemView.setOnClickListener { clickListener?.invoke(position) } holder.itemView.setOnClickListener { clickListener?.invoke(position) }
holder.textDelay?.text = String.format("%dms", list[position].second) holder.textDelay?.text = String.format("%dms", list[position].second)
holder.positionTextView?.text = String.format("# %d", position + 1) holder.positionTextView?.text = String.format("# %03d", holder.adapterPosition + 1)
holder.nameTextView?.text = list[position].first.path?.substringAfterLast("/") holder.nameTextView?.text = list[position].first.path?.substringAfterLast("/")
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
val inputStream = context.contentResolver.openInputStream(list[position].first) val inputStream = context.contentResolver.openInputStream(list[position].first)
val btm = BitmapFactory.decodeStream(inputStream, null, BitmapFactory.Options().apply { val btm =
inPreferredConfig = Bitmap.Config.RGB_565 BitmapFactory.decodeStream(inputStream, null, BitmapFactory.Options().apply {
}) inPreferredConfig = Bitmap.Config.RGB_565
})
inputStream?.close() inputStream?.close()
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
holder.imageView?.setImageBitmap(btm) holder.imageView?.setImageBitmap(btm)
@ -50,4 +51,5 @@ class ImageAdapter(private val context : Context, private val list : List<Pair<U
override fun getItemCount(): Int = list.count() override fun getItemCount(): Int = list.count()
override fun getItemId(position: Int): Long = list[position].third
} }