android: Refactor DriverAdapter to use AbstractSingleSelectionList
This commit is contained in:
		@@ -7,65 +7,34 @@ import android.text.TextUtils
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import androidx.recyclerview.widget.AsyncDifferConfig
 | 
			
		||||
import androidx.recyclerview.widget.DiffUtil
 | 
			
		||||
import androidx.recyclerview.widget.ListAdapter
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import org.yuzu.yuzu_emu.R
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.CardDriverOptionBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.model.Driver
 | 
			
		||||
import org.yuzu.yuzu_emu.model.DriverViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.GpuDriverMetadata
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
 | 
			
		||||
class DriverAdapter(private val driverViewModel: DriverViewModel) :
 | 
			
		||||
    ListAdapter<Pair<String, GpuDriverMetadata>, DriverAdapter.DriverViewHolder>(
 | 
			
		||||
        AsyncDifferConfig.Builder(DiffCallback()).build()
 | 
			
		||||
    AbstractSingleSelectionList<Driver, DriverAdapter.DriverViewHolder>(
 | 
			
		||||
        driverViewModel.driverList.value
 | 
			
		||||
    ) {
 | 
			
		||||
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DriverViewHolder {
 | 
			
		||||
        val binding =
 | 
			
		||||
            CardDriverOptionBinding.inflate(LayoutInflater.from(parent.context), parent, false)
 | 
			
		||||
        return DriverViewHolder(binding)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getItemCount(): Int = currentList.size
 | 
			
		||||
 | 
			
		||||
    override fun onBindViewHolder(holder: DriverViewHolder, position: Int) =
 | 
			
		||||
        holder.bind(currentList[position])
 | 
			
		||||
 | 
			
		||||
    private fun onSelectDriver(position: Int) {
 | 
			
		||||
        driverViewModel.setSelectedDriverIndex(position)
 | 
			
		||||
        notifyItemChanged(driverViewModel.previouslySelectedDriver)
 | 
			
		||||
        notifyItemChanged(driverViewModel.selectedDriver)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onDeleteDriver(driverData: Pair<String, GpuDriverMetadata>, position: Int) {
 | 
			
		||||
        if (driverViewModel.selectedDriver > position) {
 | 
			
		||||
            driverViewModel.setSelectedDriverIndex(driverViewModel.selectedDriver - 1)
 | 
			
		||||
        }
 | 
			
		||||
        if (GpuDriverHelper.customDriverSettingData == driverData.second) {
 | 
			
		||||
            driverViewModel.setSelectedDriverIndex(0)
 | 
			
		||||
        }
 | 
			
		||||
        driverViewModel.driversToDelete.add(driverData.first)
 | 
			
		||||
        driverViewModel.removeDriver(driverData)
 | 
			
		||||
        notifyItemRemoved(position)
 | 
			
		||||
        notifyItemChanged(driverViewModel.selectedDriver)
 | 
			
		||||
        CardDriverOptionBinding.inflate(LayoutInflater.from(parent.context), parent, false)
 | 
			
		||||
            .also { return DriverViewHolder(it) }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inner class DriverViewHolder(val binding: CardDriverOptionBinding) :
 | 
			
		||||
        RecyclerView.ViewHolder(binding.root) {
 | 
			
		||||
        private lateinit var driverData: Pair<String, GpuDriverMetadata>
 | 
			
		||||
 | 
			
		||||
        fun bind(driverData: Pair<String, GpuDriverMetadata>) {
 | 
			
		||||
            this.driverData = driverData
 | 
			
		||||
            val driver = driverData.second
 | 
			
		||||
 | 
			
		||||
        AbstractViewHolder<Driver>(binding) {
 | 
			
		||||
        override fun bind(model: Driver) {
 | 
			
		||||
            binding.apply {
 | 
			
		||||
                radioButton.isChecked = driverViewModel.selectedDriver == bindingAdapterPosition
 | 
			
		||||
                radioButton.isChecked = model.selected
 | 
			
		||||
                root.setOnClickListener {
 | 
			
		||||
                    onSelectDriver(bindingAdapterPosition)
 | 
			
		||||
                    selectItem(bindingAdapterPosition) { driverViewModel.onDriverSelected(it) }
 | 
			
		||||
                }
 | 
			
		||||
                buttonDelete.setOnClickListener {
 | 
			
		||||
                    onDeleteDriver(driverData, bindingAdapterPosition)
 | 
			
		||||
                    removeSelectableItem(
 | 
			
		||||
                        bindingAdapterPosition
 | 
			
		||||
                    ) { removedPosition: Int, selectedPosition: Int ->
 | 
			
		||||
                        driverViewModel.onDriverRemoved(removedPosition, selectedPosition)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Delay marquee by 3s
 | 
			
		||||
@@ -80,38 +49,19 @@ class DriverAdapter(private val driverViewModel: DriverViewModel) :
 | 
			
		||||
                    },
 | 
			
		||||
                    3000
 | 
			
		||||
                )
 | 
			
		||||
                if (driver.name == null) {
 | 
			
		||||
                    title.setText(R.string.system_gpu_driver)
 | 
			
		||||
                    description.text = ""
 | 
			
		||||
                    version.text = ""
 | 
			
		||||
                    version.visibility = View.GONE
 | 
			
		||||
                    description.visibility = View.GONE
 | 
			
		||||
                    buttonDelete.visibility = View.GONE
 | 
			
		||||
                } else {
 | 
			
		||||
                    title.text = driver.name
 | 
			
		||||
                    version.text = driver.version
 | 
			
		||||
                    description.text = driver.description
 | 
			
		||||
                title.text = model.title
 | 
			
		||||
                version.text = model.version
 | 
			
		||||
                description.text = model.description
 | 
			
		||||
                if (model.description.isNotEmpty()) {
 | 
			
		||||
                    version.visibility = View.VISIBLE
 | 
			
		||||
                    description.visibility = View.VISIBLE
 | 
			
		||||
                    buttonDelete.visibility = View.VISIBLE
 | 
			
		||||
                } else {
 | 
			
		||||
                    version.visibility = View.GONE
 | 
			
		||||
                    description.visibility = View.GONE
 | 
			
		||||
                    buttonDelete.visibility = View.GONE
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class DiffCallback : DiffUtil.ItemCallback<Pair<String, GpuDriverMetadata>>() {
 | 
			
		||||
        override fun areItemsTheSame(
 | 
			
		||||
            oldItem: Pair<String, GpuDriverMetadata>,
 | 
			
		||||
            newItem: Pair<String, GpuDriverMetadata>
 | 
			
		||||
        ): Boolean {
 | 
			
		||||
            return oldItem.first == newItem.first
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        override fun areContentsTheSame(
 | 
			
		||||
            oldItem: Pair<String, GpuDriverMetadata>,
 | 
			
		||||
            newItem: Pair<String, GpuDriverMetadata>
 | 
			
		||||
        ): Boolean {
 | 
			
		||||
            return oldItem.second == newItem.second
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user