coding-blocks/CBOnlineApp

View on GitHub
app/src/main/java/com/codingblocks/cbonlineapp/library/LibraryListAdapter.kt

Summary

Maintainability
D
2 days
Test Coverage
package com.codingblocks.cbonlineapp.library

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.selection.ItemDetailsLookup
import androidx.recyclerview.selection.SelectionTracker
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.codingblocks.cbonlineapp.R
import com.codingblocks.cbonlineapp.database.models.BaseModel
import com.codingblocks.cbonlineapp.database.models.BookmarkModel
import com.codingblocks.cbonlineapp.database.models.ContentLecture
import com.codingblocks.cbonlineapp.database.models.LibraryTypes
import com.codingblocks.cbonlineapp.database.models.NotesModel
import com.codingblocks.cbonlineapp.util.extensions.getDurationBreakdown
import com.codingblocks.cbonlineapp.util.extensions.sameAndEqual
import com.codingblocks.cbonlineapp.util.extensions.secToTime
import com.codingblocks.cbonlineapp.util.extensions.timeAgo
import kotlinx.android.synthetic.main.item_bookmark.view.bookmarkSubtitleTv
import kotlinx.android.synthetic.main.item_bookmark.view.bookmarkTimeTv
import kotlinx.android.synthetic.main.item_bookmark.view.bookmarkTitleTv
import kotlinx.android.synthetic.main.item_download.view.downloadArwBtn
import kotlinx.android.synthetic.main.item_download.view.downloadSubtitleTv
import kotlinx.android.synthetic.main.item_download.view.downloadTitleTv
import kotlinx.android.synthetic.main.item_note.view.*
import kotlinx.android.synthetic.main.item_note.view.selectionImg
import kotlinx.android.synthetic.main.item_note_player.view.*

class LibraryListAdapter(val type: LibraryTypes) : ListAdapter<BaseModel, RecyclerView.ViewHolder>(DiffCallback()) {

    var onDeleteClick: DeleteNoteClickListener? = null
    var onEditClick: EditNoteClickListener? = null
    var onItemClick: ItemClickListener? = null
    var tracker: SelectionTracker<String>? = null

    init {
        setHasStableIds(true)
    }

    override fun getItemId(position: Int): Long {
        return when (getItem(position)) {
            is NotesModel -> (getItem(position) as NotesModel).nttUid.toLong()
            is BookmarkModel -> (getItem(position) as BookmarkModel).bookmarkUid.toLong()
            is ContentLecture -> (getItem(position) as ContentLecture).lectureUid.toLong()
            else -> position.toLong()
        }
    }

    override fun getItemViewType(position: Int): Int {
        return position
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        return when (type) {
            LibraryTypes.NOTESVIDEO -> NoteVideoViewHolder(
                inflater.inflate(R.layout.item_note_player, parent, false)
            )
            LibraryTypes.NOTE -> NoteViewHolder(
                inflater.inflate(R.layout.item_note, parent, false)
            )
            LibraryTypes.BOOKMARK -> BookmarkViewHolder(
                inflater.inflate(R.layout.item_bookmark, parent, false)
            )
            LibraryTypes.DOWNLOADS -> DownloadViewHolder(
                inflater.inflate(R.layout.item_download, parent, false)
            )
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (type) {
            LibraryTypes.NOTESVIDEO -> {
                (holder as NoteVideoViewHolder).apply {
                    bind(getItem(position) as NotesModel)
                    deleteClickListener = onDeleteClick
                    editClickListener = onEditClick
                    itemClickListener = onItemClick
                }
            }
            LibraryTypes.NOTE -> {
                (holder as NoteViewHolder).apply {
                    tracker?.let {
                        val item = getItem(position) as NotesModel
                        bind(item, it.isSelected(item.nttUid))
                        itemClickListener = onItemClick
                    }
                }
            }
            LibraryTypes.BOOKMARK -> {
                (holder as BookmarkViewHolder).apply {
                    tracker?.let {
                        val item = getItem(position) as BookmarkModel
                        bind(item, it.isSelected(item.bookmarkUid))
                        itemClickListener = onItemClick
                    }
                }
            }

            LibraryTypes.DOWNLOADS -> {
                (holder as DownloadViewHolder).apply {
                    tracker?.let {
                        val item = getItem(position) as ContentLecture
                        bind(item, it.isSelected(item.lectureId))
                        itemClickListener = onItemClick
                    }
                }
            }
        }
    }

    inner class NoteViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var itemClickListener: ItemClickListener? = null

        fun bind(item: NotesModel, isActivated: Boolean = false) = with(itemView) {

            noteTitleTv.text = item.contentTitle
            noteDescriptionTv.text = item.text
            noteTimeTv.text = item.createdAt.timeAgo()
            selectionImg.isVisible = isActivated
            noteTimeTv.isVisible = !isActivated
            editNote.isVisible = !isActivated
            editNote.setOnClickListener {
                itemClickListener?.onClick(item)
            }
        }

        fun getItemDetails(): ItemDetailsLookup.ItemDetails<String> =
            object : ItemDetailsLookup.ItemDetails<String>() {
                override fun getPosition(): Int = adapterPosition
                override fun getSelectionKey(): String? = (getItem(adapterPosition) as NotesModel).nttUid
            }
    }

    class NoteVideoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var deleteClickListener: DeleteNoteClickListener? = null
        var editClickListener: EditNoteClickListener? = null
        var itemClickListener: ItemClickListener? = null

        fun bind(item: NotesModel) = with(itemView) {
            //            noteVTitleTv.text = item.contentTitle
            noteVDescriptionTv.text = item.text
            noteVTimeTv.text = item.createdAt.timeAgo()
            noteVCreateTv.text = item.duration.secToTime()
            noteVEditImg.setOnClickListener {
                editClickListener?.onClick(item)
            }
            setOnClickListener {
                itemClickListener?.onClick(item)
            }
        }
    }

    inner class BookmarkViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var itemClickListener: ItemClickListener? = null

        fun bind(item: BookmarkModel, isActivated: Boolean = false) = with(itemView) {

            bookmarkTitleTv.text = item.sectionName
            bookmarkSubtitleTv.text = item.contentName
            bookmarkTimeTv.apply {
                text = item.createdAt.timeAgo()
                isVisible = !isActivated
            }
            selectionImg.isVisible = isActivated

            setOnClickListener {
                itemClickListener?.onClick(item)
            }
        }

        fun getItemDetails(): ItemDetailsLookup.ItemDetails<String> =
            object : ItemDetailsLookup.ItemDetails<String>() {
                override fun getPosition(): Int = adapterPosition
                override fun getSelectionKey(): String? = (getItem(adapterPosition) as BookmarkModel).bookmarkUid
            }
    }

    inner class DownloadViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var itemClickListener: ItemClickListener? = null

        fun bind(item: ContentLecture, isActivated: Boolean = false) = with(itemView) {

            downloadTitleTv.text = item.lectureName
            downloadSubtitleTv.text = "Duration ${item.lectureDuration.getDurationBreakdown()}"
            downloadArwBtn.apply {
                isVisible = isActivated
                isVisible = !isActivated
            }
            selectionImg.isVisible = isActivated

            setOnClickListener {
                itemClickListener?.onClick(item)
            }
        }

        fun getItemDetails(): ItemDetailsLookup.ItemDetails<String> =
            object : ItemDetailsLookup.ItemDetails<String>() {
                override fun getPosition(): Int = adapterPosition
                override fun getSelectionKey(): String? = (getItem(adapterPosition) as ContentLecture).lectureId
            }
    }
}

class DiffCallback : DiffUtil.ItemCallback<BaseModel>() {
    override fun areItemsTheSame(oldItem: BaseModel, newItem: BaseModel):
        Boolean = when (oldItem) {
            is NotesModel -> if (newItem is NotesModel) oldItem.nttUid == newItem.nttUid else false
            is BookmarkModel -> if (newItem is BookmarkModel) oldItem.bookmarkUid == newItem.bookmarkUid else false
            is ContentLecture -> if (newItem is ContentLecture) oldItem.lectureId == newItem.lectureId else false
            else -> false
        }

    override fun areContentsTheSame(oldItem: BaseModel, newItem: BaseModel): Boolean {
        return oldItem.sameAndEqual(newItem)
    }
}

interface DeleteNoteClickListener {
    fun onClick(noteId: String, position: Int)
}

interface EditNoteClickListener {
    fun onClick(note: NotesModel)
}

interface ItemClickListener {
    fun onClick(item: BaseModel)
}