Bimba.git

ref: v3.3.0

app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/home/HomeFragment.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
103
104
105
106
// SPDX-FileCopyrightText: Adam Evyčędo
//
// SPDX-License-Identifier: GPL-3.0-or-later

package xyz.apiote.bimba.czwek.dashboard.ui.home

import android.os.Bundle
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.search.SearchView
import xyz.apiote.bimba.czwek.dashboard.MainActivity
import xyz.apiote.bimba.czwek.databinding.FragmentHomeBinding
import xyz.apiote.bimba.czwek.search.BimbaResultsAdapter

class HomeFragment : Fragment() {
	private var _binding: FragmentHomeBinding? = null
	private val binding get() = _binding!!

	private lateinit var adapter: BimbaResultsAdapter

	override fun onCreateView(
		inflater: LayoutInflater,
		container: ViewGroup?,
		savedInstanceState: Bundle?
	): View {
		_binding = FragmentHomeBinding.inflate(inflater, container, false)

		val homeViewModel =
			ViewModelProvider(this)[HomeViewModel::class.java]
		homeViewModel.queryables.observe(viewLifecycleOwner) {
			adapter.feedsSettings = homeViewModel.feedsSettings
			adapter.feeds = homeViewModel.feeds
			adapter.update(it)
		}

		val root = binding.root
		ViewCompat.setOnApplyWindowInsetsListener(root) { view, windowInsets ->
			val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
			view.layoutParams = (view.layoutParams as FrameLayout.LayoutParams).apply {
				topMargin = insets.top
			}
			WindowInsetsCompat.CONSUMED
		}

		val onBackPressedCallback = object :
			OnBackPressedCallback(binding.searchView.currentTransitionState == SearchView.TransitionState.SHOWN) {
			override fun handleOnBackPressed() {
				binding.searchView.hide()
			}
		}
		activity?.onBackPressedDispatcher?.addCallback(onBackPressedCallback)
		binding.searchView.addTransitionListener { _, _, newState ->
			onBackPressedCallback.isEnabled = when (newState) {
				SearchView.TransitionState.SHOWN -> true
				SearchView.TransitionState.HIDDEN -> false
				else -> false
			}
		}

		binding.searchBar.setNavigationOnClickListener {
			(context as MainActivity).onNavigationClicked()
		}
		binding.suggestionsRecycler.layoutManager = LinearLayoutManager(activity)
		adapter = BimbaResultsAdapter(layoutInflater, activity, listOf())
		binding.suggestionsRecycler.adapter = adapter

		binding.searchView.editText.addTextChangedListener(
			homeViewModel.SearchBarWatcher(requireContext())
		)
		binding.searchView.editText.setOnKeyListener { v, keyCode, event ->
			when (keyCode) {
				KeyEvent.KEYCODE_ENTER -> {
					if (event.action == KeyEvent.ACTION_UP) {
						(context as MainActivity).onSearchClicked((v as TextView).text)
						true
					} else {
						false
					}
				}

				else -> false
			}
		}

		binding.floatingActionButton.setOnClickListener {
			(context as MainActivity).onGpsClicked(this)
		}

		return binding.root
	}

	override fun onDestroyView() {
		super.onDestroyView()
		_binding = null
	}
}