172 lines
6.2 KiB
Kotlin
172 lines
6.2 KiB
Kotlin
package com.yaros.RadioUrl.ui
|
|
|
|
import android.os.Bundle
|
|
import android.util.Log
|
|
import android.view.LayoutInflater
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import android.widget.ImageView
|
|
import androidx.fragment.app.Fragment
|
|
import androidx.lifecycle.lifecycleScope
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
import com.yaros.RadioUrl.R
|
|
import com.yaros.RadioUrl.adapters.CategoryAdapter
|
|
import com.yaros.RadioUrl.adapters.NewsAdapter
|
|
import com.yaros.RadioUrl.adapters.RadioStationAdapter
|
|
import com.yaros.RadioUrl.adapters.RecommendedStationAdapter
|
|
import com.yaros.RadioUrl.core.supabase.SupabaseApiRepository
|
|
import com.yaros.RadioUrl.core.APIInterface.data.Category
|
|
import com.yaros.RadioUrl.core.APIInterface.data.NewsItem
|
|
import com.yaros.RadioUrl.data.Station
|
|
import kotlinx.coroutines.launch
|
|
import timber.log.Timber
|
|
|
|
class HomeFragment : Fragment() {
|
|
|
|
private lateinit var recommendedStationsRecyclerView: RecyclerView
|
|
private lateinit var categoriesRecyclerView: RecyclerView
|
|
private lateinit var newsRecyclerView: RecyclerView
|
|
private lateinit var recentlyPlayedRecyclerView: RecyclerView
|
|
|
|
private lateinit var recommendedStationAdapter: RecommendedStationAdapter
|
|
private lateinit var categoryAdapter: CategoryAdapter
|
|
private lateinit var newsAdapter: NewsAdapter
|
|
private lateinit var stationAdapter: RadioStationAdapter
|
|
|
|
private val apiRepository by lazy { SupabaseApiRepository() }
|
|
|
|
override fun onCreateView(
|
|
inflater: LayoutInflater,
|
|
container: ViewGroup?,
|
|
savedInstanceState: Bundle?
|
|
): View? {
|
|
return inflater.inflate(R.layout.fragment_home, container, false)
|
|
}
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
initViews(view)
|
|
setupAdapters()
|
|
loadDataFromAPI()
|
|
}
|
|
|
|
private fun initViews(view: View) {
|
|
recommendedStationsRecyclerView = view.findViewById(R.id.recommendedStationsRecyclerView)
|
|
categoriesRecyclerView = view.findViewById(R.id.categoriesRecyclerView)
|
|
newsRecyclerView = view.findViewById(R.id.newsRecyclerView)
|
|
recentlyPlayedRecyclerView = view.findViewById(R.id.recentlyPlayedRecyclerView)
|
|
}
|
|
|
|
private fun setupAdapters() {
|
|
setupRecommendedStationsRecyclerView()
|
|
setupCategoriesRecyclerView()
|
|
setupNewsRecyclerView()
|
|
setupRecentlyPlayedRecyclerView()
|
|
}
|
|
|
|
private fun loadDataFromAPI() {
|
|
lifecycleScope.launch {
|
|
fetchHomeData()
|
|
fetchCategories()
|
|
fetchRecentStations()
|
|
}
|
|
}
|
|
|
|
private fun setupRecommendedStationsRecyclerView() {
|
|
recommendedStationAdapter = RecommendedStationAdapter(
|
|
imageLoader = { imageView: ImageView, url: String ->
|
|
// TODO: Реализация загрузки изображения (Glide/Picasso)
|
|
},
|
|
onItemClick = { station: Station ->
|
|
// TODO: Обработка клика
|
|
}
|
|
)
|
|
recommendedStationsRecyclerView.apply {
|
|
layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
|
|
adapter = recommendedStationAdapter
|
|
}
|
|
}
|
|
|
|
private fun setupCategoriesRecyclerView() {
|
|
categoryAdapter = CategoryAdapter(
|
|
imageLoader = { imageView: ImageView, url: String ->
|
|
// TODO: Реализация загрузки изображения
|
|
},
|
|
onItemClick = { category: Category ->
|
|
// TODO: Обработка клика
|
|
}
|
|
)
|
|
categoriesRecyclerView.apply {
|
|
layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
|
|
adapter = categoryAdapter
|
|
}
|
|
}
|
|
|
|
private fun setupNewsRecyclerView() {
|
|
newsAdapter = NewsAdapter(
|
|
imageLoader = { imageView: ImageView, url: String ->
|
|
// TODO: Реализация загрузки изображения
|
|
},
|
|
onItemClick = { news: NewsItem ->
|
|
// TODO: Обработка клика
|
|
}
|
|
)
|
|
newsRecyclerView.apply {
|
|
layoutManager = LinearLayoutManager(requireContext())
|
|
adapter = newsAdapter
|
|
}
|
|
}
|
|
|
|
private fun setupRecentlyPlayedRecyclerView() {
|
|
stationAdapter = RadioStationAdapter(
|
|
imageLoader = { imageView: ImageView, url: String ->
|
|
// TODO: Реализация загрузки изображения
|
|
},
|
|
onItemClick = { station: Station ->
|
|
// TODO: Обработка клика
|
|
}
|
|
)
|
|
recentlyPlayedRecyclerView.apply {
|
|
layoutManager = LinearLayoutManager(requireContext())
|
|
adapter = stationAdapter
|
|
}
|
|
}
|
|
|
|
private suspend fun fetchHomeData() {
|
|
when (val result = apiRepository.getHomeData()) {
|
|
is SupabaseApiRepository.NetworkResult.Success -> {
|
|
result.data.news?.let(newsAdapter::submitList)
|
|
result.data.favorites?.let(recommendedStationAdapter::submitList)
|
|
}
|
|
is SupabaseApiRepository.NetworkResult.Error -> {
|
|
Timber.e("Home data error: ${result.message}")
|
|
// Показать состояние ошибки
|
|
}
|
|
}
|
|
}
|
|
|
|
private suspend fun fetchCategories() {
|
|
when (val result = apiRepository.getCategories()) {
|
|
is SupabaseApiRepository.NetworkResult.Success -> {
|
|
categoryAdapter.submitList(result.data)
|
|
}
|
|
is SupabaseApiRepository.NetworkResult.Error -> {
|
|
Timber.e("Categories error: ${result.message}")
|
|
}
|
|
}
|
|
}
|
|
|
|
private suspend fun fetchRecentStations() {
|
|
when (val result = apiRepository.getRecentRadio()) {
|
|
is SupabaseApiRepository.NetworkResult.Success -> {
|
|
stationAdapter.submitList(result.data)
|
|
}
|
|
is SupabaseApiRepository.NetworkResult.Error -> {
|
|
Timber.e("Recent stations error: ${result.message}")
|
|
}
|
|
}
|
|
}
|
|
}
|