Drone3D-Team/Drone3D

View on GitHub
app/src/main/java/ch/epfl/sdp/drone3d/ui/mission/MissionViewAdapter.kt

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
/*
 * Copyright (C) 2021  Drone3D-Team
 * The license can be found in LICENSE at root of the repository
 */

package ch.epfl.sdp.drone3d.ui.mission

import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import ch.epfl.sdp.drone3d.R
import ch.epfl.sdp.drone3d.model.mission.MappingMission
import ch.epfl.sdp.drone3d.model.mission.State

/**
 * Adapter for the Recycler view creating holders for the missions. [privateList] indicates whether
 * the adapter is used to show the private or the public missions.
 */
class MissionViewAdapter(private val privateList: Boolean) :
    ListAdapter<MappingMission, MissionViewAdapter.MissionViewHolder>(MissionDiff) {

    companion object {
        const val OWNER_ID_INTENT_PATH = "MVA_owner"
        const val PRIVATE_ID_INTENT_PATH = "MVA_private"
        const val SHARED_ID_INTENT_PATH = "MVA_shared"
        const val STRATEGY_INTENT_PATH = "MVA_strategy"
        const val AREA_INTENT_PATH = "MVA_area"
        const val FLIGHT_HEIGHT_INTENT_PATH = "MVA_flightHeight"
    }

    class MissionViewHolder(view: View, private val privateList: Boolean) :
        RecyclerView.ViewHolder(view) {

        private val textView: TextView = view.findViewById(R.id.mapping_selection_item_text)
        private val cardView: CardView = view.findViewById(R.id.mapping_selection_item_button)
        private var curMission: MappingMission? = null

        init {
            cardView.setOnClickListener {
                curMission?.let { mission ->
                    val intent = Intent(view.context, ItineraryShowActivity::class.java)

                    intent.putExtra(FLIGHT_HEIGHT_INTENT_PATH, mission.flightHeight)
                    intent.putExtra(AREA_INTENT_PATH, ArrayList(mission.area))
                    intent.putExtra(STRATEGY_INTENT_PATH, mission.strategy)
                    intent.putExtra(OWNER_ID_INTENT_PATH, mission.ownerUid)
                    intent.putExtra(PRIVATE_ID_INTENT_PATH, mission.privateId)
                    intent.putExtra(SHARED_ID_INTENT_PATH, mission.sharedId)

                    view.context.startActivity(intent)
                }
            }
        }

        // Bind holder with a mission -> set the name
        fun bind(mission: MappingMission) {
            curMission = mission
            textView.text = mission.name

            if (mission.state == State.PRIVATE_AND_SHARED) {
                if(privateList) {
                    textView.setCompoundDrawablesWithIntrinsicBounds(
                        R.drawable.ic_shared_private,
                        0,
                        0,
                        0
                    )
                }
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MissionViewHolder {
        // Create a new view, which defines the UI of the list item
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.mission_selection_item, parent, false)

        return MissionViewHolder(view, privateList)
    }

    override fun onBindViewHolder(holder: MissionViewHolder, position: Int) {
        holder.bind(getItem(position))
    }

    object MissionDiff : DiffUtil.ItemCallback<MappingMission>() {

        override fun areItemsTheSame(oldItem: MappingMission, newItem: MappingMission): Boolean {
            return oldItem == newItem
        }

        override fun areContentsTheSame(oldItem: MappingMission, newItem: MappingMission): Boolean {
            return oldItem.name == newItem.name && oldItem.state == newItem.state
        }
    }
}