This commit is contained in:
2026-02-05 13:47:39 +03:00
commit d4d78ba52b
295 changed files with 24155 additions and 0 deletions
@@ -0,0 +1,171 @@
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}")
}
}
}
}