Welcome to mirror list, hosted at ThFree Co, Russian Federation.

TreeItemsAdapter.kt « view « ocreader « schaal « email « java « main « src « app - github.com/schaal/ocreader.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 8d78e78a0e7af2e682be581c9a31543607caf7ab (plain)
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Copyright © 2019. Daniel Schaal <daniel@schaal.email>
 *
 * This file is part of ocreader.
 *
 * ocreader is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * ocreader is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */
package email.schaal.ocreader.view

import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import email.schaal.ocreader.R
import email.schaal.ocreader.database.model.AllUnreadFolder
import email.schaal.ocreader.database.model.Feed
import email.schaal.ocreader.database.model.Item
import email.schaal.ocreader.database.model.TreeItem
import email.schaal.ocreader.databinding.ListDividerBinding
import email.schaal.ocreader.databinding.ListFolderBinding
import io.realm.Realm

class TreeItemsAdapter(context: Context, private var treeItems: List<TreeItem>?, private val clickListener: TreeItemClickListener?, defaultTopFolders: Array<TreeItem>? = null) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    private val topFolders: List<TreeItem>
    private var selectedTreeItemId = AllUnreadFolder.ID

    fun setSelectedTreeItemId(id: Long) {
        selectedTreeItemId = id
        notifyDataSetChanged()
    }

    private class DividerTreeItem(private val name: String) : TreeItem {
        override fun treeItemId(): Long {
            return 0
        }

        override fun treeItemName(): String {
            return name
        }

        override fun getIcon(): Int {
            return 0
        }

        override fun getCount(realm: Realm): Int {
            return 0
        }

        override fun getFeeds(realm: Realm, onlyUnread: Boolean): List<Feed> {
            return emptyList()
        }

        override fun getItems(realm: Realm, onlyUnread: Boolean): List<Item> {
            return emptyList()
        }

    }

    fun updateTreeItems(treeItems: List<TreeItem>?) {
        this.treeItems = treeItems
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return if (viewType == R.id.viewtype_item) {
            TreeItemViewHolder(ListFolderBinding.inflate(LayoutInflater.from(parent.context), parent, false), clickListener)
        } else DividerViewHolder(ListDividerBinding.inflate(LayoutInflater.from(parent.context), parent, false))
    }

    override fun getItemViewType(position: Int): Int {
        val treeItem = getTreeItem(position)
        return if (treeItem is DividerTreeItem) R.id.viewtype_divider else R.id.viewtype_item
    }

    private fun getTreeItem(position: Int): TreeItem? {
        return if(position >= topFolders.size) {
            treeItems?.get(position - topFolders.size)
        } else {
            topFolders[position]
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val treeItem = getTreeItem(position) ?: return

        when (holder) {
            is TreeItemViewHolder -> holder.bind(treeItem, selectedTreeItemId)
            is DividerViewHolder -> holder.bind(treeItem)
        }
    }

    override fun getItemCount(): Int {
        return topFolders.size + (treeItems?.size ?: 0)
    }

    interface TreeItemClickListener {
        fun onTreeItemClick(treeItem: TreeItem)
    }

    private class DividerViewHolder internal constructor(private val binding: ListDividerBinding) : RecyclerView.ViewHolder(binding.root) {
        fun bind(treeItem: TreeItem) {
            binding.textViewDivider.text = treeItem.treeItemName()
        }
    }

    class TreeItemViewHolder internal constructor(private val binding: ListFolderBinding, private val clickListener: TreeItemClickListener?) : RecyclerView.ViewHolder(binding.root) {
        fun bind(treeItem: TreeItem?, selectedTreeItemId: Long) {
            if (treeItem != null) {
                itemView.isSelected = treeItem.treeItemId() == selectedTreeItemId
                itemView.setOnClickListener { clickListener?.onTreeItemClick(treeItem) }
                binding.imageviewFavicon.setImageResource(treeItem.getIcon())
                binding.textViewTitle.text = treeItem.treeItemName()
            }
        }
    }

    init {
        topFolders = if(defaultTopFolders != null) listOf(*defaultTopFolders, DividerTreeItem(context.getString(R.string.folder))) else emptyList()
        setHasStableIds(true)
    }
}