Bimba.git

ref: ed2f67b1ce632a0815b71d2dead82c8b274d8c25

app/src/main/java/xyz/apiote/bimba/czwek/settings/feeds/FeedInfos.kt


  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
package xyz.apiote.bimba.czwek.settings.feeds

import android.annotation.SuppressLint
import android.content.Context
import android.content.Context.MODE_PRIVATE
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.edit
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.android.material.materialswitch.MaterialSwitch
import xyz.apiote.bimba.czwek.R
import xyz.apiote.bimba.czwek.api.FeedInfoV1


class BimbaFeedInfoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
	val root: View = itemView.findViewById(R.id.feed)
	val switch: MaterialSwitch = itemView.findViewById(R.id.feed_switch)
	val name: TextView = itemView.findViewById(R.id.feed_name)

	companion object {
		fun bind(
			feed: FeedInfoV1,
			context: Context,
			holder: BimbaFeedInfoViewHolder?,
			onClickListener: (FeedInfoV1) -> Unit
		) {
			val shp = context.getSharedPreferences("shp", MODE_PRIVATE)
			val host = shp.getString("host", "bimba.apiote.xyz")!!
			val enabledFeeds =
				shp.getString("${host}_feeds", "")!!.split(",").associateWith { }.toMutableMap()

			holder?.root?.setOnClickListener {
				onClickListener(feed)
			}
			holder?.name?.text = feed.name
			holder?.switch?.apply {
				isChecked = feed.id in enabledFeeds
				setOnCheckedChangeListener { _, isChecked ->
					if (isChecked) {
						enabledFeeds[feed.id] = Unit
					} else {
						enabledFeeds.remove(feed.id)
					}
					shp.edit(true) {
						putString(
							"${host}_feeds",
							enabledFeeds.map { it.key }.filter { it != "" }.joinToString(separator = ",")
						)
					}
				}
			}
		}
	}
}

class BimbaFeedInfoAdapter(
	private val inflater: LayoutInflater,
	private var feeds: List<FeedInfoV1>,
	private val context: Context,
	private val onClickListener: ((FeedInfoV1) -> Unit)
) :
	RecyclerView.Adapter<BimbaFeedInfoViewHolder>() {
	override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BimbaFeedInfoViewHolder {
		val rowView = inflater.inflate(R.layout.feedinfo, parent, false)
		return BimbaFeedInfoViewHolder(rowView)
	}

	override fun onBindViewHolder(holder: BimbaFeedInfoViewHolder, position: Int) {
		BimbaFeedInfoViewHolder.bind(feeds[position], context, holder, onClickListener)
	}

	override fun getItemCount(): Int = feeds.size

	@SuppressLint("NotifyDataSetChanged") // todo [3.1] DiffUtil
	fun update(items: List<FeedInfoV1>) {
		feeds = items
		notifyDataSetChanged()
	}
}

class FeedBottomSheet(private var feed: FeedInfoV1) : BottomSheetDialogFragment() {
	companion object {
		const val TAG = "DepartureBottomSheet"
	}

	override fun onCreateView(
		inflater: LayoutInflater,
		container: ViewGroup?,
		savedInstanceState: Bundle?
	): View {
		val content = inflater.inflate(R.layout.feed_bottom_sheet, container, false)
		content.findViewById<TextView>(R.id.title).text = feed.name
		content.findViewById<TextView>(R.id.description).text = feed.description
		content.findViewById<TextView>(R.id.attribution).text = feed.attribution
		content.findViewById<TextView>(R.id.update_time).text = feed.formatDate()
		return content
	}
}